9月8日の秋になると花が咲きます
幅広い視聴者を対象とする小さなゲームとして、マインスイーパはシンプルで使いやすいので、複数のファイルを使用して小さなマインスイーパゲームプロジェクトを実現する方法を教えてください。
アイデア
複数のファイルの性質に応じて、このプロジェクトを3つのファイル(ヘッダーファイル、メイン関数のライブラリファイル、呼び出し関数のライブラリファイル)に分割する必要があります。
プログラミングの主な考え方は、関数を呼び出すことです。このプロジェクトで実装する関数には、次のものが含まれている必要があります。
- プレイヤーが初めて座標を選択しても殺されない
- ボードを初期化する(ランダム鉱山)
- 九公グネリの総数を表示
- チェス盤を表示
- メニュー選択インターフェース
1.最初にチェス盤が必要です
2つのチェス盤を印刷するには、2次元配列を使用する必要があります。10X10のチェス盤を印刷する場合、10X10の2次元配列要素が必要ですか?、いいえ、アルゴリズムを設計するときに、座標の周りの8つの方位角で地雷の数を数える必要があるため、境界座標の周りの地雷の数を数えたい場合は、配列が範囲外の問題があり、10X10以上の境界が必要です。要素の最後のサークルでは、我々はまた、12×12配列の要素を定義する必要がありますチェス盤を表示するときにもちろん、私たちはこれらの要素を印刷しないで示すように。
図:
我々は、配列の鉱山を使用して、設計者のチェス盤を印刷[ROW] [COL]、そして我々はプレイヤーに見せたいものを印刷します。配列board [ROW] [COL]、2つの配列は最初に初期化する必要があります。デザインボードでは、文字0は雷ではないことを意味し、文字*はボードの開いていない位置を意味します。2つの配列を初期化します。
コードは次のとおりです:
ヘッダーファイル含む:
#define ROW 12 //设计者棋盘横坐标
#define COL 12 //设计者棋盘纵坐标
#define TOTAL 10*10 //玩家棋盘的总数
#define MINE_NUM 20 //雷的个数
ゲーム機能には以下が含まれます:
char mine[ROW][COL];
char board[ROW][COL];
memset(mine, '0', sizeof(mine));//初始化数组
memset(board, '*', sizeof(board));
2.ブレイ、ランダム関数生成を使用します。
int GetRandIndex(int start, int end)//保证随机数在1-10
{
return rand() % (end - start + 1) + start;
}
void SetMine(char mine[][COL], int row, int col)
{
srand((unsigned long)time(NULL));
int count = 0;//count计算已经布雷的总数
while (count < MINE_NUM) {
int x = GetRandIndex(1, 10);
int y = GetRandIndex(1, 10);
if (mine[x][y] == '0') {
mine[x][y] = '1';
count++;
}
}}
3. Thunder Arrayを印刷する
void ShowBoard(char board[][COL], int row, int col)
{
printf(" ");
int i = 1;
for (; i <= 10; i++) {
printf(" %d ", i);
}
printf("\n----");
for (i = 1; i <= 10; i++) {
printf("---");
}
printf("\n");
for (i = 1; i <= 10; i++) {
printf("%3d|", i);int j = 1;
for (; j <= 10; j++) {
printf("%2c|", board[i][j]);
}
printf("\n");
int k = 1;
for (k = 1; k <= 11; k++) {
printf("---");
}
printf("\n");
}
}
4.ゲームのルールによると、配置されている九峰の中心に表示される地雷の総数。
char GetMines(char mine[][COL], int row, int col)//char->'0'-'8'
{
return mine[row - 1][col - 1] + mine[row - 1][col] + \mine[row - 1][col + 1] + mine[row][col - 1] + mine[row][col + 1] + \
mine[row + 1][col - 1] + mine[row + 1][col] + \
mine[row + 1][col + 1] - 7 * '0';
}
5.トータルゲーム機能
void Game()
{
char mine[ROW][COL]; //set/judge mine
char board[ROW][COL]; //show
memset(mine, '0', sizeof(mine));
memset(board, '*', sizeof(board));
SetMine(mine, ROW, COL);
int count = TOTAL;
int x = 0;
int y = 0;
int times = 0;
while (1) {
ShowBoard(board, ROW, COL);
printf("请选择坐标: ");
scanf("%d,%d", &x, &y);
times++;
if (x >= 1 && x <= ROW - 2 && y >= 1 && y <= COL - 2) {
if (times == 1) {
mine[x][y] = '0';
}
if (mine[x][y] == '0') {
if (mine[x - 1][y - 1] == '0')
board[x - 1][y - 1] = GetMines(mine, x - 1, y - 1);
if(mine[x - 1][y] == '0')
board[x - 1][y] = GetMines(mine, x - 1, y);
if(mine[x - 1][y + 1] == '0')
board[x - 1][y + 1] = GetMines(mine, x - 1, y + 1);
if(mine[x][y - 1] == '0')
board[x][y - 1] = GetMines(mine, x, y - 1);
if(mine[x][y + 1] == '0')
board[x][y + 1] = GetMines(mine, x, y + 1);
if(mine[x + 1][y - 1] == '0')
board[x + 1][y - 1] = GetMines(mine, x + 1, y - 1);
if( mine[x + 1][y] == '0')
board[x + 1][y] = GetMines(mine, x + 1, y);
if(mine[x + 1][y + 1] == '0' )
board[x + 1][y + 1] = GetMines(mine, x + 1, y + 1);
char num = GetMines(mine, x, y);
board[x][y] = num;
count--;
if (count <= 20) {
printf("你赢了,厉害!\n");
break;
}
}
else {
printf("不好意思,你被炸死了!\n");
ShowBoard(mine, ROW, COL);
break;
}
}
else {
printf("你输入的坐标有误,请重新输入!\n");
}
}
}
その中で、
かつてのように空いている場所を開くには、隣の空いている場所を開きます。達成するための判断が必要
if (mine[x - 1][y - 1] == '0')
board[x - 1][y - 1] = GetMines(mine, x - 1, y - 1);
if(mine[x - 1][y] == '0')
board[x - 1][y] = GetMines(mine, x - 1, y);
if(mine[x - 1][y + 1] == '0')
board[x - 1][y + 1] = GetMines(mine, x - 1, y + 1);
if(mine[x][y - 1] == '0')
board[x][y - 1] = GetMines(mine, x, y - 1);
if(mine[x][y + 1] == '0')
board[x][y + 1] = GetMines(mine, x, y + 1);
if(mine[x + 1][y - 1] == '0')
board[x + 1][y - 1] = GetMines(mine, x + 1, y - 1);
if( mine[x + 1][y] == '0')
board[x + 1][y] = GetMines(mine, x + 1, y);
if(mine[x + 1][y + 1] == '0' )
board[x + 1][y + 1] = GetMines(mine, x + 1, y + 1);
さらに、顧客がゲームを確実に楽しむために、彼らを初めて殺すことはできないので、次のようにします。
times++;//计算第几次输入坐标
if (x >= 1 && x <= ROW - 2 && y >= 1 && y <= COL - 2) {
if (times == 1) {
mine[x][y] = '0';
}
6.メニュー選択
コードを簡潔にして分割を明確にするために、.cファイルをメニューパーツ用に作成できます。
void Menu()
{
printf("###################################\n");
printf("## 1. Play 2. Exit ##\n");
printf("###################################\n");
printf("Please Select: ");
}
int main()
{
int quit = 0;
int select = 0;
while (!quit){
Menu();
scanf("%d", &select);
switch (select)
{
case 1:
Game();
break;
case 2:
printf("拜拜!\n");
quit = 1;
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
}
system("pause");
return 0;
}
最後に、全体的なコードを提供します:https :
//github.com/GagaAutom/C-programming-language/tree/master/mine%20clearance
参照ソース:
地雷除去の詳細な説明を実現するためのC言語
https://blog.csdn.net/yc1515707718/article/details/78744978