单文件完整源码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>
#define ROW 3
#define COL 3
#define ROWS ROW+2
#define COLS COL+2
#define NUM 1
//int main()
//{
// int a = 1;
// if (a == 1)
// {
// a = 2;
// }
// printf("%d", a);
// return 0;
//}
//菜单
void menu()
{
printf("************************************************************************************************************************");
printf("******************************************* 扫雷游戏 ********************************************");
printf("******************************************* 1.Play 0.Exit ********************************************");
printf("************************************************************************************************************************");
printf("************************************************************************************************************************");
}
//胜利
void Win()
{
printf("******************************************* 你赢啦 ********************************************");
printf("************************************************************************************************************************");
printf("************************************************************************************************************************");
}
//失败
void Defeat()
{
printf("******************************************* 你输啦 ********************************************");
printf("************************************************************************************************************************");
printf("************************************************************************************************************************");
}
//结束游戏
void End1()
{
system("cls");
printf("************************************************************************************************************************");
printf("************************************************************************************************************************");
printf("******************************************* 游戏结束 ********************************************");
printf("************************************************************************************************************************");
printf("************************************************************************************************************************");
Sleep(1000);
}
//输入错误
void Error()
{
printf("请根据菜单正确选择!\n");
}
//游戏开头
void Head()
{
printf("************************************************************************************************************************");
printf("******************************************* 扫雷游戏 ********************************************");
printf("************************************************************************************************************************");
printf("\n");
printf("\n");
}
//游戏结尾
void End()
{
printf("\n");
printf("************************************************************************************************************************");
}
//初始化数组
void Initializeborad(char borad[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
//双重for循环所有borad值变为空格
borad[i][j] = ' ';
}
}
}
//打印函数
void Diskplay(char borad[ROWS][COLS], int row, int col)
{
//清屏
system("cls");
int i = 0;
int j = 0;
//打印开头
Head();
//双重for循环打印游戏面板
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
//每行第一个元素前打印一堆空格美观
if (j == 1)
{
printf(" ");
}
//第一列打印j作为列标
if (i == 1)
{
//行标1到9前加一个空格后加两个空格补位
if (j < 9)
{
printf(" %d ", j);
}
//行标大于等于9前后加一个空格补位
else
{
printf(" %d ", j);
}
}
//不是第一列打印“---”
else
{
printf("---");
//最后一列不在打印“|”
if (j == col)
{
break;
}
printf("|");
}
}
//换行
printf("\n");
for (j = 1; j <= col; j++)
{
//每列第一个元素前打印一堆空格美观
if (j == 1)
{
printf(" ");
//1到10打印数字加空格,10以后只打印数(空格为了占位,两位数本身就2位,不用空格补位)
if (i+1 <= 10)
{
printf("%d ", i);
}
else
{
printf("%d", i);
}
}
printf(" %c ", borad[i][j]);
if (j == col)
{
break;
}
printf("|");
}
printf("\n");
}
//结尾效果
End();
}
//判断是否是雷函数
int Ismine(char mineborad[ROWS][COLS], int x, int y, int row, int col)
{
if (mineborad[x][y] == '*')
{
return 1;
}
return 0;
}
//数九宫格雷个数
void Countmine(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int a, int b, int row, int col)
{
//定义一个值表示地雷个数,初始为0
int mine = 0;
//依次判定9宫格除自己以外每个位置是否为雷,因为Ismine函数判定是雷返回1,不是返回0,所以直接mine += Ismine进行累计
mine += Ismine(mineborad, a, b+1, ROW, COL);
mine += Ismine(mineborad, a+1, b, ROW, COL);
mine += Ismine(mineborad, a+1, b+1, ROW, COL);
mine += Ismine(mineborad, a, b-1, ROW, COL);
mine += Ismine(mineborad, a-1, b, ROW, COL);
mine += Ismine(mineborad, a-1, b-1, ROW, COL);
mine += Ismine(mineborad, a+1, b-1, ROW, COL);
mine += Ismine(mineborad, a-1, b+1, ROW, COL);
//数组是字符类型的,把得到的“数字”转化为“字符”
if (mine == 0)
{
mineborad[a][b] = '0';
}
else if (mine == 1)
{
mineborad[a][b] = '1';
}
else if (mine == 2)
{
mineborad[a][b] = '2';
}
else if (mine == 3)
{
mineborad[a][b] = '3';
}
else if (mine == 4)
{
mineborad[a][b] = '4';
}
else if (mine == 5)
{
mineborad[a][b] = '5';
}
else if (mine == 6)
{
mineborad[a][b] = '6';
}
else if (mine == 7)
{
mineborad[a][b] = '7';
}
else if (mine == 8)
{
mineborad[a][b] = '8';
}
}
//生成雷函数
void Minerand(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int row, int col)
{
int x, y, z;
z = 0;
while (z < NUM)
{
{
//随机生成坐标
x = (rand()%row) + 1;
y = (rand()%col) + 1;
if (mineborad[x][y] == ' ')
{
mineborad[x][y] = '*';
z++;
}
}
}
//直接算出所有格子的值
for (int i = 1; i <= row; i++)
{
for (int j = 0; j <= col; j++)
{
if (mineborad[i][j] != '*')
{
Countmine(borad, mineborad, i, j, ROW, COL);
}
}
}
}
//排雷函数
int Demine(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int x, int y, int row, int col)
{
//坐标位置不是空,表示该位置已经排查过了
if (borad[x][y] != ' ')
{
return 2;
}
//该位置为*表示该位置是0,把棋盘相应位置改为*,返回1表示游戏失败
if (mineborad[x][y] == '*')
{
borad[x][y] = mineborad[x][y];
return 1;
}
//该位置不为雷,把雷盘上的数字赋值给棋盘
else
{
borad[x][y] = mineborad[x][y];
return 0;
}
}
//标记雷函数
int Markmine(char borad[ROWS][COLS], char mineborad[ROWS][COLS], int x, int y)
{
//定义静态局部变量来存储标记对的个数
static int count = 0;
//如果棋盘该坐标位置为空,就把他标为*,并且雷盘上该位置如果真的为*,count加1表示正确标记了一个雷的位置
if (borad[x][y] == ' ')
{
borad[x][y] = '*';
if (mineborad[x][y] == '*')
{
count++;
}
//如果某一次标记完标记对的个数count等于NUM(即雷的个数),说明游戏胜利,返回3
if (count == NUM)
{
count = 0;
return 3;
}
return 0;
}
//该位置为*表示已经标记过
else if (borad[x][y] == '*')
{
return 1;
}
//不是空也不是*表示该位置是数字
else
{
return 2;
}
}
//取消标记
int Unmark(char borad[ROWS][COLS], int x, int y)
{
//该位置是玩家标记的*,把它变回空格
if (borad[x][y] == '*')
{
borad[x][y] = ' ';
return 0;
}
//该位置不是标记位置,返回1
else
{
return 1;
}
}
//游戏函数
void game()
{
//创建模板
char borad[ROWS][COLS] = {0};
//创建雷板
char mineborad[ROWS][COLS] = {0};
//初始化模板
Initializeborad(borad, ROW, COL);
//初始化雷盘
Initializeborad(mineborad, ROW, COL);
//打印模板
Diskplay(borad, ROW, COL);
//随机生成雷
Minerand(borad, mineborad, ROW, COL);
int a;
do
{
//清空缓存(初始菜单选择时留下一个“\n”没有被读取)
getchar();
//选择菜单
printf("请选择操作:1排雷/2标记雷/3取消标记\n");
a = getchar();
switch (a)
{
case '1':
{
int x, y;
printf("请输入坐标:\n");
//获取玩家的输入坐标
scanf("%d%d", &x, &y);
//定义ret1接收有返回值的扫雷函数,并根据返回值写结果
int ret1 = Demine(borad, mineborad, x, y, ROW, COL);
if (ret1 == 1)
{
//返回值为1,即该位置是雷,打印雷盘并调用失败函数
Diskplay(mineborad, ROW, COL);
Defeat();
a = 0;
}
if (ret1 == 2)
{
//返回值为2说明这个坐标已经排查过了
printf("该作坐标已经排查过了!\n");
}
if (ret1 == 0)
{
//返回值为0说明该位置不为0,游戏继续,打印棋盘
Diskplay(borad, ROW, COL);
}
break;
}
case '2':
{
int x, y;
printf("请输入坐标:\n");
//获取玩家的输入坐标
scanf("%d%d", &x, &y);
//定义ret2接收有返回值的标记函数,并根据返回值写结果
int ret2 = Markmine(borad, mineborad, x, y);
if(ret2 == 3)
{
//返回值为3表示所有位置雷都已经找到,打印棋盘并调用胜利函数
Diskplay(borad, ROW, COL);
Win();
a = 0;
}
else if (ret2 == 1)
{
//返回值为1表示该位置已经做过标记了
Diskplay(borad, ROW, COL);
printf("该位置已做过标记啦!\n");
}
else if (ret2 == 2)
{
返回值为2表示该位置已经显示为数字,不是雷
Diskplay(borad, ROW, COL);
printf("该位置已确定不是雷啦!\n");
}
else
{
//排除以上情况,表示游戏正在进行,没分出输赢,打印棋盘表示继续
Diskplay(borad, ROW, COL);
}
break;
}
case '3':
{
int x, y;
printf("请输入要取消的标记:\n");
//获取玩家的输入坐标
scanf("%d%d", &x, &y);
//定义ret3接收有返回值的取消标记函数,并根据返回值写结果
int ret3 = Unmark(borad, x, y);
//返回值为1,表示该位置并没有被标记,无法取消
if (ret3 == 1)
{
Diskplay(borad, ROW, COL);
printf("该位置不是标记位置!\n");
}
//除上中情况表示游戏应该正常继续,打印棋盘
else
{
Diskplay(borad, ROW, COL);
}
break;
}
default:
{
Error();
break;
}
}
//胜利或失败条件达成把a置为0跳出循环
} while (a);
}
//测试函数
void test()
{
srand((unsigned int)time(NULL));
int a;
do
{
printf("请根据菜单选择!1.Play 0.Exit\n");
scanf("%d", &a);
switch (a)
{
case 1:
{
game();
break;
}
case 0:
{
printf("游戏退出!\n");
break;
}
//输出指令不是菜单中的
default:
{
Error();
break;
}
}
} while (a);
}
//程序入口main函数
int main()
{
menu();
test();
return 0;
}
标准化项目源码:
test.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//菜单
void menu()
{
printf("************************************************************************************************************************");
printf("******************************************* 扫雷游戏 ********************************************");
printf("******************************************* 1.Play 0.Exit ********************************************");
printf("************************************************************************************************************************");
printf("************************************************************************************************************************");
}
//胜利
void Win()
{
printf("******************************************* 你赢啦 ********************************************");
printf("************************************************************************************************************************");
printf("************************************************************************************************************************");
}
//失败
void Defeat()
{
printf("******************************************* 你输啦 ********************************************");
printf("************************************************************************************************************************");
printf("************************************************************************************************************************");
}
//结束游戏
void End1()
{
system("cls");
printf("************************************************************************************************************************");
printf("************************************************************************************************************************");
printf("******************************************* 游戏结束 ********************************************");
printf("************************************************************************************************************************");
printf("************************************************************************************************************************");
Sleep(1000);
}
//输入错误
void Error()
{
printf("请根据菜单正确选择!\n");
}
//功能菜单
int Menu()
{
int a = 0;
printf("请选择扫雷或者标记雷:(1扫雷/2标记/3取消标记)");
scanf("%d", &a);
return a;
}
//游戏函数
void game()
{
//创建模板
char borad[ROW][COL] = {0};
//创建雷板
char mineborad[ROW][COL] = {0};
//初始化模板
Initializeborad(borad, ROW, COL);
//初始化雷盘
Initializeborad(mineborad, ROW, COL);
//打印模板
Diskplay(borad, ROW, COL);
//随机生成雷
Minerand(mineborad, ROW, COL);
while (1)
{
int ret1 = 0;
int ret2 = 0;
//功能菜单
int ret = Menu();
switch (ret)
{
//扫雷
case 1:
{
printf("请输入坐标扫雷:\n");
int x, y;
scanf("%d%d", &x, &y);
ret1 = Demine(borad, mineborad, x, y, ROW, COL);
if (ret1 == 1)
{
Diskplay(mineborad, ROW, COL);
Defeat();
break;
}
else if (ret1 == 2)
{
Diskplay(borad, ROW, COL);
printf("该位置已确定不是雷啦!\n");
}
else
{
Diskplay(borad, ROW, COL);
}
break;
}
//标记雷
case 2:
{
printf("请输入坐标标记雷:\n");
int x, y;
scanf("%d%d", &x, &y);
ret2 = Markmine(borad, mineborad, x, y);
if(ret2 == 3)
{
Diskplay(borad, ROW, COL);
Win();
}
else if (ret2 == 1)
{
Diskplay(borad, ROW, COL);
printf("该位置已做过标记啦!\n");
}
else if (ret2 == 2)
{
Diskplay(borad, ROW, COL);
printf("该位置已确定不是雷啦!\n");
}
else
{
Diskplay(borad, ROW, COL);
}
break;
}
//取消标记
case 3:
{
printf("请输入要取消的标记:\n");
int x, y;
scanf("%d%d", &x, &y);
int ret3 = Unmark(borad, x, y);
if (ret3 == 1)
{
Diskplay(borad, ROW, COL);
printf("该位置不是标记位置!\n");
}
else
{
Diskplay(borad, ROW, COL);
}
break;
}
default:
{
Error();
break;
}
}
if (ret1 == 1 || ret2 == 3)
{
break;
}
}
}
//测试函数,游戏框架
void test()
{
int a = 0;
srand((unsigned int)time(NULL));
do
{
printf("请根据菜单选择(1开始游戏,0退出游戏)\n");
scanf("%d", &a);
switch (a)
{
case 1:
{
game();
break;
}
case 0:
{
End1();
break;
}
default:
{
Error();
break;
}
}
} while (a);
}
int main()
{
menu();
test();
return 0;
}
game.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//游戏开头
void Head()
{
printf("************************************************************************************************************************");
printf("******************************************* 扫雷游戏 ********************************************");
printf("************************************************************************************************************************");
printf("\n");
printf("\n");
}
//游戏结尾
void End()
{
printf("\n");
printf("************************************************************************************************************************");
}
//初始化数组
void Initializeborad(char borad[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
//双重for循环所有borad值变为空格
borad[i][j] = ' ';
}
}
}
//打印函数
void Diskplay(char borad[ROW][COL], int row, int col)
{
//清屏
system("cls");
int i = 0;
int j = 0;
//打印开头
Head();
//双重for循环打印游戏面板
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
//每行第一个元素前打印一堆空格美观
if (j == 0)
{
printf(" ");
}
if (i == 0)
{
if (j < 9)
{
printf(" %d ", j+1);
}
else if (j == 9)
{
printf(" %d ", j+1);
}
else
{
printf(" %d ", j+1);
}
}
else
{
printf("---");
if (j == col-1)
{
break;
}
printf("|");
}
}
printf("\n");
for (j = 0; j < col; j++)
{
if (j == 0)
{
printf(" ");
if (i+1 < 10)
{
printf("%d ", i+1);
}
else
{
printf("%d", i+1);
}
}
printf(" %c ", borad[i][j]);
if (j == col-1)
{
break;
}
printf("|");
}
printf("\n");
}
End();
}
//生成雷函数
void Minerand(char mineborad[ROW][COL], int row, int col)
{
int x, y, z;
z = 0;
while (z < 9)
{
{
x = rand()%row;
y = rand()%col;
if (mineborad[x][y] == ' ')
{
mineborad[x][y] = '*';
z++;
}
}
}
}
//排雷函数
int count1 = 0;
int Demine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y, int row, int col)
{
if (count1 == 0)
{
if (mineborad[x-1][y-1] == '*')
{
mineborad[x-1][y-1] = ' ';
int a, b;
while (1)
{
a = rand()%row;
b = rand()%col;
if (mineborad[a][b] == ' ')
{
mineborad[a][b] = '*';
break;
}
}
}
count1 = 1;
}
if (borad[x-1][y-1] != ' ')
{
return 2;
}
int ret = Ismine(mineborad, x-1, y-1, ROW, COL);
if (ret == 1)
{
count1 = 0;
return ret;
}
else
{
Countmine(borad, mineborad, x-1, y-1, ROW, COL);
return 0;
}
}
//判断函数
int Ismine(char mineborad[ROW][COL], int x, int y, int row, int col)
{
if (x<0 || x>row-1 || y<0 || y>col-1)
{
return 0;
}
else if (mineborad[x][y] == '*')
{
return 1;
}
return 0;
}
//数九宫格雷个数
void Countmine(char borad[ROW][COL], char mineborad[ROW][COL], int a, int b, int row, int col)
{
if (borad[a][b] == ' ')
{
int mine = 0;
mine += Ismine(mineborad, a, b+1, ROW, COL);
mine += Ismine(mineborad, a+1, b, ROW, COL);
mine += Ismine(mineborad, a+1, b+1, ROW, COL);
mine += Ismine(mineborad, a, b-1, ROW, COL);
mine += Ismine(mineborad, a-1, b, ROW, COL);
mine += Ismine(mineborad, a-1, b-1, ROW, COL);
mine += Ismine(mineborad, a+1, b-1, ROW, COL);
mine += Ismine(mineborad, a-1, b+1, ROW, COL);
if (mine == 0)
{
borad[a][b] = '0';
if (b-1>=0)
{
Countmine(borad, mineborad, a, b-1, ROW, COL);
}
if (a-1>=0)
{
Countmine(borad, mineborad, a-1, b, ROW, COL);
}
if (a+1<row)
{
Countmine(borad, mineborad, a+1, b, ROW, COL);
}
if (b+1<col)
{
Countmine(borad, mineborad, a, b+1, ROW, COL);
}
}
else if (mine == 1)
{
borad[a][b] = '1';
}
else if (mine == 2)
{
borad[a][b] = '2';
}
else if (mine == 3)
{
borad[a][b] = '3';
}
else if (mine == 4)
{
borad[a][b] = '4';
}
else if (mine == 5)
{
borad[a][b] = '5';
}
else if (mine == 6)
{
borad[a][b] = '6';
}
else if (mine == 7)
{
borad[a][b] = '7';
}
else if (mine == 8)
{
borad[a][b] = '8';
}
}
}
//标记雷函数
int Markmine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y)
{
static int count = 0;
if (borad[x-1][y-1] == ' ')
{
borad[x-1][y-1] = '*';
if (mineborad[x-1][y-1] == '*')
{
count++;
}
if (count == 9)
{
count = 0;
count1 = 0;
return 3;
}
return 0;
}
else if (borad[x-1][y-1] == '*')
{
return 1;
}
else
{
return 2;
}
}
//取消标记
int Unmark(char borad[ROW][COL], int x, int y)
{
if (borad[x-1][y-1] == '*')
{
borad[x-1][y-1] = ' ';
return 0;
}
else
{
return 1;
}
}
game.h
#define ROW 9
#define COL 9
#include <stdio.h>
#include <Windows.h>
#include <time.h>
void Initializeborad(char borad[ROW][COL], int row, int col);
void Diskplay(char borad[ROW][COL], int row, int col);
void Minerand(char mineborad[ROW][COL], int row, int col);
int Demine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y, int row, int col);
int Ismine(char mineborad[ROW][COL], int x, int y, int row, int col);
void Countmine(char borad[ROW][COL], char mineborad[ROW][COL], int a, int b, int row, int col);
int Markmine(char borad[ROW][COL], char mineborad[ROW][COL], int x, int y);
int Unmark(char borad[ROW][COL], int x, int y);