シューティングゲームの基本形
―準備中―
Cでシューティングゲームを作るときの基本形
BASICでは、BASIC超基本(10語でシューティングゲーム)を作るとほぼ同じです。
上がTurboC用のソース、下はLSIC86用のソース
ほとんど同じですが、LSIC86にはPCにwaitをかけるdelayという関数がないので、delay関数を自分で作成しています。
といってもforループで時間稼ぎしていrだけですが。
LSIC86にはwindow関数もないのでコメンアウトしてます。
表示位置を設定するlocate関数はどちらもエスケープシーケンスを使った方法で自作しています。
TurboCはgotoxyという関数があるので、そちらを使ったほうがいいでしょう。
敵の初期化のためのintteki()関数で乱数を使っていますが、TurboCとLSIC86で乱数発生の仕方
が異なります。
/*PRACT1V.C ver0.1 (PC98、PC/AT汎用)*/
/*リアルタイムキー入力、キャラクタの移動、当たり判定等の基本実験プログラム*/
/*キー入力でキャラクタを動かす 1左 3右 2 爆弾 8 Delay設定 9で終了*/
/*CODED by Tsuyoshi Kasai*/
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<dos.h>
char c;
int x;
int tekix,tekiy, tekiv;
int bombx,bomby,fbomb; /* fbomb 0 爆弾未投下 1 爆弾投下中*/
int wait;
void atari(void);
void bomb(void);
void initteki(void);
void teki(void);
void init(void);
void keyin(void);
void locate(int, int);
void settei();
main()
{
x=14; wait=500;
init();
initteki();
fbomb=0;
locate(1,1); printf("PRACT1 Cによる実験プログラム(PC98、PC/AT汎用)coded by Tsuyoshi Kasai");
locate(1,2); printf("Key 1 左 2 爆弾投下 3 右 8 delay(初期値500) 9 終了");
for (;;){
if (kbhit()){
c=getch();
if (c == '9') break;
if (c == '8') settei();
keyin(); }
if (fbomb==1) bomb();
delay(wait); /*コンピュータにwaitをかける*/
teki();
}
printf("\x01b[>5l"); /*カーソル表示*/
}
void init() /*初期化*/
{
window(1,1,80,24);
printf("\x01b[2J"); /*画面クリア*/
printf("\x01b[>5h");
locate(1,5);
printf("================================");
locate(x,5);
printf("=<T>=");
}
void keyin() /*入力キー判定*/
{
int i;
if (c == '1') x=x-1;
if (c == '3') x=x+1;
if (c == '2' && fbomb==0) {bombx=x+2; bomby=5; fbomb=1;}
if (x <1 ) x=1;
if (x >27) x=27;
locate(x,5);
printf("=<T>=");
}
void bomb()
{
locate(bombx,bomby); printf(" ");
bomby=bomby+1;
if (bomby>17) {fbomb=0; return;}
locate(bombx,bomby); printf("U");
if (bombx == tekix && bomby == tekiy) atari();
}
void teki()
{
locate(tekix,tekiy); printf(" ");
tekix=tekix+tekiv;
if (tekix<1 || tekix > 30) initteki();
locate(tekix,tekiy); printf("X");
if ((tekix == bombx && tekiy == bomby) && fbomb==1) atari();
}
void atari() /*当たり処理*/
{ int i;
locate(bombx,bomby); printf("*");
delay(3000);
locate(bombx,bomby); printf(" ");
fbomb=0;
initteki();
}
void initteki()
{
int r;
r=random(2);
if (r == 0) {tekix=1; tekiv=1;}
else {tekix=30; tekiv=-1;}
tekiy=random(10)+6;
}
void locate (tx,ty)
{
printf("\x1b[%d;%dH" ,ty,tx);
}
void settei()
{
locate(1,3); printf(" ");
locate(1,3); printf("Delay? (ショキチ 500) ");
scanf("%d",&wait);
} |
Turbo C用 |
/*PRACT1V.C ver0.1 (PC98、Pc/AT汎用)*/
/*リアルタイムキー入力、キャラクタの移動、当たり判定等の基本実験プログラム*/
/*キー入力でキャラクタを動かす 1左 3右 2 爆弾 8 Delay設定 9で終了*/
/*CODED by Tsuyoshi Kasai*/
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<dos.h>
char c;
int x;
int tekix,tekiy, tekiv;
int bombx,bomby,fbomb; /* fbomb 0 爆弾未投下 1 爆弾投下中*/
int wait;
void atari(void);
void bomb(void);
void initteki(void);
void teki(void);
void init(void);
void keyin(void);
void locate(int, int);
void settei();
void delay(int);
main()
{
x=14; wait=500;
init();
initteki();
fbomb=0;
locate(1,1); printf("PRACT1 Cによる実験プログラム(PC98、PC/AT汎用)coded by Tsuyoshi Kasai");
locate(1,2); printf("Key 1 左 2 爆弾投下 3 右 8 delay(初期値500) 9 終了");
for (;;){
if (kbhit()){
c=getch();
if (c == '9') break;
if (c == '8') settei();
keyin(); }
if (fbomb==1) bomb();
delay(wait); /* コンピュータにwaitをかける*/
teki();
}
printf("\x01b[>5l"); /*カーソル表示*/
}
void init() /*初期化*/
{
/* window(1,1,80,24); */
printf("\x01b[2J"); /*画面クリア*/
printf("\x01b[>5h");
locate(1,5);
printf("================================");
locate(x,5);
printf("=<T>=");
}
void keyin() /*入力キー判定*/
{
int i;
if (c == '1') x=x-1;
if (c == '3') x=x+1;
if (c == '2' && fbomb==0) {bombx=x+2; bomby=5; fbomb=1;}
if (x <1 ) x=1;
if (x >27) x=27;
locate(x,5);
printf("=<T>=");
}
void bomb()
{
locate(bombx,bomby); printf(" ");
bomby=bomby+1;
if (bomby>17) {fbomb=0; return;}
locate(bombx,bomby); printf("U");
if (bombx == tekix && bomby == tekiy) atari();
}
void teki()
{
locate(tekix,tekiy); printf(" ");
tekix=tekix+tekiv;
if (tekix<1 || tekix > 30) initteki();
locate(tekix,tekiy); printf("X");
if ((tekix == bombx && tekiy == bomby) && fbomb==1) atari();
}
void atari() /*当たり処理*/
{ int i;
locate(bombx,bomby); printf("*");
delay(3000);
locate(bombx,bomby); printf(" ");
fbomb=0;
initteki();
}
void initteki()
{
int r;
r=(int)(rand()/16384);
if (r == 0) {tekix=1; tekiv=1;}
else {tekix=30; tekiv=-1;}
tekiy=(int)((rand()/3277)+6);
}
void locate (tx,ty)
{
printf("\x1b[%d;%dH" ,ty,tx);
}
void settei()
{
locate(1,3); printf(" ");
locate(1,3); printf("Delay? (ショキチ 500) ");
scanf("%d",&wait);
}
void delay(wait)
{
int i,j;
for (i=0;i<1000;i++){
for (j=0;j<wait;j++);
}}
2 |
1 2 |

1 乱数
2
3