c语言扫雷小游戏二次开发

原c语言代码如下

点击查看代码
 
#define EASY_COUNT 10
 
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
 
//棋盘的初始化
void initboard(char arr[ROWS][COLS], int rows, int cols, char ch);
 
//打印棋盘
void printboard(char arr[ROWS][COLS], int row, int col);
//埋雷
void setmine(char arr[ROWS][COLS],int row,int col);
 
//得到周围雷的数量
int getmine(char arr[ROWS][COLS], int x, int y);
 
//排查雷
int searchmine(char mineboard[ROWS][COLS], char showboard[ROWS][COLS], int row, int col);
 
void menu2();
 
//标记雷
void mark(char showboard[ROWS][COLS], int row, int col);
 
//取消标记雷
void unmark(char showboard[ROWS][COLS], int row, int col);#include"test.h"
 
void initboard(char arr[ROWS][COLS], int rows, int cols, char ch)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			arr[i][j] = ch;
		}
	}
}
 
void printboard(char arr[ROWS][COLS], int row, int col)
{
	printf("-------扫雷--------\n");
	for (int i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}
 
void setmine(char arr[ROWS][COLS],int row,int col)
{
	int count = 1;
	while (count <= EASY_COUNT)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count++;
		}
	}
}
 
int getmine(char arr[ROWS][COLS], 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]
		- 8 * '0';
}
 
int searchmine(char mineboard[ROWS][COLS],char showboard[ROWS][COLS],int row,int col)
{
	int x, y;
	static int cnt = 0;
	//while (cnt < ROW * COL - EASY_COUNT)
	//{
		printf("请输入你要排查的对象:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (showboard[x][y] != '*' && showboard[x][y] != '#')
			{
				printf("该点已排查,请重新选择\n");
			}
			else
			{
				if (mineboard[x][y] == '1')
				{
					printf("很遗憾,这是炸弹,游戏结束\n");
					printboard(mineboard, ROW, COL);
					return -1;
					//break;
				}
				else
				{
					showboard[x][y] = getmine(mineboard, x, y) + '0';
					printboard(showboard, ROW, COL);
					cnt++;
					return cnt;
				}
			}
		}
		else
			printf("输入不合法,请重新输入\n");
	//}
	//if (cnt == ROW * COL - EASY_COUNT)
	//{
	//		printf("恭喜你,排雷成功!\n");
	//}
}
 
 
void menu2()
{
	printf("*************************\n");
	printf("*****    1.Check    *****\n");
	printf("*****    2.Mark     *****\n");
	printf("*****    3.Unmark   *****\n");
	printf("*************************\n");
}
 
void mark(char showboard[ROWS][COLS], int row, int col)
{
	while (1)
	{
		printf("请输入你要标记的对象:");
		int x, y;
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (showboard[x][y] == '*')
			{
				showboard[x][y] = '#';
				break;
			}
			else if (showboard[x][y] == '#')
			{
				printf("该对象已被标记,无需重复标记\n");
			}
			else
			{
				printf("此处已探查,无需标记\n");
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
}
 
void unmark(char showboard[ROWS][COLS], int row, int col)
{
	while (1)
	{
		printf("请输入你要取消标记的对象:");
		int x, y;
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (showboard[x][y] == '#')
			{
				showboard[x][y] = '*';
				break;
			}
			else if (showboard[x][y] == '*')
			{
				printf("该对象没有被标记,无需取消标记\n");
			}
			else
			{
				printf("此处已探查,无需取消标记\n");
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
}#include <stdio.h>
#include <stdlib.h>
#include"test.h"
void menu1()
{
	printf("*************************\n");
	printf("*****    1.Play     *****\n");
	printf("*****    0.exit     *****\n");
	printf("*************************\n");
}
void game()
{
	char mineboard[ROWS][COLS] = { 0 };
	char showboard[ROWS][COLS] = { 0 };
	
	initboard(mineboard, ROWS,COLS,'0');
	initboard(showboard, ROWS,COLS,'*');
 
	//printboard(mineboard, ROW, COL);
	setmine(mineboard,ROW,COL);
	//printboard(mineboard,ROW,COL);
	printboard(showboard,ROW,COL);
	//int x, y;
	//scanf("%d %d", &x, &y);
	//printf("%d\n", getmine(mineboard, x,y));
	int cnt = 0;
	while (cnt !=-1)
	{
		int input = 0;
		menu2();
		printf("请选择你要执行的操作:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			cnt = searchmine(mineboard, showboard, ROW, COL);
			break;
		case 2:
			mark(showboard,ROW,COL);
			printboard(showboard, ROW, COL);
			break;
		case 3:
			unmark(showboard, ROW, COL);
			printboard(showboard, ROW, COL);
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
		if (cnt == ROW * COL - EASY_COUNT)
		{
			printf("恭喜你,排雷成功!\n");
			break;
		}
	}
 
	//searchmine(mineboard, showboard, ROW, COL);
}
int main()
{
	srand((unsigned int)time(NULL));
	clock_t start, end;
	double duration;
	int input = 0;
	do
	{
		menu1();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			start = clock();
			game();

			end = clock();
			printf("此次用时%lf秒\n", (double)((end - start) / 1000.0));
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
 
	return 0;
}
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

原扫雷小游戏运行截图:

源程序缺点分析:
经过分析,作者发现了一些改进点:
改进点一:错误处理和边界检查。在用户输入坐标时,应该进行错误处理和边界检查,以避免程序崩溃或出现不可预料的情况。
改进点二:优化雷区生成算法。可以优化放置地雷的算法,确保地雷分布更加随机和公平。
改进点三:改进显示方式。改进显示游戏板的方式,使界面更加友好和直观。
改进点四:增加难度级别。为游戏增加难度级别选择,让玩家可以根据自己的喜好选择不同难度的游戏。
对上述问题的改进优化:
int getInput(int *x, int *y, int row, int col) { printf("请输入你要排查的对象:"); if (scanf("%d %d", x, y) != 2 || *x < 1 || *x > row || *y < 1 || *y > col) { printf("输入非法,请重新输入\n"); while (getchar() != '\n'); // 清空输入缓冲区 return 0; // 返回0表示输入有误 } return 1; // 返回1表示输入正确 }

1.改进后的代码中,通过getInput函数对用户输入进行验证,确保输入合法且在棋盘范围内,若输入不合法则提示用户重新输入。

void setMineImproved(char arr[ROWS][COLS], int row, int col) { int count = 0; while (count < EASY_COUNT) { int x = rand() % row + 1; int y = rand() % col + 1; if (arr[x][y] != '1') { arr[x][y] = '1'; count++; } } }

2.改进后的setMineImproved函数使用更有效的算法,确保地雷随机分布在棋盘上,提高游戏的趣味性和挑战性。

void printBoardImproved(char arr[ROWS][COLS], int row, int col) { printf("------- 扫雷 -------\n"); for (int i = 1; i <= row; i++) { for (int j = 1; j <= col; j++) { printf("%c ", arr[i][j]); } printf("\n"); } }

3.改进后的printBoardImproved函数重新设计了显示方式,使界面更加友好和直观,让玩家更容易理解游戏状态。

void chooseDifficultyLevel() { int difficulty = 0; printf("请选择难度级别:\n"); printf("1. 简单\n"); printf("2. 中等\n"); printf("3. 困难\n"); scanf("%d", &difficulty); switch (difficulty) { case 1: setMine(arr, ROW, COL, EASY_COUNT); break; case 2: setMine(arr, ROW, COL, MEDIUM_COUNT); break; case 3: setMine(arr, ROW, COL, HARD_COUNT); break; default: printf("选择错误,默认设置为简单模式\n"); setMine(arr, ROW, COL, EASY_COUNT); break; } }

4.改进后的chooseDifficultyLevel函数增加了难度级别选择,让玩家可以根据自己的喜好选择不同难度的游戏,增加了游戏的可玩性和挑战性。

改进后扫雷小游戏运行截图:

在这次扫雷游戏二次开发中,我们可以得到一些经验和启示:

  1. 用户体验至关重要:改进游戏的用户体验可以极大地提升玩家的参与度和满意度。优化界面显示、增加功能性、提供更多选择等都是改善用户体验的有效途径。

  2. 持续优化和更新:对于游戏类项目,持续进行优化和更新是非常重要的。不断听取用户反馈,改进游戏功能和体验,使游戏保持新鲜感和吸引力。

  3. 灵活应对需求:根据用户需求和市场趋势,灵活调整游戏功能和特性。增加新功能、改进算法等都可以使游戏更具竞争力和吸引力。

  4. 注重细节:在开发过程中,注重细节可以提高游戏的质量。例如添加错误处理、优化算法、改进显示等细节工作都可以使游戏更加稳定和流畅。

  5. 学习和尝试新技术:在开发过程中,不断学习和尝试新技术可以带来更多的创新和可能性。尝试新的算法、界面设计方法等可以为游戏开发带来新的灵感和突破。

posted @   严宇亮  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示