我们要模范小游戏扫雷,需要我们完成以下几点:
1、在Windows系统下,先玩几把扫雷游戏,想一想它是如何实现的。
2、通过观察游戏,我们可以想到需要用两个二维数组来实现扫雷的功能。
3、游戏刚开始,需要需要显示棋盘,用“*”遮盖雷的坐标,所以要有一个填充棋盘的函数。
4、通过rand()函数,随机生成雷的坐标,埋雷的函数。
5、每次扫过后,都要显示新的棋盘,显示棋盘的函数,同时显示该坐标周围雷的个数,并在该坐标上显示出来。
6、如果要想第一次踩不到雷的,需要把该坐标下得雷移动到其他不是雷的坐标。
7、最后需要一个函数判断是否扫雷成功。
game.h
宏函数的定义如下:
#ifndef __GAME_H__
#define __GAME_H__
#define ROWS 12
#define COLS 12
#define M 10
void init_board(char board[ROWS][COLS],int rows,int cols,char ch);
void lay_mine(char board[ROWS][COLS],int rows,int cols,int m);
void dis_play(char board[ROWS][COLS],int rows,int clos);
void one_input(char board1[ROWS][COLS],int x,int y,int count);
int mine_count(char board1[ROWS][COLS],char board2[ROWS][COLS],int x,int y);
int check_win(char board[ROWS][COLS],int rows,int clos);
#endif//__GAME_H__
game.c
各个函数的功能实现代码
填充棋盘函数:
void init_board(char board[ROWS][COLS],int rows,int cols,char ch)
{
int i = 0;
int j = 0;
for(i = 0;i < rows;i++)
{
for(j = 0;j < cols;j++)
{
board[i][j] = ch;
}
}
}
随机埋雷的函数:
void lay_mine(char board[ROWS][COLS],int rows,int cols,int m)
{
int i = 0;
while(i<m)
{
while(1)
{
int x = (rand()%(ROWS-2))+1;
int y = (rand()%(COLS-2))+1;
if(board[x][y] != '1')
{
board[x][y] = '1';
break;
}
}
i++;
}
}
显示棋盘的函数:
void dis_play(char board[ROWS][COLS],int rows,int clos)
{
int i = 0;
int j = 0;
printf(" ");
for(i = 1;i<rows-1;i++)
{
printf("%3d",i);
}
printf("\n");
for(i = 0;i<rows-1;i++)
{
printf("---");
}
printf("\n");
for(i = 1;i < rows-1;i++)
{
printf("%2d|",i);
for(j = 1;j < clos-1;j++)
{
printf("%3c",board[i][j]);
}
printf("\n");
}
}
第一次输入坐标,保证踩不到雷
void one_input(char board1[ROWS][COLS],int x,int y,int count)
{
int x1 = 0;
int y1 = 0;
if((count == 1)&&(board1[x][y] == '1'))
{
while(1)
{
x1 = (rand()%(ROWS-2))+1;
y1 = (rand()%(COLS-2))+1;
if(board1[x1][y1] == '0') //把雷移走
{
int tmp;
tmp = board1[x][y];
board1[x][y] = board1[x1][y1];
board1[x1][y1] = tmp;
break;
}
}
}
}
计算该坐标周围雷的个数,判断是否踩到雷了
int mine_count(char board1[ROWS][COLS],char board2[ROWS][COLS],int x,int y) //周围雷的个数
{
if(board1[x][y] == '1') //踩到雷,返回‘b’
{
board2[x][y] = '1';
return 'b';
}
if(board1[x][y] == '0')
{
board2[x][y] = (board1[x-1][y-1] + board1[x-1][y] + board1[x-1][y+1] +
board1[x][y-1] + board1[x][y+1] +
board1[x+1][y-1] + board1[x+1][y] + board1[x+1][y+1]) - (7*48) ;
}
return 1;
}
判断输赢:
int check_win(char board1[ROWS][COLS],int rows,int cols)
{
int i = 0;
int j = 0;
int m = 0;
for(i = 1;i <rows-1; i++)
{
for(j = 1;j <cols-1;j++)
{
if(board1[i][j] != '*')
{
m++;
}
}
}
if(m == (100-M))
{
return 'n';
}
return 1;
}
test.c
main函数:
#include"game.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("******************************\n");
printf("***** 1.paly 2.exit ****\n");
printf("******************************\n");
}
void game()
{
int count = 0;
int ret = 0;
int x = 0;
int y = 0;
char mine[ROWS][COLS] ;
char show[ROWS][COLS] ;
init_board(mine,ROWS,COLS,'0');
init_board(show,ROWS,COLS,'*');
lay_mine(mine,ROWS,COLS,M);
dis_play(show,ROWS,COLS);
dis_play(mine,ROWS,COLS);
while(1)
{
printf("请输入坐标:");
while(1)
{
scanf("%d %d",&x,&y);
if(((x>10)||(x<1))||((y>10)||(y<1)))
{
printf("输入坐标有误,请重新输入!\n");
}
else
{
count++;
break;
}
}
one_input(mine,x,y,count); //第一次踩到雷不炸
//dis_play(mine,ROWS,COLS);
ret = mine_count(mine,show,x,y);
if(ret =='b')
{
break;
}
dis_play(show,ROWS,COLS);
ret = check_win(show,ROWS,COLS);
if(ret == 'n')
{
break;
}
}
if(ret == 'b')
{
printf("很遗憾,你被炸死了!\n");
}
if(ret == 'n')
{
printf("恭喜你,扫雷成功!\n");
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
while(1)
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 2:
return 0;
break;
default:
printf("选择错误,请重新选择:");
break;
}
}
system("pause");
return 0;
}
测试代码如下
设置雷的个数为99,第一次不炸,把该坐标的雷移到不是雷额地方,扫雷成功
设置雷的个数为98,输入两次才能踩到雷,扫雷失败
以上代码基本实现了扫雷的功能,希望对大家的学习有所帮助。