1、主函数,源文件、部分
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
char set = 0;
//初始化棋盘
initBoard(mine,ROWS,COLS,'0');
initBoard(show, ROWS, COLS,'*');
//设置雷
Setmine(mine,ROW,COL, ESAY_COUNT);
//打印棋盘
Display(mine, ROW, COL); //打印布置雷的情况
Display(show, ROW, COL); //打印排查雷情况(界面)
//排查雷
FindMine(mine, show, ROW, COL);
}
void menu()
{
printf("*****************************\n");
printf("********** 1.play ***********\n");
printf("********** 0.exti ***********\n");
printf("*****************************\n");
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请输入:>\n");
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("退出游戏\n");
break;
}
default :
printf("输入错误,请重新输入\n");
}
} while (input);
return 0;
}
2、game.c 源文件部分
#include "game.h"
//标记雷
void mark(char show[ROWS][COLS],int row,int col)
{
int x = 0; int y = 0;
printf("请输入要标记的坐标\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//if (mine[x][y] == '1')
//{
// printf("你被炸死了,游戏结束\n");
// break;
//}
if (show[x][y] == '*')
{
show[x][y] = '#';
Display(show, ROW, COL);
}
else
{
printf("该坐标已核查不能标记,请输入其他坐标\n");
}
}
else
{
printf("坐标非法,请重新输入:>\n");
}
}
//如果不是雷,递归,展开一片区域
void DfsMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int row, int col,int* win)
{
int count = Getmine(mine, x, y); //统计雷的个数
show[x][y] = count + '0';
if(count!=0)
{
return;
}
int i = 0;
int Dfminex[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
int Dfminey[] = { 0, -1, -1, -1, 0, 1, 1, 1 };
for(i=0;i<8;i++)
{
int dx = x + Dfminex[i];
int dy = y + Dfminey[i];
if (dx >= 1 && dx <= row && dy >= 1 && dy <= col && mine[dx][dy] == '0' && show[dx][dy] == '*')
{
DfsMine(mine, show, dx, dy, row, col,win);
if (show[dx][dy] == '0'&count == 0)
{
show[dx][dy] = '0';
}
*win += 1;
}
}
}
//统计雷的个数
int Getmine(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 + 1][y] +
mine[x + 1][y + 1] + mine[x][y + 1] +
mine[x - 1][y + 1] + mine[x - 1][y] - 8 * '0');
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int input = 0;
int x = 0;
int y = 0;
int win = 0;
while (win < row * col - ESAY_COUNT)
{
printf("进入标记,请输入2,不标记请输入0\n");
scanf("%d", &input);
if (2 == input)
{
mark(show,ROW,COL);
}
else {
printf("请输入要排查的坐标:>\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("你被炸死了,游戏结束\n");
break;
}
else if (show[x][y] == '*'|show[x][y]=='#')
{
//show[x][y] = '0';
int count = Getmine(mine, x, y); //统计雷的个数
if (count == 0)
{
DfsMine(mine, show, x, y, row, col, &win);
printf("win=%d\n", win);
}
show[x][y] = count + '0';
Display(show, ROW, COL);
win++;
printf("win2=%d\n", win);
}
else
{
printf("该坐标已核查,请输入其他坐标\n");
}
}
else
{
printf("坐标非法,请重新输入:>\n");
}
if (win == ROW * COL - ESAY_COUNT)
{
printf("恭喜你,排雷成功\n");
Display(show, ROW, COL);
Display(mine, ROW, COL);
}
}
}
}
void Display(char board[ROWS][COLS], int row,int col) //打印棋盘
{
int i = 0;
int j = 0;
printf("----------扫雷游戏----------\n");
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for(j=1; j<= row; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void Setmine(char board[ROWS][COLS], int row, int col, int count) //设置雷
{
while (count)
{
//printf("count1=%d\n", count);
int i = rand() % row + 1;
int j = rand() % col + 1;
if (board[i][j] == '0')
{
board[i][j] = '1';
count--;
//printf("%d\n", count);
}
}
}
void initBoard(char board[ROWS][COLS],int rows,int cols,char set) //初始化
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
//printf("%c ", board[i][j]);
}
printf("\n");
}
printf("\n");
}
3、game.h 头文件 声明部分
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS 9+2
#define COLS 9+2
#define ESAY_COUNT 10
//初始化棋盘
void initBoard(char board[ROWS][COLS], int rows, int cols, char set);
//设置雷
void Setmine(char board[ROW][COL], int row, int col, int count);
//打印棋盘
void Display(char board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//统计雷的个数
int Getmine(char mine[ROWS][COLS], int row, int col);
2868

被折叠的 条评论
为什么被折叠?



