game.h
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
#define HARD_COUNT 40
void Init_showboard(char showboard[ROW][COL], int row, int col);//初始化要展示的棋盘
void put_showboard(char showboard[ROW][COL], int x, int y, int count);
void Init_mineboard(char mineboard[ROWS][COLS], int row, int col);//初始化布雷的棋盘
int GetMineCount(char board[ROWS][COLS], int x, int y);//统计周边雷的个数
void Move_mine(char mineboard[ROWS][COLS]);//将雷移走
void put_mine(char mineboard[ROWS][COLS]);
void send_mine(char mineboard[ROWS][COLS], char showboard[ROW][COL], int x, int y);//扩展扫雷
int Add(char showboard[ROW][COL]);//统计成功扫雷个数
#endif
game.c
#include "game.h";
//设置展示的扫雷棋盘
void Init_showboard(char showboard[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < col + 1; i++)//打印横轴坐标
{
printf("%d ", i);
if (i == col)
printf("\n");
}
for (i = 1; i <= row; i++)
{
printf("%d ", i);//打印竖轴坐标
for (j = 0; j < col; j++)
printf("%c ", showboard[i-1][j]);
printf("\n");
}
}
//打印输出坐标后该点周围雷的个数
void put_showboard(char showboard[ROW][COL],int x,int y,int count)
{
showboard[x-1][y-1] = count+48;
Init_showboard(showboard, ROW, COL);
}
//设置雷
void put_mine(char mineboard[ROWS][COLS])
{
int count = EASY_COUNT;//总共有雷的个数
int x = 0;
int y = 0;
while (count)
{
x = rand() % 9 + 1;
y = rand() % 9 + 1;
if (mineboard[x][y] == '0')
{
mineboard[x][y] = '1';
count--;
}
}
}
//打印布雷的棋盘
void Init_mineboard(char mineboard[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < col+1; i++)
{
printf("%d ", i);
if (i == col)
printf("\n");
}
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <=col; j++)
printf("%c ", mineboard[i][j]);
printf("\n");
}
}
//统计一点周围雷的个数
int GetMineCount(char board[ROWS][COLS], int x, int y)
{
int count = 0;
int i = 0;
int j = 0;
for (j = x - 1; j <= x + 1; j++)
{
for (i = y - 1; i <= y + 1; i++)
{
if (board[j][i] == '1')
count++;
}
}
return count;
}
//当第一个扫到雷时,不能被炸死,将雷移走
void Move_mine(char mineboard[ROWS][COLS])
{
int x = 0;
int y = 0;
x = rand() % 9 + 1;
y = rand() % 9 + 1;
if (mineboard[x][y]=='0')
{
mineboard[x][y] ='1';
}
}
//扩展,以一点为中心,向外扩展统计其周围每一点周围的雷的个数
void send_mine(char mineboard[ROWS][COLS], char showboard[ROW][COL],int x,int y)
{
if (((x > 0) && (x < ROWS - 1) && (y>0) && (y < COLS - 1)))
{
if (mineboard[x - 1][y] == '0')
{
showboard[x - 1][y] = GetMineCount(mineboard, (x-1),y) + '0';
}
if (mineboard[x - 1][y - 1] == '0')
{
showboard[x - 1][y - 1] = GetMineCount(mineboard,( x-1),( y-1)) + '0';
}
if (mineboard[x][y - 1] == '0')
{
showboard[x][y - 1] = GetMineCount(mineboard, x, (y-1)) + '0';
}
if (mineboard[x + 1][y - 1] == '0')
{
showboard[x + 1][y - 1] = GetMineCount(mineboard, (x + 1), (y - 1) )+'0';
}
if (mineboard[x + 1][y] == '0')
{
showboard[x + 1][y] = GetMineCount(mineboard, (x + 1), y) + '0';
}
else
{
/*show[x + 1][y] = '0'*/;
}
if (mineboard[x + 1][y + 1] == '0')
{
showboard[x + 1][y + 1] = GetMineCount(mineboard, (x + 1), (y + 1)) + '0';
}
if (mineboard[x][y + 1] == '0')
{
showboard[x][y + 1] = GetMineCount(mineboard, x, (y + 1)) + '0';
}
if (mineboard[x - 1][y + 1] == '0')
{
showboard[x - 1][y + 1] = GetMineCount(mineboard, (x - 1), (y + 1)) + '0';
}
}
}
//统计排除雷的个数
int Add(char showboard[ROW][COL])
{
int i = 0;
int j = 0;
int k = 0;
for (i = 0; i < ROW;i++)
for (j = 0; j < COL; j++)
{
if (showboard[i][j] == '*')
k++;
}
return k;
}
游戏.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//打印菜单
void menu()
{
printf("*****************************************\n");
printf("******* 1.play 0.exit ********\n");
printf("*****************************************\n");
}
//游戏的基本实现
void game(char mineboard[ROWS][COLS],char showboard[ROW][COL])
{
int x = 0;
int y = 0;
int count = 0;
int flag = 0;
int win = 0;
do
{
++flag;
getchar();
if (((x > 0) && (x < rows - 1) && (y>0) && (y < cols - 1)) != 1)
{
printf("输入地址不存在,请重新输入:>");
}
printf("玩家请输出坐标:");
scanf("%d%d", &x, &y);
if (mineboard[x][y] == '1'&&flag == 1)//第一次不能被炸死
{
mineboard[x][y] = '0';
Move_mine(mineboard);
printf("移走雷后的棋盘:\n");
Init_mineboard(mineboard, ROW, COL);
printf("\n");
}
if (mineboard[x][y] == '1')
{
printf("炸死了!\n");
break;
}
else
{
count = GetMineCount(mineboard, x, y);//统计扫雷点周围雷的个数
send_mine(mineboard, showboard, x, y);//延展扫雷
put_showboard(showboard, x, y, count);//输出延展后的棋盘
}
} while (Add(showboard) < EASY_COUNT);
if (Add(showboard) == EASY_COUNT)//判断是否扫雷成功
{
printf("恭喜扫雷成功!\n");
return ;
}
}
int main()
{
char mineboard[ROWS][COLS];
char showboard[ROW][COL];
int n = 0;
srand((unsigned)time(NULL));
do
{
menu();
scanf("%d", &n);
if (n == 1)
{
printf("展示棋盘:\n");
memset(showboard, '*', (ROW)*(COL));
Init_showboard(showboard, ROW, COL);
memset(mineboard, '0', (ROWS)*(COLS));
printf("设置雷:\n");
put_mine(mineboard);
Init_mineboard(mineboard, ROW, COL);
game(mineboard,showboard);
}
else if (n == 0)
{
printf("退出游戏!");
break;
}
else
{
printf("输入错误,请重新输入:");
}
} while (1);
system("pause");
return 0;
}
第二次写小游戏了,很多的代码写都不够精炼,调理也不是很清晰,请大神们多多指错和不足!!!