用C语言实现扫雷小游戏
程序员文章站
2024-03-18 12:26:28
...
多文件实现扫雷游戏,并满足:第一次不被炸死 ,当坐标周围没雷,可以实现展开
创建两个12*12的数组,一个实现埋雷等操作mine[12][12],另一个则是用户所见的界面board[12][12]。
在mine.h中进行一些文件引入和定义及声明
mine.h
#ifndef _MINE_H_
#define _MINE_H_
#pragma warning (disable:4996)
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include<time.h>
#define ROW 12
#define COL 12
#define MINE_NUM 20
#define TOTAL 100
void ShowBoard(char board[][COL], int row, int col);
void SetMine(char mine[][COL], int row,int col,int count);
char GetMine(char mine[][COL], char board[][COL], int row, int col);//char ->'0'-'8'
void Game();
#endif
在mine.c中进行扫雷游戏的实现
SetMine() :对mine[ROW][COL]进行埋雷操作
ShowBoard():玩家所见到的游戏界面
GetMine():当未踩到雷时,显示四周雷的个数,如果四周雷的个数为0,则对周围雷的个数进行展开。
GetRandIdex():通过time种子,获得埋雷的随机数
实现Game()的过程分析
- 先创建两个数组,并对其进行初始化和填充
- 对mine数组进行埋雷操作
- show一下board数组,让用户见到游戏界面
- 用户输入位置,判断输入是否合法
mine.c
#include"mine.h"
int GetRandIdex(int start, int end)
{
return rand() % (end - start + 1) + start;
}
void SetMine(char mine[][COL], int row, int col,int count)
{
srand((unsigned long)time(NULL));
int _count = 0;
while (_count < count)
{
int x = GetRandIdex(1, 10);
int y = GetRandIdex(1, 10);
if (mine[x][y] == '0')
{
mine[x][y] = '1';
_count++;
}
}
}
void ShowBoard(char board[][COL], int row, int col)
{
printf(" ");
int i = 1;
for (; i <= 10; i++)
{
printf("%3d", i);
}
printf("\n----");
for(i = 1; i <= 10; i++)
{
printf("---");
}
printf("\n");
for (i = 1; i <= 10; i++)
{
printf("%3d|", i);
int j = 1;
for (; j <= 10; j++)
{
printf(" %c|", board[i][j]);
}
printf("\n----");
int k = 1;
for (; k <= 10; k++)
{
printf("---");
}
printf("\n");
}
}
char GetMine(char mine[][COL],char board[][COL], int row, int col)
{
board[row][col] = (mine[row - 1][col - 1] + mine[row - 1][col] + mine[row - 1][col + 1] + \
mine[row][col - 1] + mine[row][col + 1] + mine[row + 1][col - 1] + \
mine[row + 1][col] + mine[row + 1][col + 1] - 7 * '0');//(+'0'-8*'0')
if (board[row][col] == '0')
{
if (board[row - 1][col - 1] == '?')
GetMine(mine, board, row - 1, col - 1);
if (board[row - 1][col] == '?')
GetMine(mine, board, row - 1, col);
if (board[row - 1][col + 1] == '?')
GetMine(mine, board, row - 1, col + 1);
if (board[row][col - 1] == '?')
GetMine(mine, board, row, col - 1);
if (board[row][col + 1] == '?')
GetMine(mine, board, row, col + 1);
if (board[row + 1][col - 1] == '?')
GetMine(mine, board, row + 1, col - 1);
if (board[row + 1][col] == '?')
GetMine(mine, board, row + 1, col);
if (board[row + 1][col + 1] == '?')
GetMine(mine, board, row + 1, col + 1);
}
}
void Game()
{
char mine[ROW][COL];
char board[ROW][COL];
memset(mine, '0', sizeof(mine));
memset(board, '?', sizeof(board));
SetMine(mine, ROW, COL, MINE_NUM);
int x = 0;
int y = 0;
int count = TOTAL;
while (1)
{
ShowBoard(board,ROW,COL);
printf("请选择坐标:\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW - 2 && y >= 1 && y <= COL - 2)
{
if (mine[x][y] == '1'&& count == TOTAL)
{
mine[x][y] = '0';
SetMine(mine, ROW, COL, 1);
count--;
}
if (mine[x][y] == '0')
{
GetMine(mine, board, x, y);
count--;
if (count <= 20)
{
printf("恭喜你,你已经获得了胜利!\n");
break;
}
}
else
{
printf("不好意思,你已经被炸死了!\n");
ShowBoard(mine, ROW, COL);
break;
}
}
else
{
printf("你输入的坐标有误,请重新输入:\n");
}
}
}
主函数实现,实现menu函数让用户进行选择进行游戏(调用Game()进入扫雷游戏)或退出游戏(选择2之间break退出循环)
main.c
#include"mine.h"
void Menu()
{
printf("###########################\n");
printf("###1.Play 2.Exit###\n");
printf("###########################\n");
printf("Please Select:");
}
int main()
{
int quit = 0;
int select = 0;
while (!quit)
{
Menu();
scanf("%d", &select);
switch (select)
{
case 1:
Game();
break;
case 2:
printf("拜拜!");
quit=1;
default:
printf("选择错误,请重新选择:");
break;
}
}
system("pause");
return 0;
}
上一篇: 进制/移位/位运算理解
下一篇: 洛谷P2054(扩展欧几里得)