扫雷游戏(第一次不被炸,展开)
引言
《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。
要求程序达到以下要求:
1.第一次下子,不炸死;
2.坐标周围没雷,可以实现展开。
下面我们以多文件的方式实现:
1.mine.h
2.main.c
3.mine.c
埋雷
int GetRandIndex(int start, int end) {//1->10
return rand() % (end - start + 1) + start;
}
void SetMine(char mine[][COL], int row, int col) {
srand((unsigned long)time(NULL));
int count = 0;
while (count < MINE_NUM) {
int x = GetRandIndex(1, 10);
int y = GetRandIndex(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(" %d ",i);
}
printf("\n----");
for (i=1; i <= 10; i++) {
printf("----");
}
printf("\n");
for (i = 1; i <= 10; i++) {
printf(" %2d |", i);
int j = 1;
for (j = 1; j <= 10; j++) {
printf(" %c |", board[i][j]);
}
printf("\n----");
int k = 1;
for (k=1; k <= 10; k++) {
printf("----");
}
printf("\n");
}
}
获得以某点为中心所在九宫格的周围埋雷情况
char GetMines(char mine[][COL], int row, int col) {
return 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';
}
展开周围棋盘
void OpenMine(char mine[][COL], char board[][COL], int x, int y) {
if (mine[x-1][y-1] == '0') {
board[x-1][y-1] = GetMines(mine, x-1, y-1);
}
if (mine[x-1][y] == '0') {
board[x-1][y] = GetMines(mine, x-1, y);
}
if (mine[x-1][y+1] == '0') {
board[x-1][y+1] = GetMines(mine, x-1, y+1);
}
if (mine[x][y-1] == '0') {
board[x][y-1] = GetMines(mine, x, y-1);
}
if (mine[x][y+1] == '0') {
board[x][y+1] = GetMines(mine, x, y+1);
}
if (mine[x+1][y-1] == '0') {
board[x+1][y-1] = GetMines(mine, x+1, y-1);
}
if (mine[x+1][y] == '0') {
board[x+1][y] = GetMines(mine, x+1, y);
}
if (mine[x+1][y+1] == '0') {
board[x+1][y+1] = GetMines(mine, x+1, y+1);
}
}
以上为该游戏的主要实现,下面我们看一下完整代码:
mine.h
#ifndef _MINE_H_
#define _MINE_H_
#pragma warning (disable:4996)
#define ROW 12//10+2
#define COL 12
#define MINE_NUM 20
#define TOTAL 100
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
void SetMine(char mine[][COL],int row,int col);
void ShowBoard(char board[][COL], int row, int col);
char GetMines(char mine[][COL], int row, int col);
void OpenMine(char mine[][COL], char board[][COL], int x, int y);
void Game();
#endif
main.c
#include "mine.h"
void Menu()
{
printf("##################################\n");
printf("## 欢迎进入扫雷游戏! ##\n");
printf("##################################\n");
printf("## 1.开始游戏 2.退出游戏 ##\n");
printf("##################################\n");
printf("请选择:");
}
int main()
{
int quit = 0;
int select = 0;
while (!quit) {
Menu();
scanf("%d", &select);
switch (select) {
case 1:
Game();
break;
case 2:
printf("再见!\n");
quit = 1;
break;
default:
printf("选择有误,请重新选择!\n");
break;
}
}
system("pause");
return 0;
}
mine.c
#include "mine.h"
int GetRandIndex(int start, int end) {//1->10
return rand() % (end - start + 1) + start;
}
void SetMine(char mine[][COL], int row, int col) {
srand((unsigned long)time(NULL));
int count = 0;
while (count < MINE_NUM) {
int x = GetRandIndex(1, 10);
int y = GetRandIndex(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(" %d ",i);
}
printf("\n----");
for (i=1; i <= 10; i++) {
printf("----");
}
printf("\n");
for (i = 1; i <= 10; i++) {
printf(" %2d |", i);
int j = 1;
for (j = 1; j <= 10; j++) {
printf(" %c |", board[i][j]);
}
printf("\n----");
int k = 1;
for (k=1; k <= 10; k++) {
printf("----");
}
printf("\n");
}
}
char GetMines(char mine[][COL], int row, int col) {
return 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';
}
void OpenMine(char mine[][COL], char board[][COL], int x, int y) {
if (mine[x-1][y-1] == '0') {
board[x-1][y-1] = GetMines(mine, x-1, y-1);
}
if (mine[x-1][y] == '0') {
board[x-1][y] = GetMines(mine, x-1, y);
}
if (mine[x-1][y+1] == '0') {
board[x-1][y+1] = GetMines(mine, x-1, y+1);
}
if (mine[x][y-1] == '0') {
board[x][y-1] = GetMines(mine, x, y-1);
}
if (mine[x][y+1] == '0') {
board[x][y+1] = GetMines(mine, x, y+1);
}
if (mine[x+1][y-1] == '0') {
board[x+1][y-1] = GetMines(mine, x+1, y-1);
}
if (mine[x+1][y] == '0') {
board[x+1][y] = GetMines(mine, x+1, y);
}
if (mine[x+1][y+1] == '0') {
board[x+1][y+1] = GetMines(mine, x+1, y+1);
}
}
void Game()
{
char mine[ROW][COL];
char board[ROW][COL];
memset(mine, '0', sizeof(mine));
memset(board, ' ', sizeof(board));
SetMine(mine, ROW, COL);
int count = TOTAL;
int x = 0;
int y = 0;
while (1) {
ShowBoard(board, ROW, COL);
printf("请输入你要选择的坐标:");
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';
char num = GetMines(mine, ROW, COL);
board[x][y] = num;
OpenMine(mine, board, x, y);
int ret = 1;
while (ret) {
int x = GetRandIndex(1, 10);
int y = GetRandIndex(1, 10);
if (mine[x][y] == '0') {
mine[x][y] = '1';
ret--;
break;
}
}break;
}
if (mine[x][y] == '0') {
char num = GetMines(mine, x, y);
board[x][y] = num;
OpenMine(mine, board, x, y);
count--;
if (count <= 20) {
printf("恭喜你,你赢了!\n");
break;
}
}
else {
printf("很遗憾,你被炸死了!\n");
ShowBoard(mine, ROW, COL);
break;
}
}
else {
printf("输入的坐标有误,请重新输入!\n");
}
system("cls");
}
}