扫雷游戏
游戏规则
棋盘大小为10*10,在棋盘中利用随机值设置20个雷,但并不显示在棋盘中。用户每次以坐标的形式输入位置,若此处有雷,则用户失败,否则,此处显示的值为其周围一圈的八个位置中雷的数目。直至将20个雷完全排除,用户获胜。
用户如果是第一次扫就扫到了雷,那么将这个雷转移到其他位置,使得用户可以继续玩下去。
思路:在埋雷时标记一个没有雷的位置,如果用户在第一次扫时扫到了雷,就将两个位置的内容进行交换,用户就能够继续游戏。
以下是具体代码:
game.h:
#pragma once
#ifndef _GAME_H_
#define _GAME_H_
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <windows.h>
#pragma warning(disable:4996)
#define ROW 12
#define COL 12
#define THUNDER '1'
void Play();
void Menu();
void ShowBoard(char board[][COL], int row, int col);
void SetMine(char board[][COL], int row, int col,int *x_p,int *y_p);
int GetCount(char board[][COL], int x, int y);
#endif // !1
main.c:
#include "game.h"
int main()
{
int quit = 0;
while (!quit)
{
Menu();
int select = 0;
scanf("%d", &select);
switch (select)
{
case 1:
Play();
break;
case 2:
quit = 1;
break;
default:
printf("您的输入有误,请重新输入!\n");
break;
}
}
printf("ByeBye!");
system("pause");
return 0;
}
游戏菜单:
void Menu() {
printf("###################################\n");
printf("#### 欢 迎 来 到 扫 雷 游 戏 ####\n");
printf("###################################\n");
printf("#### 1:Play 2:Exit #####\n");
printf("###################################\n");
printf("#### Select->> #######\n");
}
实现埋雷的函数:
在将20个雷埋完后,在棋盘中遍历找到一个非雷的位置,并将其标记。
void SetMine(char mine_board[][COL], int row, int col,int *x_p,int *y_p)
{
int count = (row-2) * (col-2) / 5;
while (count)
{
int x = rand() % 10 + 1;
int y = rand() % 10 + 1;
if (mine_board[x][y] != '0')
{
continue;
}
mine_board[x][y] = THUNDER;
count--;
}
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
{
if (mine_board[i][j] == '0')
{
*x_p = i;
*y_p = j;
break;
}
}
}
}
展示棋盘:
void ShowBoard(char board[][COL], int row, int col)
{
printf(" 1 2 3 4 5 6 7 8 9 10 \n");
printf(" ---------------------------------------------------\n");
for (int i = 1; i < row-1; i++)
{
printf(" %2d |", i );
for (int j = 1; j < col-1; j++)
{
printf(" %2c |", board[i][j]);
}
printf("\n");
printf(" ---------------------------------------------------\n");
}
}
计算当前位置周围雷数:
int GetCount(char board[][COL], int x, int y)
{
return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + board[x][y - 1] + \
board[x][y + 1] + board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1]-8*'0';
}
实现游戏的函数:
void Play()
{
srand((unsigned int) time(NULL));
char mine_board[ROW][COL];
char show_board[ROW][COL];
memset(mine_board, '0', sizeof(mine_board));
memset(show_board, '*', sizeof(show_board));
int no_x=0;
int no_y=0;
SetMine(mine_board, ROW, COL,&no_x,&no_y);
int times= (ROW - 2) * (COL - 2)*4 / 5;
int x = 0;
int y = 0;
do {
system("cls");
ShowBoard(show_board, ROW, COL);
printf("Please Enter<x,y>:");
scanf("%d %d", &x, &y);
if (x <= 0 || x > 10 || y <= 0 || y > 10)
{
printf("您的输入有误,请重新输入!\n");
continue;
}
if (mine_board[x][y]!='0'&&mine_board[x][y]!=THUNDER)
{
printf("此位置已扫过,请重新输入!\n");
continue;
}
if (mine_board[x][y] == THUNDER)
{
if (times == (ROW - 2) * (COL - 2) * 4 / 5)
{
mine_board[x][y] = '0';
mine_board[no_x][no_y] = '1';
}
else {
system("cls");
printf("很遗憾,你输了!\n");
ShowBoard(mine_board, ROW, COL);
break;
}
}
int count = GetCount(mine_board, x,y);
show_board[x][y] =count+'0';
times--;
} while (times>0);
printf("你玩的还不错,要不要再来一局?\n");
}