#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]
としましたところ、座標とポイントの画面表示がされなくなりました。何が間違っているのでしょうか