说起扫雷,大家都应该很熟悉,一个棋盘上分布着几个雷,玩家选择坐标,若不行选中雷,则被炸死,游戏结束,若没有选中雷,则玩家获胜,游戏结束。
今天,我基于C语言来实现扫雷游戏,其具备的功能有:能够随机分布几个雷,若选中雷,则会显示失败,若成功避开雷,则会显示游戏成功。
game.h
#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
//定义雷阵的大小
#define ROWS 9
#define COLS 9
//默认雷的个数
#define DEFAULT_COUNT 10
//设置雷阵
void set_mine(char mine[ROWS + 2][COLS + 2], int row, int col);
//打印雷阵信息
void display(char board[ROWS + 2][COLS + 2], int row, int col);
//统计非雷区周围的雷的个数
int get_mine_count(char board[ROWS + 2][COLS + 2], int row, int col);
//游戏的主逻辑
void play_game(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2]);
#endif //__GAME_H__
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//产生随机数
int get_random_num(int m, int n)
{
return rand() % (n - m + 1) + m;
}
//设置雷阵
void set_mine(char mine[ROWS + 2][COLS + 2], int row, int col)
{
int count = DEFAULT_COUNT;
while (count)//雷的个数
{
int x = get_random_num(1, 10);
int y = get_random_num(1, 10);
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
//打印雷阵(排雷结果)信息
void display(char board[ROWS + 2][COLS + 2], int row, int col)
{
int i = 0;
int j = 0;
printf(" ");
for (i = 1; i <= ROWS; i++)
{
printf(" %d", i);
}
printf("\n");
for (i = 1; i <= COLS; i++)
{
printf("---");
}
printf("\n");
for (i = 1; i<row - 1; i++)
{
printf("%2d| ", i);
for (j = 1; j<col - 1; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//统计非雷区周围的雷的个数
int get_mine_count(char board[ROWS + 2][COLS + 2], int x, int y)
{
return (board[x - 1][y - 1] - '0') +
(board[x][y - 1] - '0') +
(board[x + 1][y - 1] - '0') +
(board[x + 1][y] - '0') +
(board[x + 1][y + 1] - '0') +
(board[x][y + 1] - '0') +
(board[x - 1][y + 1] - '0') +
(board[x - 1][y - 1] - '0');
}
//游戏的主逻辑
void play_game(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2])
{
while (1)
{
int x = 0;
int y = 0;
int win = 0;
printf("请输入坐标>:");
scanf("%d%d", &x, &y);
if (((x >= 1) && (x <= 10)) && ((y >= 1) && (y <= 10)))
{
if (mine[x][y] == '1')
{
printf("被炸死\n");
display(mine, ROWS + 2, COLS + 2);
break;
}
else
{
int ret = 0;
win++;
ret = get_mine_count(mine, x, y);
show[x][y] = ret + '0';
display(show, ROWS + 2, COLS + 2);
if (win == COLS*ROWS - DEFAULT_COUNT)
{
printf("雷排完了\n");
display(mine, ROWS + 2, COLS + 2);
break;
}
}
}
else
{
printf("坐标输入有误\n");
}
}
}
text.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void game()
{
char mine[ROWS + 2][COLS + 2];
char show[ROWS + 2][COLS + 2];
srand((unsigned int)time(NULL));
memset(mine, '0', (ROWS + 2)*(COLS + 2)*sizeof(char));
memset(show, '*', (ROWS + 2)*(COLS + 2)*sizeof(char));
set_mine(mine, ROWS + 2, COLS + 2);
display(mine, ROWS + 2, COLS + 2);
display(show, ROWS + 2, COLS + 2);
play_game(mine, show);
}
void menu()
{
printf("********************************************\n");
printf("************1.play********0.exit************\n");
printf("********************************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
运行之后会显示是否要开始游戏
选择1,开始游戏,需要玩家输入坐标
选中雷之后显示被炸死