扫雷是一款经典的益智类游戏,游戏的目标是通过简单的提示,避开地雷的坐标,达到扫雷的目的。
市面上大多数的扫雷游戏是在一个N*N的正方形棋盘上进行的,因此我们可以用一个简单的二维数组对棋盘进行建模,但由于玩家在游玩时无法看到地雷的具体位置,因此我们应建立两个数组,一个数组作为展示数组,在游玩时对玩家进行展示,另一个数组作为赋值数组,对棋盘上的情况进行记录;
另一方面,我们发现在游玩扫雷游戏时,踩到地雷,游戏结束,未踩到地雷,则游戏继续,并对玩家进行提示该位置附近的地雷数量,因此我们在这里当玩家每输入一个坐标时,我们要对该坐标及其周围的位置进行搜索,并将结果反馈到该坐标的展示棋盘上;
本次编码依然利用封装思想,将函数命名和函数本体以及测试函数进行封装。
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define ROW 11
#define COL 11
#define REROW 9
#define RECOL 9
#define MINECOUNT 80void InitBoard(char board[ROW][COL], int row, int col, char set);//初始化数组void Print_Board(char board[ROW][COL], int row, int col);//打印数组void Set_Mine(char board[ROW][COL], int row, int col);//设置地雷void Find_Mine(char mine[ROW][COL], char show[ROW][COL], int row, int col);//判断结果int Test_Around(char board[ROW][COL], int x, int y);//搜索附近地雷数量
菜单界面仅需一个简单的选择展示,让玩家通过输入0或1进行选择是否游玩即可,具体代码如下:
void menu()
{printf("********** MINE **********n");printf("********** 1start **********n");printf("********** 0exitt **********n");printf("请输入你的选择n");
}
游戏函数我们将各个模块函数集合在一起,形成一个集装函数的作用,当玩家选择游玩,则自动运行该函数流程,具体代码如下:
void game()
{char Set_Board[ROW][COL] = { 0 };//数值雷char Search_Board[ROW][COL] = { 0 };//游戏界面棋盘InitBoard(Set_Board, ROW, COL, '0');//赋值数组初始化InitBoard(Search_Board, ROW, COL, '*');//展示数组初始化Print_Board(Search_Board, REROW, RECOL);//打印展示数组Set_Mine(Set_Board,REROW,RECOL);//设置地雷位置Find_Mine(Set_Board,Search_Board,REROW,RECOL);//判断输赢
}
采用函数库中的memset函数进行初始化
void InitBoard(char board[ROW][COL], int row, int col, char set)
{memset(&board[0][0], set, row * col * sizeof(board[0][0]));
}
在这里我们仅需要运用最基本的数组思想和循环遍思想,将数组进行一一打印,值得注意的是,由于棋盘相对较大,我们设计了9*9的棋盘大小,直接用肉眼观测棋盘,难以观察到精确的坐标,因此我们应在边条打印对应的x-y坐标轴,以辅助玩家进行输入坐标
void Print_Board(char board[ROW][COL], int row, int col)
{for (int i = 0; i <= row;i++){printf("%d ", i);//打印一个x坐标}printf("n");for (int i = 1; i <= row;i++){printf("%d ", i);//打印一个y坐标for (int j=1;j<= col;j++){printf("%c ", board[i][j]);//打印具体对应的棋盘情况}printf("n");}printf("n");
};
我们这里利用time时间戳选取随机数字进行放置地雷
void Set_Mine(char board[ROW][COL], int row, int col)
{int count = MINECOUNT;while (count)//提前预设要放置的地雷{int x = rand() % row + 1;int y = rand() % col + 1;if(board[x][y]=='0')//在空的数组上进行防止地雷{board[x][y] = '1';count--;}}
}
我们进行九宫格检索,将数值求和并转化为整数类型,判断周围雷的数量
int Test_Around(char board[ROW][COL], int x, int y)
{return board[x-1][y+1] + board[x][y+1] + board[x+1][y+1] + board[x-1][y] +board[x+1][y] + board[x-1][y-1] + board[x][y-1] + board[x+1][y-1] - 8 * '0';
}
void Find_Mine(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col-MINECOUNT){printf("请输入要排查的坐标n");scanf("%d %d", & x, &y);if (x>=1 && x<=row && y>=1 && y<=col)//检查输入坐标合法性{if (show[x][y] == '*')//检查输入坐标是否重复检查{if (mine[x][y] == '1')//踩到雷{printf("你失败了n");Print_Board(mine, REROW, RECOL);break;}else{int count = Test_Around(mine, x, y);show[x][y] = count + '0';Print_Board(show, REROW, RECOL);//继续游戏win++;}}else{printf("该位置已被占用,请重新输入n");}}else{printf("输入坐标非法n");}if (win == row * col - MINECOUNT){printf("所有雷你已扫完n");Print_Board(mine, REROW, RECOL);break;}}
}
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define ROW 11
#define COL 11
#define REROW 9
#define RECOL 9
#define MINECOUNT 80void InitBoard(char board[ROW][COL], int row, int col, char set);//初始化数组void Print_Board(char board[ROW][COL], int row, int col);//打印数组void Set_Mine(char board[ROW][COL], int row, int col);//设置地雷void Find_Mine(char mine[ROW][COL], char show[ROW][COL], int row, int col);//判断结果int Test_Around(char board[ROW][COL], int x, int y);//搜索附近地雷数量
#include"game.h"void InitBoard(char board[ROW][COL], int row, int col, char set)
{memset(&board[0][0], set, row * col * sizeof(board[0][0]));
}void Print_Board(char board[ROW][COL], int row, int col)
{for (int i = 0; i <= row;i++){printf("%d ", i);//打印一个x坐标}printf("n");for (int i = 1; i <= row;i++){printf("%d ", i);//打印一个y坐标for (int j=1;j<= col;j++){printf("%c ", board[i][j]);//打印具体对应的棋盘情况}printf("n");}printf("n");
};void Set_Mine(char board[ROW][COL], int row, int col)
{int count = MINECOUNT;while (count)//提前预设要放置的地雷{int x = rand() % row + 1;int y = rand() % col + 1;if(board[x][y]=='0')//在空的数组上进行防止地雷{board[x][y] = '1';count--;}}
}int Test_Around(char board[ROW][COL], int x, int y)
{return board[x-1][y+1] + board[x][y+1] + board[x+1][y+1] + board[x-1][y] +board[x+1][y] + board[x-1][y-1] + board[x][y-1] + board[x+1][y-1] - 8 * '0';
}void Find_Mine(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col-MINECOUNT){printf("请输入要排查的坐标n");scanf("%d %d", & x, &y);if (x>=1 && x<=row && y>=1 && y<=col)//检查输入坐标合法性{if (show[x][y] == '*')//检查输入坐标是否重复检查{if (mine[x][y] == '1')//踩到雷{printf("你失败了n");Print_Board(mine, REROW, RECOL);break;}else{int count = Test_Around(mine, x, y);show[x][y] = count + '0';Print_Board(show, REROW, RECOL);//继续游戏win++;}}else{printf("该位置已被占用,请重新输入n");}}else{printf("输入坐标非法n");}if (win == row * col - MINECOUNT){printf("所有雷你已扫完n");Print_Board(mine, REROW, RECOL);break;}}
}
#include"game.h"
void menu()
{printf("********** MINE **********n");printf("********** 1start **********n");printf("********** 0exitt **********n");printf("请输入你的选择n");
}void game()
{char Set_Board[ROW][COL] = { 0 };//数值雷char Search_Board[ROW][COL] = { 0 };//游戏界面棋盘InitBoard(Set_Board, ROW, COL, '0');//赋值数组初始化InitBoard(Search_Board, ROW, COL, '*');//展示数组初始化Print_Board(Search_Board, REROW, RECOL);//打印展示数组Set_Mine(Set_Board,REROW,RECOL);//设置地雷位置Find_Mine(Set_Board,Search_Board,REROW,RECOL);//判断输赢
}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出成功n");break;default:printf("输入非法n");continue;}} while (input);return 0;
}
本文发布于:2024-01-30 15:42:07,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170660052821069.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |