パソコン活用研究シリコンバレー(C、C++、の活用研究)


シューティングゲームの基本形
―準備中―

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 乱数






TopPage