扫雷游戏的分析和设计
扫雷游戏用代码
1.需要菜单控制进入或退出游戏
2.扫雷游戏的规格,即棋盘的大小,雷的数量
3.如何布置雷,如何排查雷
首先,每一个游戏开始需要一个菜单,而这个菜单如何设计呢!
#include<stdio.h>
void menu()
{printf("*********************n");printf("***** 1.play *****n");printf("***** 0.exit *****n");printf("*********************n");}
int main()
{int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏n");break;default:printf("选择错误,重新选择n");break;}} while (input);return 0;
}
这样一个很简单的菜单就写好了。
menu函数先做出提示,输入合理的数字switch进行选择,这些都是我们C语言中所学的一些简单的语句。
现在我们菜单已经做好了
那游戏内容如何设计呢,,也就是如何设计我们这个game函数呢!
首先我们需要确定几个目的,第一我们要在game里面实现什么,——什么呢!我觉得有棋盘的打印,雷的布置与雷的排查。
那棋盘如何打印呢
首先我们需要两个棋盘一个是我们打游戏的时候看到的棋盘,一个是展示随机雷位置的棋盘
那如何实现呢,这时我们需要两个数组
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}void game()
{char mine[ROWS][COLS];//'0'char show[ROWS][COLS];//'*'InitBoard(mine, ROWS, COLS,'0');InitBoard(show, ROWS, COLS,'*');
}
那如何打印
我们再设计一个函数,用循环不断打印它的行列。
那如何布置雷呢
void SetMuine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}
但由于我们想要使用rand,所以需要添加srand,但由于只需要调用一次,此时我们直接给主中加入这句话
srand((unsigned int)time(NULL));
或者我写的更清楚一些
int main()
{int input = 0;srand((unsigned int)time(NULL));do{.......} while (input);return 0;
}
还有要添加头文件哦
#include<stdlib.h>
#include<time.h>
那如何探雷呢
int GetMineCount(char mine[ROWS][COLS],int x,int y)
{return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col- EASY_COUNT){printf("请输入要排查的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("输入错误,请重新输入n");}if (mine[x][y] == '1'){printf("很遗憾,你被炸死了n");DisplayBoard(mine, ROW, COL);break;}else{int count = GetMineCount(mine, x, y);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);win++;}}else{printf("坐标非法,重新输入n");}}if (win == row * col - EASY_COUNT){printf("恭喜你排雷成功n");DisplayBoard(mine, ROW, COL);}
}
现在我们要的基本的功能就齐了,但是,如果放在一个源文件里面打眼望去代码太多了。
那此时我们在原有的基础上建立一个源文件和头文件,源文件负责放开始时的文件中game所需要的功能,头文件负责集聚所需要的库函数与所需要调用的数据。
如此综上所述:
开始建立的test.c文件中的代码为
#include"game.h"
void menu()
{printf("*********************n");printf("***** 1.play *****n");printf("***** 0.exit *****n");printf("*********************n");}
void game()
{char mine[ROWS][COLS];//'0'char show[ROWS][COLS];//'*'InitBoard(mine, ROWS, COLS,'0');InitBoard(show, ROWS, COLS,'*');//棋盘的打印//DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);//布置雷SetMuine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);
}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏n");break;default:printf("选择错误,重新选择n");break;}} while (input);return 0;
}
游戏功能的实现:game.c中的代码为
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;printf("--------扫雷游戏-------n");for (i = 0; i <= row; i++){printf("%d ", i);}printf("n");for (i = 1; i <= row; i++){printf("%d ", i);int j = 0;for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("n");}printf("--------扫雷游戏-------n");
}void SetMuine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}int GetMineCount(char mine[ROWS][COLS],int x,int y)
{return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col- EASY_COUNT){printf("请输入要排查的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("输入错误,请重新输入n");}if (mine[x][y] == '1'){printf("很遗憾,你被炸死了n");DisplayBoard(mine, ROW, COL);break;}else{int count = GetMineCount(mine, x, y);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);win++;}}else{printf("坐标非法,重新输入n");}}if (win == row * col - EASY_COUNT){printf("恭喜你排雷成功n");DisplayBoard(mine, ROW, COL);}
}
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 EASY_COUNT 10
//函数声明//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘的
void DisplayBoard(char board[ROWS][COLS], int rows, int cols);
//布置雷
void SetMuine(char mine[ROWS][COLS],int row,int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
现在这个扫雷游戏就可以简单的实现啦!
本文发布于:2024-01-27 22:23:19,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063653982992.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |