简易版扫雷的原理:在10x10的方格中存入1和0,1(即雷)由电脑随机产生并放入,玩家进行判断并输入<x,y>(x为列,y为行),若方格中为1,则玩家踩中雷,输出“Game Over”,若为0,则未踩中雷,显示周围的雷的数量并循环,直至判断出所有的0,玩家胜利.
首先,我们需引入头文件:
#ifndef _GAME_H_ #define _GAME_H_ #include<stdio.h> #include<windows.h> #include<time.h> #include<stdlib.h> #pragma warning(disable:4996) void setMine(); void display(); void getMine(); int getMineNum(); void game(); #define ROW 10 #define COL 10 #define MINE_NUM 20 #endif
其次,主函数
#include"game.h" void menu() { printf("##### 欢迎来到扫雷游戏 ####\n");//菜单(提示玩家进行选择) printf("###################################\n"); printf("##### 1.play 2.exit ####\n"); printf("###################################\n"); printf("please select:\n"); } int main() { do { int select = 0; menu(); scanf("%d", &select); switch(select){ case 1: game(); break; case 2: exit(0); default: printf("Enter error,try again!\n"); break; } } while (1); system("pause"); return 0; }
实现游戏的函数 game.c
#include"game.h" int getRandomNum(int start, int end)//获得放雷位置的随机数 { return rand() % (end - start + 1) + start; }
在表格的随机位置放置'1'(雷),完成布雷
void setMine(char mine[][COL+2], int row, int col)
{ int count = MINE_NUM; srand((unsigned long)time(NULL)); do { int x = getRandomNum(1, ROW); int y = getRandomNum(1, COL); if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } while (count ); }
打印并展示表格
static void display(char board[][COL+2], int row, int col)
{ int i = 1; printf(" "); for (;i <= COL;i++) { printf("%3d", i); } printf("\n"); for (i = 0;i <= COL;i++) { printf("---"); } printf("\n"); for (i=1;i <= ROW;i++) { printf("%2d|",i); int j = 1; for (;j <= COL;j++) { printf("%2c|",board[i][j]); } printf("\n"); } }
获得周围有雷的个数
int getMineNum(char mine[][COL+2],int row,int col, int x, int y)
{ return((mine[x - 1][y - 1] - '0') + (mine[x][y - 1] - '0')\ + (mine[x + 1][y - 1] - '0') + (mine[x - 1][y] - '0') \ +(mine[x + 1][y] - '0') + (mine[x - 1][y + 1] - '0') \ +(mine[x][y + 1] - '0') + (mine[x + 1][y + 1] - '0'));\ } void game()//实现扫雷的整个思路 { char mine[ROW + 2][COL + 2];//定义两个表格,一个用来展示给玩家,一个用来后台实现扫雷 char show[ROW + 2][COL + 2]; memset(show, '*', (ROW + 2)*(COL + 2));//展示表格全部赋上'*' memset(mine, '0', (ROW + 2)*(COL + 2)); setMine(mine, ROW + 2, COL + 2); int win = 0; do { int x = 0, y = 0; display(show, ROW + 2, COL + 2); printf("please enter <x,y>: \n"); scanf("%d %d", &x, &y); if (x >= 1 && x <= ROW && y >= 1 && y <= COL) { if (mine[x][y] == '1') { printf("Game Over!\n"); display(mine, ROW + 2, COL + 2); break; } else { int ret = getMineNum(mine, ROW + 2, COL + 2, x, y); show[x][y] = ret + '0'; win++; if (win == ROW * COL - MINE_NUM) { printf("Congratulation,you win!\n"); display(mine, ROW + 2, COL + 2); break; } } } else { printf("Enter error,try again!\n"); } } while (1); }
待完善,未加入展开函数和难度选择