当たりゲーム 改良

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 当たりゲーム 改良

Re: 当たりゲーム 改良

#2

by purin52002 » 8年前

こんにちは

cx,cy,ex,ey,point,iがhit内で定義されていないからじゃないでしょうか?
hit関数に引数として渡すか、グローバル変数にするかで解決できると思います。
(グローバル変数は個人的に好きじゃないので、引数で渡すことをお勧めしますw)

当たりゲーム 改良

#1

by masuter » 8年前

学校で以下のコードを書き換える課題が出ました。

コード:

//////////////////////////////////////////////////////////////////////
//
// シューティングゲームのプログラム shootingReplay.c
//
//////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include <stdlib.h> // system()
#include <windows.h> // Sleep()
#include <conio.h> // kbhit()

#define SIZE 10

// キーボードに合わせて移動
// 4なら左、6なら右
int main()
{
	int i, x, [code]
y;
int cx = 0, cy = 0;//自機 ●(circle)の場所
int ex = 5, ey = 5;//敵 ▲(enemy)の場所
int key, r;
int point = 0;
int hist_cx[300], hist_cy[300];
int hist_ex[300], hist_ey[300];

for( i = 0; i < 300; i++ )//繰り返し
{
// キーが押されていたら、キーコードを取得する
if(kbhit()) // キーが入力されていれば真
{
key = getch();//一文字入力、エコーバックなし
if ( key == '4')
cx--;
else if ( key == '6')
cx++;
else if ( key == '8')
cy--;
else if ( key == '2')
cy++;
cx = ( cx + SIZE ) % SIZE; //ワープ
cy = ( cy + SIZE ) % SIZE;
}
r = rand() % 4;
if ( r == 0 )
ex--;
else if ( r == 1 )
ex++;
else if ( r == 2 )
ey--;
else if ( r == 3 )
ey++;
ex = ( ex + SIZE ) % SIZE; //ワープ
ey = ( ey + SIZE ) % SIZE;

//画面表示
printf( "-------- Play Mode --------\n");
for( y = 0; y < SIZE; y++ )
{
for( x = 0; x < SIZE; x++ )
{
if( x == cx && y == cy )
printf("●");
else if( x == ex && y == ey )
printf("▲");
else
printf(" ");
}
printf("\n");
}
hist_cx = cx;
hist_cy = cy;
hist_ex = ex;
hist_ey = ey;


//当たり判定
if ( cx == ex && cy == ey )
point++;

printf("\n");
printf(" (cx,cy) = (%d, %d)\n", cx, cy);
printf(" (ex,ey) = (%d, %d)\n", ex, ey);
printf(" point: %d time: %d\n", point, i);
Sleep(10);// 1秒間(wait_timeミリ秒)何もしない
system("cls");// 画面消去
}
printf( "┏ ┏━┓┏━┓┏┳┓┳━┓ ┏━┓┳ ┳┳━┓┳━┓ ┓\n");
printf( "┃ ┃ ┓┣━┫┃┃┃┣┫ ┃ ┃┃ ┃┣┫ ┣┳┛ ┃\n");
printf( "┗ ┗━┛┻ ┻┻ ┻┻━┛ ┗━┛┗━┛┻━┛┻┗┛ ┛\n");
Sleep(3000);// 何もしない
system("cls");// 画面消去

for( i = 3; i >= 1; i-- ){
printf( "┏ ┳━┓┳━┓┳━┓┳  ┏━┓ ┳ ┳ ┓\n");
printf( "┃ ┣┳┛┣┫ ┣━┛┃  ┣━┫ ┗┰┛ ┃\n");
printf( "┗ ┻┗┛┻━┛┻  ┗━┛┻ ┻  ┻  ┛\n");
printf( "\n\n\n [ %d ]\n", i);//カウントダウン
Sleep(1000);// 何もしない
system("cls");// 画面消去
}

//再現
point = 0;
for( i = 0; i < 300; i++ )//300回繰り返し
{
cx = hist_cx;
cy = hist_cy;
ex = hist_ex;
ey = hist_ey;
printf( "------- Replay Mode -------\n");
//画面表示
for( y = 0; y < SIZE; y++ )
{
for( x = 0; x < SIZE; x++ )
{
if( x == cx && y == cy )
printf("●");
else if( x == ex && y == ey )
printf("▲");
else
printf(" ");
}
printf("\n");
}
//当たり判定
if ( cx == ex && cy == ey )
point++;
printf("\n");
printf(" (cx,cy) = (%d, %d)\n", cx, cy);
printf(" (ex,ey) = (%d, %d)\n", ex, ey);
printf(" point: %d time: %d\n", point, i);
Sleep(10);// 1秒間(wait_timeミリ秒)何もしない
system("cls");// 画面消去
}

return 0;
}
[/code]
shootingReplay.c を以下の要件を満たすよう関数を使って書き換えること
1. gameover()、renew()関数の作成と使用。
2. 自機と敵機が当たった時に呼ばれる関数 hit を作成し、2箇所で呼ぶ。関数 hit() では 当たった事がわかるよう”HIT!”などと画面に表示させ、1秒待機させる。
3. 画面表示を行う関数show を作成し、2箇所で呼ぶ。show はint型引数cx,cy,ex,ey を持つ。

1.はできました。2.3.ができません。
まず、2.ですが、

コード:

・・・・・・・・・・・・・・
void renew(int wait_time) {
	Sleep(wait_time);// 1秒間(wait_timeミリ秒)何もしない
	system("cls");// 画面消去
}
void hit() {
	point++;
	printf("\n");
	printf(" (cx,cy) = (%d, %d)\n", cx, cy);
	printf(" (ex,ey) = (%d, %d)\n", ex, ey);
	printf(" point: %d time: %d\n", point, i);
}
・・・・・・・・・・・・・・
//当たり判定
if (cx == ex && cy == ey)
hit();
renew(10);
・・・・・・・・・・・・・・
//当たり判定
if (cx == ex && cy == ey)
hit();
renew(10);
としましたところ、座標とポイントの画面表示がされなくなりました。何が間違っているのでしょうか

ページトップ