シューティングゲームの基本形
―準備中―
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