功能不全不会判断第一次不是雷的情况
还请大师门指导一下
game.c
#include"game.h"
//初始化棋盘
int InitBoard(char Board[ROWS][COLS], int row, int col , char str)
{
int i, j;
for (i = 0; i <= row + 1; i++)
{
for (j = 0; j <= col + 1; j++)
{
Board[i][j] = str;
}
}
return 0;
}
//打印棋盘
int DisPlayBoard(char board[ROWS][COLS], int row, int col)
{
printf("--------------------------扫 雷 游 戏---------------------------\n");
int i, j;
for (i = 0; i < 10; i++)
{
printf("%-7d", i);
}
printf("\n");
for (i = 1; i <= row ; i++)
{
printf("%-7d", i);
for (j = 1; j <= col ; j++)
{
printf("%-7c",board[i][j]);
}
printf("\n\n");
}
return 0;
}
//布置雷
int SetMine(char mine[ROWS][COLS], int row, int col)
{
int x, y;
int count = EASYCODE;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
return 0;
}
//排除雷
int FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x, y,w,z;
int cnt=0;
int count=0;
cnt = ROW * COL;
while (cnt!=EASYCODE)
{
printf("剩余%d个排雷区", cnt);
printf("输入坐标排雷:x-y:");
scanf_s("%d-%d", &x, &y);
count++;
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (mine[x][y] == '0')
{
if (count > 1)
{
while (1)
{
printf("输入已经确认雷的坐标(没有的话输入0键回车):w-z:");
scanf_s("%d-%d", &w, &z);
if (w == 0)
break;
LEI(show, ROW, COL, w, z);
}
}
optimzation(mine, show, row, col, x, y);//讲坐标周围的空区请空
DisPlayBoard(show, ROW, COL);//打印棋盘
cnt = Leeque(show, ROW, COL);
if (cnt == EASYCODE)
{
break;
}
}
else {
printf("很遗憾,踩到雷啦!再来一次");
DisPlayBoard(mine, ROW, COL);
}
}
else {
printf("输入错误");
}
}
if (cnt == EASYCODE)
{
printf("恭喜你挑战成功:");
}
}
//?的放置处
static int LEI(char show[ROWS][COLS], int row, int col, int w ,int z)
{
show[w][z] = '?';
return 0;
}
//计算show里的布雷区个数
static int Leeque(char show[ROWS][COLS], int row, int col)
{
int i, j, count = 0;
for (i = 1; i <= row ; i++){
for (j = 1; j <= col ; j++){
if (show[i][j] == '*'||show[i][j]=='?') {
count++;
}
}
}
return count;
}
//计算x-y周围的炸弹数量
static int GET_MINE(char mine[ROWS][COLS] , int x , int y)
{
return mine[x - 1][y - 1] + mine[x][y - 1] +
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 + 1][y] - 8 * '0';
}
//通过函数的递归来使x-y周围的为‘0’的显示出来
int optimzation(char mine[ROWS][COLS] , char show[ROWS][COLS] , int row , int col , int x , int y)
{
int flag = 0;
flag = GET_MINE(mine, x, y);
if (flag == 0)
{
show[x][y] = ' ';
if (x - 1 > 0 && x - 1 < row + 1 && y - 1 > 0 && y - 1 < col + 1 && show[x - 1][y - 1] == '*'){
optimzation(mine, show, ROW, COL, x - 1, y - 1);
}
if (x - 1 > 0 && x - 1 < row + 1 && y + 1 > 0 && y + 1 < col + 1 && show[x - 1][y + 1] == '*') {
optimzation(mine, show, ROW, COL, x - 1, y + 1);
}
if (x + 1 > 0 && x + 1 < row + 1 && y - 1 > 0 && y - 1 < col + 1 && show[x + 1][y - 1] == '*') {
optimzation(mine, show, ROW, COL, x + 1, y - 1);
}
if (x + 1 > 0 && x + 1 < row + 1 && y + 1 > 0 && y + 1 < col + 1 && show[x + 1][y + 1] == '*') {
optimzation(mine, show, ROW, COL, x + 1, y + 1);
}
if (x > 0 && x < row + 1 && y - 1 > 0 && y - 1 < col + 1 && show[x][y - 1] == '*') {
optimzation(mine, show, ROW, COL, x , y - 1);
}
if (x > 0 && x < row + 1 && y + 1 > 0 && y + 1 < col + 1 && show[x][y + 1] == '*') {
optimzation(mine, show, ROW, COL, x , y + 1);
}
if (x - 1 > 0 && x - 1 < row + 1 && y > 0 && y < col + 1 && show[x - 1][y] == '*') {
optimzation(mine, show, ROW, COL, x - 1, y );
}
if (x + 1 > 0 && x + 1 < row + 1 && y > 0 && y < col + 1 && show[x + 1][y] == '*') {
optimzation(mine, show, ROW, COL, x + 1, y );
}
}
else
{
show[x][y] = flag + '0';
}
return 0;
}
text.c
#include"game.h"
menu()//开始菜单
{
printf("********************************************************************\n");
printf("******************* '1' play game *******************\n");
printf("******************* '0' exit game *******************\n");
printf("********************************************************************\n");
}
game()//主游戏逻辑
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化棋盘
// 创建函数InitBoard()在game.c里实现
InitBoard(mine , ROW, COL , '0');
InitBoard(show , ROW, COL , '*');
//打印棋盘
DisPlayBoard(show, ROW, COL);
//布置雷
SetMine(mine,ROW,COL);
//DisPlayBoard(mine, ROW, COL);
//排查雷
FineMine(mine,show,ROW,COL);
}
int main()
{
initgraph(4200, 2000);
srand((unsigned)(time(NULL)));
int input = 0;
printf("\n请选择:(1-开始游戏;0-退出游戏;任意键退出游戏)\n");
do
{
menu();
printf("\n请选择:(1-开始游戏;0-退出游戏;任意键退出游戏)\n");
scanf_s("%d", &input);
printf("\n");
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新输入");
}
} while (input);
system("pause");
return 0;
}
game.h
#pragma once
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<ColorDlg.h>
//#include<graphics.h>
//#include<conio.h>
#pragma once
#define ROW 9
#define COL 9
#define ROWS 11
#define COLS 11
#define EASYCODE 10
//菜单面板
menu();
//主游戏逻辑
game();
//初始化棋盘
// 创建函数InitBoard()在game.c里实现
InitBoard(char Board[ROWS][COLS], int row, int col, char str);
//打印棋盘
DisPlayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
SetMine(char mine[ROWS][COLS], int row, int col);
FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);