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

C语言实现扫雷。可以标记。

2018-04-01 21:36 866 查看
做这个游戏的思路是,因为要显示未扫出的坐标*,又要显示扫出的坐标,还要保存雷的坐标,显然一个数组实现起来有困难。不妨设置两个数组,一个存雷的坐标,另一个用来用户进行操作。

此代码实现了扫雷时候进行扩展,近似WIN系统里的扫雷。还可以进行标记雷的位置,防止扫错。

代码如下:

<game.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define ROW 11
#define COL 11
#define ROWS 9
#define COLS 9
#define MINE_NO 10

void init(char mine[ROW][COL],char show[ROW][COL],int row,int col);

void print(char arr[ROW][COL],int rows,int cols);

void arrmine(char mine[ROW][COL],int rows,int cols);

void selecoor(char mine[ROW][COL],char show[ROW][COL],int rows,int cols);

int countmine(char mine[ROW][COL],int x,int y);

void launchTL(char mine[ROW][COL],char show[ROW][COL],int rows,int cols);

void launchDR(char mine[ROW][COL],char show[ROW][COL],int rows,int cols);

<tset.c>
#include "game.h"

void game()
{
char mine[ROW][COL] = {0};
char show[ROW][COL] = {0};
init(mine,show,ROW,COL);  //初始化雷阵行列
arrmine(mine,ROWS,COLS);	//布置雷阵
print(mine,ROWS,COLS);		//打印雷阵
printf("***********************************\n");
print(show,ROWS,COLS);
selecoor(mine,show,ROWS,COLS);	//玩家选择雷坐标
}

void menu()
{
while(1)
{
int n = 0;
printf("*************************\n");
printf("*****     1.play    *****\n");
printf("*****     0.exit    *****\n");
printf("*************************\n");
printf("请选择:");
scanf("%d",&n);
if(n == 1)
{
printf("游戏开始!\n");
game();
}
else if(n == 0)
{
printf("退出游戏!\n");
break;
}
else
{
printf("输入错误,请重新输入。\n");
}
}
}
int main()
{
srand((unsigned int)time(NULL));
menu();
return 0;
}

<game.c>
#include "game.h"

void init(char mine[ROW][COL],char show[ROW][COL],int row,int col)
{
int i = 0,j = 0;
for(i=0 ;i<row ;i++)
{
for(j=0 ;j<col ;j++)
{
mine[i][j] = '0';
show[i][j] = '*';
}
}
}

void print(char arr[ROW][COL],int rows,int cols)
{
int i = 0,j = 0;
for(i=0 ;i<=rows+1 ;i++)
{
if(i<2)
{
printf("  ");
}
else
{
printf("%d ",i-1);
}
}
printf("\n");
for(i=0 ;i<=rows+1 ;i++)
{
printf("- ");
}
printf("\n");
for(i=1 ;i<=rows ;i++)
{
printf("%d ",i);
printf("| ");
for(j=1 ;j<=cols ;j++)
{
printf("%c ",arr[i][j]);
}
printf(" |");
printf("\n");
}
for(i=0 ;i<=rows+1 ;i++)
{
printf("- ");
}
printf("\n");
}

void arrmine(char mine[ROW][COL],int rows,int cols)
{
int x = 0,y = 0;
int i = MINE_NO;
while(i)
{
x = rand()%rows+1;
y = rand()%cols+1;
if(mine[x][y] != '1')
{
mine[x][y] = '1';
i--;
}
}
}

int countmine(char mine[ROW][COL],int a,int b)
{
return mine[a-1][b]+mine[a-1][b-1]+mine[a][b-1]+mine[a+1][b-1]+mine[a+1][b]
+mine[a+1][b+1]+mine[a][b+1]+mine[a-1][b+1]-8*'0';
}

void launchTL(char mine[ROW][COL],char show[ROW][COL],int rows,int cols,int x,int y)
{
if(show[x][y] == '0' && x>0 && x<=ROWS && y>0 && y<=COLS)
{
show[x-1][y] = countmine(mine,x-1,y)+'0';
launchTL(mine,show,ROWS,COLS,x-1,y);
show[x-1][y-1] = countmine(mine,x-1,y-1)+'0';
launchTL(mine,show,ROWS,COLS,x-1,y-1);
show[x][y-1] = countmine(mine,x,y-1)+'0';
launchTL(mine,show,ROWS,COLS,x,y-1);
}
}
void launchDR(char mine[ROW][COL],char show[ROW][COL],int rows,int cols,int x,int y)
{
if(show[x][y] == '0' && x>0 && x<=ROWS && y>0 && y<=COLS)
{
show[x+1][y] = countmine(mine,x+1,y)+'0';
launchDR(mine,show,ROWS,COLS,x+1,y);
show[x][y+1] = countmine(mine,x,y+1)+'0';
launchDR(mine,show,ROWS,COLS,x,y+1);
show[x-1][y+1] = countmine(mine,x-1,y+1)+'0';
launchDR(mine,show,ROWS,COLS,x-1,y+1);
}
}

void selecoor(char mine[ROW][COL],char show[ROW][COL],int rows,int cols)
{
int x = 0,y = 0,count1 = 0,i = 0,j = 0;
int o = 0,p = 0;
int s;
while(1)
{
int count2 = 0;
printf("请选择要排查的坐标:\n");
scanf("%d %d",&x,&y);
if(count1 == 0 && mine[x][y] == '1')
{
int n =1,tmp1 = 0,tmp2 = 0;
while(n)
{
tmp1 = rand()%rows+1;
tmp2 = rand()%cols+1;
if(mine[tmp1][tmp2] == '0')
{
mine[tmp1][tmp2] = '1';
mine[x][y] = '0';
n = 0;
}
}
}
count1 = 1;
if(show[x][y] == 'X')
{
printf("该坐标已被标记,请重新输入:\n");
continue;
}
printf("是否需要标记地雷?(1是/2否)\n");
scanf("%d",&s);
if(s == 1)
{
printf("请输入标记的坐标:\n");
scanf("%d %d",&o,&p);
show[o][p] = 'X';
}
if(show[x][y] != '*')
{
printf("该坐标已被排查或输入错误,请重新输入:\n");
continue;
}
if(mine[x][y] == '1')
{
printf("你被炸死了!\n");
print(mine,ROWS,COLS);
break;
}
show[x][y] = countmine(mine,x,y)+'0'; //计算周围雷数
launchTL(mine,show,ROWS,COLS,x,y);
launchDR(mine,show,ROWS,COLS,x,y);//展开无雷区
print(show,ROWS,COLS);
for(i=1 ;i<=rows ;i++)
{
for(j=1 ;j<=cols ;j++)
{
if(show[i][j] == '*')
{
count2++;
}
}
}
if(count2 == MINE_NO)
{
printf("你赢了。\n");
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐