Magical experience !!!
用C语言编写小游戏——扫雷
整体思路:程序主要通过两个大小相同的二维字符数组完成,其一为布雷数组
(mine[ ][ ])
,其二为显示数组
(show[ ][ ])
。
(1)布雷数组:
在此数组内,字符('0')代表没有雷,字符('1')代表有雷,这样便于后面对雷区分布的统计。先用字符('0')置满,再通过调用srand函数,来在数组内置出随机位置的雷。
(2)显示数组:
在此数组内,用字符('0'~'8')表示所找点周围雷的个数。先用字符('*')置满,再输入坐标点(x,y),进行排雷。若未踩中雷,则用ret纪录该点周围的雷数,并传给
show[x][y]
,作为显示,以此循环,直至扫完;若踩中雷,则游戏结束。
下面上代代码:
game.h
#ifndef __GAME_H__
#define __GAME_H__
#define COLS 11
#define ROWS 11
#define COL (COLS-2)
#define ROW (ROWS-2)
#define MAX 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void init_board(char mine[ROWS][COLS],char set, int row, int col);
void set_mine(char mine[ROWS][COLS]);
void display(char mine[ROWS][COLS], int row, int col);
int get_mine_count(char mine[ROWS][COLS], int x, int y);
#endif//__GAME_H__
game.c
#include "game.h"
void init_board(char mine[ROWS][COLS],char set, int row, int col)
{
memset(mine,set,row*col*sizeof(mine[0][0]));
}
void set_mine(char mine[ROWS][COLS])
{
int x = 0;
int y = 0;
int count = MAX;
srand((unsigned)time(NULL));
while (count)
{
x = rand()%ROW + 1;
y = rand()%COL + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
void display(char mine[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf(" ");
for (i = 1; i <= COL; i++)
printf("%d ", i);
printf("\n");
for (i = 1; i <= ROW; i++)
{
printf("%d ", i);
for (j = 1; j <= COL; j++)
{
printf("%c ", mine[i][j]);
}
printf("\n");
}
}
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
int count = 0;
count = mine[x-1][y-1] + mine[x][y-1] + mine[x+1][y-1] +mine[x+1][y] +
mine[x+1][y+1] + mine[x][y+1] + mine[x-1][y+1] + mine[x-1][y] - 8*'0';
return count;
}
test.c
#include "game.h"
enum Option
{
EXIT,
PLAY
};
void menu()
{
printf("****************************\n");
printf("****** 1.play 0.exit ******\n");
printf("****************************\n");
}
void game()
{
char mine[ROWS][COLS] = {0};
char show[ROWS][COLS] = {0};
int x = 0;
int y = 0;
int ret = 0;
int count = 0;
srand((unsigned int)time(NULL));
init_board(mine,'0',ROWS,COLS);
init_board(show,'*',ROWS,COLS);
set_mine(mine);
//display(mine,ROWS,COLS);
display(show,ROWS,COLS);
while (count<(ROW*COL)-MAX)
{
printf("请输入要排查的坐标:>");
scanf("%d%d",&x,&y);
if((x>=1)&&(x<=ROW)&&(y>=1)&&(y<=COL))
{
if(mine[x][y]!='1')
{
ret = get_mine_count(mine,x,y);
show[x][y] = ret +'0';
display(show,ROWS,COLS);
count++;
}
else
{
printf("您被炸死了QAQ\n");
break;
}
}
else
{
printf("输入有误,坐标越界\n");
}
}
if(count == ((COL*ROW)-MAX))
{
printf("恭喜您,扫雷成功!\n");
}
}
void test()
{
int input = 0;
do
{
menu();
printf("请输入:>");
scanf("%d",&input);
switch (input)
{
case PLAY:
game();
break;
case EXIT:
printf("exit\n");
break;
default:
printf("输入错误,重新选择:\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
下面是输出结果:
为了验证结果,先将两个数组输出。
现在我们模拟一下找雷的过程......
当输入坐标为雷时,很不幸,您被炸死了 QAQ
为了高效验证扫雷成功的结果,我们将雷数(
MAX)设置为最大,在此程序内为80。
以上是扫雷程序的全部过程和实现。。。