【C言語】マインスイーパゲーム

1. ゲームルール

1. 9*9 の小さなグリッド内で任意の座標 (グリッド) を選択します。選択後、鉱山の座標をクリックしないと、周囲に鉱山がいくつあるかを示す数字が表示されます。クリックしたらゲームオーバーです

トラブルシューティング

  • この位置が地雷でない場合、この位置を中心とした 8 つの座標に地雷がいくつあるかを計算し、地雷の数を表示します。
  • 私のものなら爆発してゲームオーバー
  • すべての地雷を見つけたら勝利となり、ゲーム終了です
  • リンクWeb版掃海艇

マインスイーパー01

2. 選択後、図に示すように

マインスイーパー02

3. 地雷に遭遇した場合

マインスイーパー03

2. コードロジック

  1. ゲームメニューのデザイン
  2. 地雷原を設計し、地雷をランダムに配置
  3. トラブルシューティング

3. ゲームの実現

1. ゲームメニューのデザイン

//test.c
#include "game.h"
void game() 
{
    
    
	printf("扫雷\n");
}
void menu() 
{
    
    
	printf("************************\n");
	printf("******    扫雷   *******\n");
	printf("******  1. play  *******\n");
	printf("******  0. exit  *******\n");
	printf("************************\n");
}
int main() 
{
    
    
	int input = 0;
	do 
	{
    
    
		menu();
		printf("请选择>:");
		scanf("%d",&input);
		switch (input)
		{
    
    
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
					
		}
		
	} while (input);
	return 0;
}

メニュー

2. 地雷原を設計し、地雷をランダムに配置します

(1) 地雷原の設定

9*9 の 2 次元配列を設定します。0 は雷なし、1 は雷ありを意味します

04

ただし、プレイヤーに表示される数字1(地雷の数)が1セットの地雷と重なることを避けるため、*を選択して地雷を埋めてください。

掃海は周囲8エリアを掃海するため、範囲外の掃海が問題となります。

05
したがって、チェス盤を設定するのは11*11 の 2 次元配列になります。
ここに画像の説明を挿入

//test.c 中的 game()
void game() 
{
    
    
	char mine[ROWS][COLS] = {
    
    0};//放置雷的数组
	char show[ROWS][COLS] = {
    
    0};//显示的数组
	InitBoard(mine,ROWS,COLS,'0');
	DisplayBoard(mine, ROW, COL);
	InitBoard(show,ROWS,COLS,'*');
	DisplayBoard(show, ROW, COL);

}
//game.c
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) 
{
    
    
	int i = 0;
	int j = 0;
	for (i = 0; i < rows;i++)
	{
    
    
		for (j = 0; j < cols;j++)
		{
    
    
			board[i][j] = set;
		}
	}
}

void DisplayBoard(char board[ROWS][COLS], int row, int col) 
{
    
    
	int i = 0;
	int j = 0;
	printf("--------扫雷---------\n");
	for (i = 0; i <= col;i++) 
	{
    
    
		printf("%d ",i);//打印列标
	}
	printf("\n");
	for (i = 1; i <= row; i++) 
	{
    
    
		printf("%d ",i);//打印行标
		for (j = 1; j <= col;j++)
		{
    
    
			printf("%c ",board[i][j]);
		}
		printf("\n");
	}
	printf("--------扫雷---------\n");
	
}
//game.h
#include <stdio.h>

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);

ここに画像の説明を挿入

(2) 地雷を配置する

ここでランダムに雷を発生させます。0
の文字は私のものではないことを意味します。文字1は雷を意味します

//game.c
void SetMine(char mine[ROWS][COLS], int row, int col) 
{
    
    
	int count = Easy_count;
	while (count) 
	{
    
    
		int x = rand() % row + 1;//生成坐标1-9
		int y = rand() % col + 1;
		if (mine[x][y] =='0')	//避免在同一个地方布置雷
		{
    
    
			mine[x][y] = '1';
			count--;
		}		
	}
}

06

3. 私のものを確認してください

確認したい地雷の座標を入力すると地雷の場合はゲームオーバー、地雷でない場合はその座標の周囲に地雷がいくつあるか表示されます

//game.c
//排查雷
int GetCountMine(char mine[ROWS][COLS],int x,int y) 
{
    
    
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
		mine[x][y - 1]+ mine[x][y + 1] +mine[x + 1][y - 1] +
		mine[x + 1][y] + mine[x + 1][y + 1]) - (8 * '0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) 
{
    
    
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < (row * col - Easy_count))//要排不是雷的区域个数
	{
    
    
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if ( x >= 1 && x <= row && y >= 1 && y <= col) 
		{
    
    
			//选中雷
			if (mine[x][y] =='1') 
			{
    
    
				printf("GAME OVER!!!,被炸死了\n");
				DisplayBoard(mine,ROW,COL);
				break;
			}
			else 
			{
    
    
				//不是雷,统计周围有多少雷
				int c = GetCountMine(mine,x,y);
				show[x][y] = c + '0';
				DisplayBoard(show,ROW,COL);
				win++;
			}
		}
		else 
		{
    
    
			printf("坐标输入错误,重新输入\n");
		}
	}

	if (win == ((row * col)- Easy_count)) //需要排的区域数
	{
    
    
		printf("恭喜您,排雷成功!\n");
	}
}

地雷除去の周囲座標

x-1、y-1 x-1,y x-1、y+1
x、y - 1 x、y x、y+1
x+1、y-1 x+1,y x+1、y+1

地雷完成時の様子(地雷除去成功テスト用に80個の地雷が設置されているので、安全なのは1個だけ)
07

私の、ゲームオーバーです
ここに画像の説明を挿入

4. ソースコード

ゲーム.h

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define Easy_count 10

//初始化
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//显示
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char mine[ROWS][COLS],int row,int col);
//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

test.c

#include "game.h"
void game() 
{
    
    
	char mine[ROWS][COLS] = {
    
    0};//放置雷的数组
	char show[ROWS][COLS] = {
    
    0};//显示的数组
	InitBoard(mine,ROWS,COLS,'0');
	InitBoard(show,ROWS,COLS,'*');	
	DisplayBoard(show, ROW, COL);
	//布置雷
	SetMine(mine,ROW,COL);
	//排查雷
	FindMine(mine,show,ROW,COL);

}
void menu() 
{
    
    
	printf("************************\n");
	printf("******    扫雷   *******\n");
	printf("******  1. play  *******\n");
	printf("******  0. exit  *******\n");
	printf("************************\n");
}
int main() 
{
    
    
	int input = 0;
	srand((unsigned int )time(NULL));//设置随机数种子
	do 
	{
    
    
		menu();
		printf("请选择>:");
		scanf("%d",&input);
		switch (input)
		{
    
    
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;		
		}
	} while (input);
	return 0;
}

ゲーム.c


#include "game.h"
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) 
{
    
    
	int i = 0;
	int j = 0;
	for (i = 0; i < rows;i++)
	{
    
    
		for (j = 0; j < cols;j++)
		{
    
    
			board[i][j] = set;
		}
	}
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col) 
{
    
    
	int i = 0;
	int j = 0;
	printf("--------扫雷---------\n");
	for (i = 0; i <= col;i++) 
	{
    
    
		printf("%d ",i);
	}
	printf("\n");
	for (i = 1; i <= row; i++) 
	{
    
    
		printf("%d ",i);
		for (j = 1; j <= col;j++)
		{
    
    
			printf("%c ",board[i][j]);
		}
		printf("\n");
	}
	printf("--------扫雷---------\n");
	
}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col) 
{
    
    
	int count = Easy_count;
	while (count) 
	{
    
    
		int x = rand() % row + 1;//生成坐标1-9
		int y = rand() % col + 1;
		if (mine[x][y] =='0')	//避免在同一个地方布置雷
		{
    
    
			mine[x][y] = '1';
			count--;
		}
	}
}
//排查雷
int GetCountMine(char mine[ROWS][COLS],int x,int y) 
{
    
    
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
		mine[x][y - 1]+ mine[x][y + 1] +mine[x + 1][y - 1] +
		mine[x + 1][y] + mine[x + 1][y + 1]) - (8 * '0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) 
{
    
    
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < (row * col - Easy_count))//要排不是雷的区域个数
	{
    
    
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if ( x >= 1 && x <= row && y >= 1 && y <= col) 
		{
    
    
			//选中雷
			if (mine[x][y] =='1') 
			{
    
    
				printf("GAME OVER!!!,被炸死了\n");
				DisplayBoard(mine,ROW,COL);
				break;
			}
			else 
			{
    
    
				//不是雷,统计周围有多少雷
				int c = GetCountMine(mine,x,y);

				show[x][y] = c + '0';
				DisplayBoard(show,ROW,COL);
				win++;
			}
		}
		else 
		{
    
    
			printf("坐标输入错误,重新输入\n");
		}
	}

	if (win == ((row * col)- Easy_count)) //需要排的区域数
	{
    
    
		printf("恭喜您,排雷成功!\n");
	}
}

おすすめ

転載: blog.csdn.net/qq_72505850/article/details/132086672