用C语言实现扫雷小程序,小项目 : C语言实现扫雷小游戏

实现功能:

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

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

game.h

# ifndef __game_h_

# define __game_h_

#include #include #include # 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) && (i0) && (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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值