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函数增加了难度级别选择,让玩家可以根据自己的喜好选择不同难度的游戏,增加了游戏的可玩性和挑战性。
改进后扫雷小游戏运行截图:
在这次扫雷游戏二次开发中,我们可以得到一些经验和启示:
-
用户体验至关重要:改进游戏的用户体验可以极大地提升玩家的参与度和满意度。优化界面显示、增加功能性、提供更多选择等都是改善用户体验的有效途径。
-
持续优化和更新:对于游戏类项目,持续进行优化和更新是非常重要的。不断听取用户反馈,改进游戏功能和体验,使游戏保持新鲜感和吸引力。
-
灵活应对需求:根据用户需求和市场趋势,灵活调整游戏功能和特性。增加新功能、改进算法等都可以使游戏更具竞争力和吸引力。
-
注重细节:在开发过程中,注重细节可以提高游戏的质量。例如添加错误处理、优化算法、改进显示等细节工作都可以使游戏更加稳定和流畅。
-
学习和尝试新技术:在开发过程中,不断学习和尝试新技术可以带来更多的创新和可能性。尝试新的算法、界面设计方法等可以为游戏开发带来新的灵感和突破。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)