您的位置:首页 > 编程语言 > C语言/C++

小项目 : C语言实现扫雷小游戏

2017-11-11 14:31 736 查看
实现功能:

1.若第一次踩到雷,就将雷更换位置。

2若输入坐标周围没有雷,实现向外扩展。

game.h

# ifndef __game_h_
# define __game_h_
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

# define ROW 10 //定义行和列,任意可以更改
# define COL 10
# define ROWS (ROW + 2)
# define COLS  (COL + 2)
# define M 10 //定义雷的数目

void Init_Bor(int bor[ROWS][COLS], char ch); //初始化棋盘
void Printf_Bor(char bor[ROWS][COLS]); //打印棋盘
void Setmine(char bor[ROWS][COLS],int count); //设置雷
void First_Play(char bor[ROWS][COLS],char bor1[ROWS][COLS]);//保证第一次玩家不会踩到雷
int Sum_Around(char arr[ROWS][COLS], int i, int j); //计算周围雷的个数
int Play_Mine(char bor[ROWS][COLS],char bor1[ROWS][COLS]);//第二次及以后
void Expend_Bor(int arr[ROWS][COLS],char arr1[ROWS][COLS],int i,int j);//周围没有雷的时候向外扩展
int Is_Win(char bor[ROWS][COLS], int i, int j, int m);//判断输赢

# endif //__game_h_


test.c
//设置两个二维数组,一个用来计算雷的数目,初始化为全0;一个用来玩家操作,初始化为全‘*’

#include "GAME.h"
void menu()
{
printf("*************************\n");
printf("*   1:play     0:exit   *\n");
printf("*************************\n");
}
void GAME()
{
srand((unsigned int)time(NULL));
int T = 0;
int ret = 0;
int ret1 = 0;
char mine[ROWS][COLS] = { '0' };
char show[ROWS][COLS] = { '0' };
Init_Bor(mine, '0');
Init_Bor(show, '*');
Printf_Bor(show);
Setmine(mine,M);
while (1)
{
if (T == 0)
{
First_Play(mine, show);
T++;
}
else
{
ret = Play_Mine(mine, show);
if (ret == 1)
{
printf("很遗憾,你踩到雷了!\n");
break;
}
ret1 = Is_Win(show, ROWS, COLS, M);
if (ret1 == 1)
{
printf("排雷成功!\n");
Printf_Bor(show);
break;
}
}
Printf_Bor(show);
}
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
GAME();
break;
case 0:
printf("游戏结束!");
break;
default:
printf("请重新输入:>\n");
break;
}
} while (input);
system("pause");
return 0;
}


game.c

#include "GAME.h"
void Init_Bor(int bor[ROWS][COLS], char ch)
{
memset(bor, ch, ROWS*COLS*sizeof(char));
}
void Printf_Bor(char bor[ROWS][COLS]) //将棋盘规则打印,并附有横纵坐标
{
int i = 0;
int j = 0;

printf("     ");
for (j = 0; j < COLS - 2; j++)
{
printf("%2d ", j + 1);
}
printf("\n");

for (i = 1; i < ROWS - 1; i++)
{
printf("  %2d  ", i);
for (j = 1; j < COLS - 1; j++)
{
printf("%c  ", bor[i][j]);
}
printf("\n");
}
}
void Setmine(char bor[ROWS][COLS],int count)
{
int i = 0;
int j = 0;
int c = count;
while (c)
{
i = rand() % ROW + 1;
j = rand() % COL + 1;
if ((i > 0) && (j > 0) && (bor[i][j] == '0'))
{
bor[i][j] = '1';
c--;
}
}
}
void First_Play(char bor[ROWS][COLS], char bor1[ROWS][COLS])//玩家走的第一步,若是踩到雷便将雷移位
{
int i = 0;
int j = 0;
int I = 0;
int J = 0;
char sum = 0;
printf("请输入坐标:>");
scanf("%d%d", &i, &j);
if (bor[i][j] == '1')
{
while (1)
{
I = rand() % ROW + 1;
J = rand() % COL + 1;
if (bor[I][J] == '0')
{
bor[I][J] = '1';
break;
}
}
I = i;
J = j;
bor[I][J] == '0';
sum = Sum_Around(bor, I, J);
bor1[I][J] = sum;
Expend_Bor(bor, bor1, I, J);
}
else
{
Expend_Bor(bor, bor1, i, j);
}
}
int Sum_Around(char arr[ROWS][COLS], int i, int j)
{
int sum = 0;
sum = (arr[i - 1][j - 1] + arr[i][j - 1] + arr[i + 1][j - 1]
+ arr[i + 1][j] + arr[i + 1][j + 1] + arr[i][j + 1]
+ arr[i - 1][j + 1] + arr[i - 1][j] - 7 * '0');
return sum;
}
int Play_Mine(char bor[ROWS][COLS], char bor1[ROWS][COLS])
{
int i = 0;
int j = 0;
int I = 0;
int J = 0;
printf("请输入坐标:>");
scanf("%d%d", &i, &j);
while (1)
{
if (bor1[i][j] == ' ')
{
printf("此处已经排过雷,请重新输入!\n");
scanf("%d %d", &i, &j);
}
else
{
break;
}
}
if (bor[i][j] == '0')
{
Expend_Bor(bor, bor1, i, j);
return 0;
}
else
{
return 1;
}
return 0;
}
void Expend_Bor(int arr[ROWS][COLS], char arr1[ROWS][COLS], int i, int j)
{
int sum = 0;
sum = Sum_Around(arr, i, j);
if (sum == '0')
{
arr1[i][j] = ' ';
}
else if (sum > '0')
{
arr1[i][j] = sum;
}
if ((sum <= '0') && (i > 0) && (i<ROWS - 1) && (j>0) && (j < COLS - 1))
{

if ((arr1[i - 1][j - 1] == '*'))//左上
{
Expend_Bor(arr, arr1, i - 1, j - 1);
}

if ((arr1[i][j - 1] == '*'))//左方
{
Expend_Bor(arr, arr1, i, j - 1);
}

if ((arr1[i + 1][j - 1] == '*'))//左下
{
Expend_Bor(arr, arr1, i + 1, j - 1);
}

if ((arr1[i + 1][j] == '*'))//下方
{
Expend_Bor(arr, arr1, i + 1, j);
}

if ((arr1[i + 1][j + 1] == '*'))//右下
{
Expend_Bor(arr, arr1, i + 1, j + 1);
}

if ((arr1[i][j + 1] == '*'))//右方
{
Expend_Bor(arr, arr1, i, j + 1);
}

if ((arr1[i - 1][j + 1] == '*'))//右上
{
Expend_Bor(arr, arr1, i - 1, j + 1);
}

if ((arr1[i - 1][j] == '*'))//上方
{
Expend_Bor(arr, arr1, i - 1, j);
}
}
}
int Is_Win(char bor[ROWS][COLS], int i, int j, int m)
{
int count = 0;
for (i = 1; i < ROWS - 1; i++)
{
for (j = 1; j < COLS - 1; j++)
{
if (bor[i][j] == '*')
{
count++;
}
}
}

if (count == m)
{
for (i = 1; i < ROWS - 1; i++)
{
for (j = 1; j < COLS - 1; j++)
{
if (bor[i][j] == '*')
{
bor[i][j] = 'M';//若玩家胜出,则将全部有雷的地方显示为M
}
}
}
return 1;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: