C言語で掃海ゲームを実現する
C言語で掃海ゲームを実現します。コードが多いので、マルチファイルの方式を採用してコードをより良く見せます。
一.メール.
主調関数ではまずユーザーに選択するインターフェースを提供します。ここではスタートゲームとして1を選択すると仮定します。0は終了ゲームとして、コードは以下の通りです。
関数の実行開始は、表示ボックスに数字の入力をユーザに促すことができます。1はゲームに入るために、Game()関数を呼び出します。0はゲームを終了するためです。このうちwhileループの役割は、ユーザーがインターフェースに入力してエラー(非0または1)を入力するか、またはゲームを完了したら引き続きポップアップオプションを選択し、0を入力するとnumを0にし、ループを終了します。
二.test.h
これはヘッダファイルです。マクロ定義と関数を含む宣言コードは以下の通りです。
1.機雷除去に関する主要コードはこの書類に書いてあります。test.cには必ずヘッダファイルtest.hが含まれています。Game()関数は,他の関数を呼び出して,掃海過程全体を実現し,二次元配列の枠線を使用しないため,外枠を使用すると周囲の雷の個数が計算されにくいからである。system(「cls」)はクリーンスクリーン操作であり、今後の効果を加えると、一枚の絵の上で機雷を掃きます。以下のコードを参照してください
これらを完成したら雷除去コードが完成しました。運行効果は以下の通りです。
座標を入力すれば、掃海ゲームができます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
一.メール.
主調関数ではまずユーザーに選択するインターフェースを提供します。ここではスタートゲームとして1を選択すると仮定します。0は終了ゲームとして、コードは以下の通りです。
関数の実行開始は、表示ボックスに数字の入力をユーザに促すことができます。1はゲームに入るために、Game()関数を呼び出します。0はゲームを終了するためです。このうちwhileループの役割は、ユーザーがインターフェースに入力してエラー(非0または1)を入力するか、またはゲームを完了したら引き続きポップアップオプションを選択し、0を入力するとnumを0にし、ループを終了します。
二.test.h
これはヘッダファイルです。マクロ定義と関数を含む宣言コードは以下の通りです。
#ifndef __TEST_H__//
#define __TEST_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
#define HORI 6//
#define VERT 6//
#define NUM 7//
#define STYLE '#'//
extern void Game();
#endif
三.test.1.機雷除去に関する主要コードはこの書類に書いてあります。test.cには必ずヘッダファイルtest.hが含まれています。Game()関数は,他の関数を呼び出して,掃海過程全体を実現し,二次元配列の枠線を使用しないため,外枠を使用すると周囲の雷の個数が計算されにくいからである。system(「cls」)はクリーンスクリーン操作であり、今後の効果を加えると、一枚の絵の上で機雷を掃きます。以下のコードを参照してください
void Game(){
srand((unsigned long)time(NULL));//
char fake[HORI][VERT];//
char mine[HORI][VERT];//
memset(fake,STYLE , sizeof(fake));// STYLE
memset(mine, '0', sizeof(mine));// 0
int count = (HORI - 2)*(VERT - 2) - NUM;// ,
Bray(mine,HORI,VERT);//
while (count){//
Display(fake,HORI,VERT);// fake
int x = 0;
int y = 0;
printf("Please Enter Your Postion<x,y>#:
");
scanf("%d%d", &x, &y);//
if (x<1 || x>10 || y<1 || y>10){//
printf("Please try again:
");
continue;
}
if (fake[x][y] != STYLE){//
printf("Please try again:
");
continue;
}
if (mine[x][y] =='1'){// , , while ,
printf("Game over
");
Display(mine, HORI, VERT);
break;
}
fake[x][y] = Digital(mine,x,y);// mine[x][y] , fake[x][y];
count--;// ,count ,
system("cls");//
}
}
2.埋め雷関数Bray()の実現は、雷を文字‘1’に設定し、周囲の雷の個数を計算しやすいようにすることです。countはこの時点で埋め雷数であり、whileの循環回数を制御すると、発生乱数が同じになる可能性がありますので、count--if文に置いて、生成された乱数の位置が同じになることを防止します。コードは以下の通りです
void Bray(char arr[][VERT],int hori,int vert){// , 1
int count = NUM;
while (count){
int x = rand() % (hori - 2) + 1;
int y= rand() % (vert - 2) + 1;
if (arr[x][y] == '0'){
arr[x][y]='1';
count--;
}
}
};
3.周囲の雷の個数を計算する関数Digital()は、戻り値がint型であれば雷の個数を表します。配列mineには文字‘0’(Ascllcコードが48)と文字‘1’(Ascllcコードが49)が格納されていますので、x,yを下の文字として一回転して8に‘0’(文字0)を乗じて欲しい雷の数を減算します。しかし、戻り値はcharタイプなので、式子に「0」(文字0)を加えると、対応するcharタイプになります。したがって、全体として7を減算して‘0’(文字0)を掛けます。コードは以下の通りです
char Digital(char arr[][VERT],int x,int y){//
return arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] + arr[x][y - 1] + \
arr[x][y + 1] + arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1] - 7 * '0';
};
4.ゲーム画面を表示する関数はDisplay()で、配列枠は適用されないので、iとjの開始数字は1で、ちょうど配列下付きです。コードは以下の通りです
void Print(hori){
printf(" ");
for (int i = 0; i < hori - 2; i++){
printf("----");
}
printf("
");//
}
void Display(char arr[][VERT],int hori,int vert){//
printf(" ");// ,
for (int i = 1; i < hori - 1; i++){// 1
printf("%4d", i);
}
printf("
");//
Print(hori);//
for (int i = 1; i < hori - 1; i++){
printf("%-2d|", i);
for (int j = 1; j < vert - 1; j++){
printf(" %c|",arr[i][j]);
}// |
printf("
");//
Print(hori);//
}
};
test.cにはGame関数以外に、他の関数はstaticで修飾され、外部に露出する必要がない。これらを完成したら雷除去コードが完成しました。運行効果は以下の通りです。
座標を入力すれば、掃海ゲームができます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。