认识游戏
相信大家对扫雷都不陌生!每台电脑必备的小游戏!
游戏规则
就是在规定的时间将埋藏的地雷全部找到,即游戏胜利!
胜利条件:你需要在不点错雷的情况下尽可能快的将所有的雷都标记出来,如果你点错,就得重新开始,所以扫雷也有一定的运气成分。
简单说
就是将所有不是雷的地方全部标记出来,剩下地雷,游戏胜利,如果标记点到了地雷,游戏失败!
如何找到不是地雷标记出来呢?
每点开一个小格子,如果是雷,就游戏结束,如果不是就会出现数字,出现的数字表示,周围一圈雷的个数!
2表示周围一圈的地雷数为2个。
根据这些数字即可将地雷全部排除走向胜利!
游戏框架
游戏框架和三子棋一样!
//游戏框架 int input = 0; do { menu();//菜单 scanf("%d", &input); //选择 switch (input) { case 1:game(); break; case 0:printf("退出游戏\n"); break; default:printf("输入错误,请重新输入\n"); break; } } while (input);
我们写小游戏的框架基本上都是这样!
游戏实现
游戏的实现是我们这个游戏的重点内容!
我们如何才能将游戏实现呢?
先从原理入手!
埋雷
如何买雷呢?
我们所玩的扫雷都是由许多小格子组成的矩阵!
所以我们可以利用二维数组埋地雷!
显示该点周围雷的个数
周围雷数的计算,就是判断改点周围是非为雷,并且计算个数显示给玩家!
判断游戏状态
点到地雷说明游戏结束,将所有地雷找到,游戏胜利。
实现思想
用一个二维数组埋雷
另一个二维数组显示给玩家
当我们将雷弄成AxA的雷阵藏雷,会发现如果我们进行周围雷数的查找是会发生数组越界,所以我们可以创建(A+2)x(A+2)的雷阵,然后埋雷在AxA中!
void game() { //初始化布雷数组—— > 初始化棋盘数组—— > //设置地雷—— > 显示棋盘—— > 玩家扫雷 //埋雷 char mine[ROWS][COLS] = { 0 }; //雷区图 char show[ROWS][COLS] = { 0 }; //玩家图 //初始化棋盘 InitBoard(mine, ROWS, COLS,'0'); InitBoard(show, ROWS, COLS, '*'); //设置地雷 SetMine(mine, ROW, COL,MineCount); PrintBoard(show, ROW, COL); //玩家扫雷 int count = ROW*COL-MineCount; while (CheckMine(mine,show, ROW, COL)) { count--; PrintBoard(show, ROW, COL); if (count == 0) { printf("恭喜你,游戏胜利\n"); PrintBoard(mine, ROW, COL); break; } } }
//初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col, char x) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { board[i][j] = x; } } return ; }
//打印棋盘 void PrintBoard(char board[ROW][COL], int row, int col) { int i = 0; //打印列号 for (i = 0; i <= col; i++) printf(" %d ", i); printf("\n"); for (i = 0; i < row; i++) { printf(" %d ", i+1); int j = 0; for (j = 0; j <col; j++) { printf(" %c ", board[i][j]); } printf("\n"); } return; }
//埋雷 void SetMine(char board[ROW][COL], int row, int col, int count) { while (count) { int i = rand() % row; int j = rand() % col; if (board[i][j] == '0') { board[i][j] = '1'; count--; } } }
核心代码
//查雷 int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col) { printf("请输入你要扫雷的坐标:>"); while (1) { int i = 0, j = 0; scanf("%d%d", &i, &j); if (i >=1 && i <= row && j >=1 && j <= col) { if (mine[i-1][j-1] != '1') { int count=IsMineCount(mine,i-1,j-1); show[i-1][j-1] = count+'0'; return 1; } else { printf("很遗憾,你被炸死了\n"); PrintBoard(mine, ROW, COL); return 0; } } } } int IsMineCount(char mine[ROW][COL], int x, int y) { int count = 0; int i= 0; for (i = x - 1; i <= x + 1; i++) { int j = 0; for (j = y - 1; j <=y + 1; j++) { if (mine[i][j] == '1') { count++; } } } return count; }
效果展示
全部代码
test.c文件
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void menu() { printf("******************************\n"); printf("********** 1.play ******\n"); printf("********** 0.exit ******\n"); printf("******************************\n"); printf("Input(1/0):>"); } void game() { //初始化布雷数组—— > 初始化棋盘数组—— > 设置地雷 //—— > 显示棋盘—— > 玩家扫雷 //埋雷 char mine[ROWS][COLS] = { 0 }; //雷区图 char show[ROWS][COLS] = { 0 }; //玩家图 //初始化棋盘 InitBoard(mine, ROWS, COLS,'0'); InitBoard(show, ROWS, COLS, '*'); //设置地雷 SetMine(mine, ROW, COL,MineCount); PrintBoard(show, ROW, COL); //玩家扫雷 int count = ROW*COL-MineCount; while (CheckMine(mine,show, ROW, COL)) { count--; PrintBoard(show, ROW, COL); if (count == 0) { printf("恭喜你,游戏胜利\n"); break; } } }
game.h文件
#pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define MineCount 6 void InitBoard(char board[ROWS][COLS],int row,int col,char x); void SetMine(char board[ROWS][COLS], int row, int col,int count); void PrintBoard(char board[ROW][COL], int row, int col); int CheckMine (char mine[ROWS][COLS], char show[ROW][COL], int row, int col); int IsMineCount(char mine[ROWS][COLS],int i, int j);
game.c文件
#include"game.h" void InitBoard(char board[ROW][COL], int row, int col, char x) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { board[i][j] = x; } } return ; } void SetMine(char board[ROW][COL], int row, int col, int count) { while (count) { int i = rand() % row; int j = rand() % col; if (board[i][j] == '0') { board[i][j] = '1'; count--; } } } void PrintBoard(char board[ROW][COL], int row, int col) { int i = 0; //打印列号 for (i = 0; i <= col; i++) printf(" %d ", i); printf("\n"); for (i = 0; i < row; i++) { printf(" %d ", i+1); int j = 0; for (j = 0; j <col; j++) { printf(" %c ", board[i][j]); } printf("\n"); } return; } int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col) { printf("请输入你要扫雷的坐标:>"); while (1) { int i = 0, j = 0; scanf("%d%d", &i, &j); if (i >=1 && i <= row && j >=1 && j <= col) { if (mine[i-1][j-1] != '1') { int count=IsMineCount(mine,i-1,j-1); show[i-1][j-1] = count+'0'; return 1; } else { printf("很遗憾,你被炸死了\n"); return 0; } } } } int IsMineCount(char mine[ROW][COL], int x, int y) { int count = 0; int i= 0; for (i = x - 1; i <= x + 1; i++) { int j = 0; for (j = y - 1; j <=y + 1; j++) { if (mine[i][j] == '1') { count++; } } } return count; }