您的位置:首页 > 编程语言 > C语言/C++

基于C语言实现扫雷

2018-03-11 20:09 549 查看
说起扫雷,大家都应该很熟悉,一个棋盘上分布着几个雷,玩家选择坐标,若不行选中雷,则被炸死,游戏结束,若没有选中雷,则玩家获胜,游戏结束。今天,我基于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,开始游戏,需要玩家输入坐标


选中雷之后显示被炸死
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: