#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);
としましたところ、座標とポイントの画面表示がされなくなりました。何が間違っているのでしょうか
学校で以下のコードを書き換える課題が出ました。
[code]
//////////////////////////////////////////////////////////////////////
//
// シューティングゲームのプログラム 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][/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[i] = cx;
hist_cy[i] = cy;
hist_ex[i] = ex;
hist_ey[i] = 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[i];
cy = hist_cy[i];
ex = hist_ex[i];
ey = hist_ey[i];
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.ですが、
[code]
・・・・・・・・・・・・・・
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);
[/code]
としましたところ、座標とポイントの画面表示がされなくなりました。何が間違っているのでしょうか