課題3 関数3
未完成の プログラム shooting-kadai3.c を元に、敵が複数になる shooting プログラム を完成させよ。
//*** 要修正 もしくは //*** 要追加 の部分を修正すればよい。
ただし以下の条件を満たすこと。
(1)敵の数は #define された ENEMY_NUM で 簡単に変えられる
(2)関数 int isReplay() 内で static な整数 over10points を追加し、得点が10点以上になったプレイ回数を数えて表示する
それ以外に、ゲームを面白くする要素を追加するのは構わない。
未完成のプログラムshooting-kadai3.c です。
//////////////////////////////////////////////////////////////////////
//
// シューティングゲームのプログラム shooting.c
//
// ●がキーボードに合わせて上下左右に移動
//
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h> // system()
#include <windows.h> // Sleep()
#include <conio.h> // kbhit()
#define SIZE 10 // ステージの大きさ
#define WAIT_TIME 100//画面表示のスピードを決める
#define ENEMY_NUM 10
// グローバル変数
int cx, cy;//自機 ●(circle)の場所
int ex[ENEMY_NUM], ey[ENEMY_NUM];//敵 ▲(enemy)の場所
int point = 0;//得点
// 各種初期化
void init()
{
int i;
point = 0;
cx = 0;
cy = 0;
for (i = 0; i < ENEMY_NUM; i++)
{
ex[i] = rand() % SIZE;
ey[i] = rand() % SIZE;
}
}
// ワープの計算
int getWarpPos(int pos)
{
int w;
w = (pos + SIZE) % SIZE;
return w;
}
// 自機の移動
// キーボードに合わせて移動
// 4なら左、6なら右、2なら下、8なら上
void moveRocket()
{
int key;
// キーが押されていたら、キーコードを取得する
if (!kbhit()) // キーが入力されていれば真
return;
key = getch();//一文字入力、エコーバックなし
switch (key)
{
case '4':
cx--;
break;
case '6':
cx++;
break;
case '8':
cy--;
break;
case '2':
cy++;
break;
}
cx = getWarpPos(cx); //ワープ
cy = getWarpPos(cy);
}
// 敵機の移動
// 引数を i にし、配列ex、eyのi番目の値を更新させる
//*** 要修正
void moveEnemy()
{
int r = rand() % 4;
switch (r)
{
case 0:
ex--;
break;
case 1:
ex++;
break;
case 2:
ey--;
break;
case 3:
ey++;
break;
}
ex = getWarpPos(ex); //ワープ
ey = getWarpPos(ey);
}
// 座標(x,y)に敵がいるかチェック
// 敵がいたら 1 を返す いなければ 0 を返す
int isOnEnemy(int x, int y)
{
int i;
//*** 要追加 授業を良く聞くこと
for (i = 0; i < ENEMY_NUM; i++)
{
if (x == ex[i] && y == ey[i])
return 1;
}
return 0;
}
//表示
void show()
{
int x, y;
for (y = 0; y < SIZE; y++)
{
for (x = 0; x < SIZE; x++)
{
if (x == cx && y == cy)
printf("●");
else if (x == ex && y == ey)//*** 要修正 isOnEnemyを使う
printf("▲");
else
printf(" ");
}
printf("\n");
}
printf("\n");
printf(" (cx,cy) = (%d, %d)\n", cx, cy);
//printf(" (ex,ey) = (%d, %d)\n", ex, ey);
}
//時間つぶしと画面更新
void renew(int wait_time)
{
printf(" point: %d\n", point);
Sleep(wait_time);// 1秒間(wait_timeミリ秒)何もしない
system("cls");// 画面消去
}
//衝突時の表示など
void hit()
{
point++;
printf("┏ ┳ ┳ ┳ ━┳━ ┓\n");
printf("┃ ┣━┫ ┃ ┃ ┃\n");
printf("┗ ┻ ┻ ┻ ┻ ┛\n");
}
//ゲームオーバー
void gameOver()
{
show();
printf("┏ ┏━┓┏━┓┏┳┓┳━┓ ┏━┓┳ ┳┳━┓┳━┓ ┓\n");
printf("┃ ┃ ┓┣━┫┃┃┃┣┫ ┃ ┃┃ ┃┣┫ ┣┳┛ ┃\n");
printf("┗ ┗━┛┻ ┻┻ ┻┻━┛ ┗━┛┗━┛┻━┛┻┗┛ ┛\n");
}
//*** 要追加
//*** static な整数 over10points を追加
//*** もし point が 10点を超えたら over10points は 1 増える
int isReplay()
{
char yn[256];
static int playtimes = 1;//これまで遊んだ回数
printf("Play: %d times\n", playtimes);
playtimes++;
// printf( "Over 10 Points: %d times\n", over10points);
printf("replay? [y/n]\n");
gets(yn);
if (yn[0] == 'y')
return 1;
return 0;
}
int main()
{
int wait_time = 100;
int i, j;
while (1)
{
init();
for (i = 0; i < 50; i++)
{
// 自機の移動
moveRocket();
for (j = 0; j < ENEMY_NUM; j++)
{
moveEnemy();//*** 要修正
}
//画面表示
show();
//当たり判定
if (ishit())//*** 要修正 isOnEnemyを使う
hit();
renew(wait_time);
}
gameOver();
if (!isReplay())
return 0;
}
return 0;
}
友人に聞きましたが、何を言っているのか分かりません。
まず。int isOnEnemy(int x, int y) 関数はどんなコードを書き加えてあげたらいいのでしょうか。