win10系统取消了经典的扫雷游戏,闲来无事,用C语言写了一个简单扫雷小游戏。希望大家多多指正。
设计目标:通过C语言实现扫雷小游戏,能够判断胜负以及简单的人机交互。
成果如图:
代码:
game.h
#include<stdio.h>
#include<time.h>
#include <stdlib.h>
#define ROW 11 //展示时比实际数组小2,也就是一圈
#define COL 11
#define ROWS ROW + 2 //数组的实际大小
#define COLS COL + 2
#define Difficulty 10 //雷的数量
void InitBoard(char board[ROWS][COLS], int rows, int cols, char object); //初始化数组
void PrintBoard(char board[ROWS][COLS], int rows, int cols); //打印棋盘
void Setmine(char board[ROWS][COLS], int row, int col); //布雷
void clear(char show[ROWS][COLS], char mine[ROWS][COLS], int rows, int cols, int row, int col); //扫雷
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char object) //初始化数组
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = object;
}
}
}
void PrintBoard(char board[ROWS][COLS], int row, int col) //打印棋盘,只打印中间11行11列,外面一圈只用计算
{
int i = 1;
int j = 1;
printf("------------扫雷游戏----------------\n");
for (i = 1; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("------------扫雷游戏----------------\n");
}
void Setmine(char board[ROWS][COLS], int row, int col) //布雷
{
int x, y, i;
for (i = 1; i < Difficulty; i++)
{
x = rand() % row + 1; //产生0到row的row+1个随机,所以需要加1
y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
}
}
}
int win(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col) //检查是否胜利,无未开拓元素即为胜利。
{
int i = 1;
int j = 1;
for (i = 1; i < row; i++)
{
for (j = 1; j < col; j++)
{
if (show[i][j] == '*' && mine[i][j] != '1')
{
return 0;
}
}
}
return 1;
}
/*附近的雷数*/
int GetMineCont(char mine[ROWS][COLS],int x,int y) // int+'0' 就是int转char
{
return mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] +
mine[x - 1][y + 1] + mine[x][y + 1] + mine[x + 1][y + 1] +
mine[x - 1][y] + mine[x + 1][y] - 8 * '0'; //8个char型相加减去8个‘0’,就是char转int
}
void clear(char show[ROWS][COLS], char mine[ROWS][COLS],
int rows, int cols, int row, int col) //扫雷
{
int x,y,count,a,key;
key = 0;
while (1)
{
printf("请输入坐标(用空格隔开):\n");
scanf("%d%d", &x, &y);
if (x > 0 && x < row + 1 && y>0 && y < col + 1)
{
if (mine[x][y] == '1') //是否踩雷
{
count = 1;
break;
}
else
{
key++;
if (key == row * col - Difficulty) //判断是否已经排出来row * col - Difficulty个安全格
{
count == 0;
break;
}
a = GetMineCont(mine, x, y); //附近的雷数
show[x][y] = a + '0'; //附近的雷数
PrintBoard(show, ROW, COL);
}
}
else
{
printf("非法坐标重新输入\n");
}
}
if (count == 1)
{
printf("**************踩雷喽************\n");
PrintBoard(mine, ROW, COL);
}
else if(count == 0)
{
printf("**************赢了呦************\n");
PrintBoard(mine, ROW, COL);
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("********************************\n");
printf("*************0. exit************\n");
printf("*************1. play************\n");
printf("********************************\n");
}
void game()
{
char mine[ROWS][COLS]; //存放有无雷的信息
char show[ROWS][COLS]; //用于与用户交互
InitBoard(mine, ROWS, COLS, '0'); //用0初始化雷
InitBoard(show, ROWS, COLS, '*'); //用*初始化
PrintBoard(show, ROW, COL); //打印棋盘
Setmine(mine, ROW, COL); //在mine中放布雷信息,布雷区域为除外圈,所以只传输ROW
clear(show, mine, ROWS, COLS, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请选择----->");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("无效输入,请重新输入\n");
break;
}
} while (input);
return 0;
}
谢谢大家看到这里!!!