资阳建网站,职业学校查询网站,池州市建设工程造价管理网站,软件界面设计用什么软件目录
前言 制作菜单
构建游戏选择框架
实现游戏功能
模块化编程#xff1a;查看前节三子棋的内容
初始化雷区
编辑
优化棋盘
随机埋入地雷
点击后的决策 实现此功能代码
game#xff08;#xff09;#xff1b;的安排 前言
《扫雷》是一款大众类的益智小游戏查看前节三子棋的内容
初始化雷区
编辑
优化棋盘
随机埋入地雷
点击后的决策 实现此功能代码
game的安排 前言
《扫雷》是一款大众类的益智小游戏于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非地雷的格子同时避免踩到地雷踩到一个地雷全盘皆输。
玩家需要在雷区中将所有地雷一一排查出来9x9规格 test.c - - - - 测试游戏的逻辑 game.c - - - - 游戏代码的实现 game.h - - - - 游戏代码的声明 ( 函数声明符号定义 ) 制作菜单 在玩游戏时我们在进入游戏都会有菜单选项选择开始游戏推出游戏等这些指令说到选择那么我们可以依据我们所学的循环和分支语句来先完成基本框架的设计。
首先我们进入游戏都是先显示选项做出选择并且在玩游戏时玩一局还想玩怎么办想一想我们前边的知识哪种结构符合先进入游戏出现菜单再循环这一需求那肯定是do…while的循环结构更符合那么我们就先使用函数来打印输出一个菜单选项
void menu()
{printf(*****************************\n);printf(*****************************\n);printf(**********1.play^************\n);printf(**********0.exit^************\n);//菜单printf(*****************************\n);printf(*****************************\n);
}int main
{int a 0;do{menu();printf(请选择);scanf%d,a;}while();
return 0;
}
构建游戏选择框架
游戏菜单已在屏幕上显示完成现在需要完成选择并且在玩游戏时玩一局还想玩怎么办。
这时候需要应用博主之前阐述的switch语句来实现 int main()
{int input 0;do{menu();printf(PLEASE SELECT:);scanf(%d, input);switch(input){case 1:game(); //以上为界面的选择break;case 0:printf(Exit\n);break;default:printf(ERRO,PLEASE CHOOSE AGAIN\n);break;}} while (input);//while循环可以利用0为假其余为来实现用户可反复选择
//直到选到合适为止return 0;
} 实现游戏功能
模块化编程查看前节三子棋的内容 test.c:是用来实现游戏逻辑 game.c:用来实现游戏功能的函数 game.h:用来申明游戏功能函数可引用 使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等! 此为game.h的文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS//使用scanf函数的报错处理方式
#include stdio.h//打印函数的使用工具箱
#includeWindows.h//颜色函数和清屏指令的工具箱
#includestdlib.h//在使用rand的时候需要用到srand srand((unsigned int)time(NULL))随机函数调用一次就可以
#includetime.h
#define row 9//常量
#define col 9
#define cols col2//定义常量
#define rows row2
void initboard(char board[rows][cols],int hang, int lie,char set);//形参数
void displayboard(char board[rows][cols], int hang, int lie);//只设置9*9格子
void setmine(char board[rows][cols], int hang, int lie);//埋入地雷
void panduan(char show[rows][cols], char mine[rows][cols],int hang, int lie); 后边会逐个剖析 用来引用在test.c文件中 初始化雷区 首先映入眼帘的一定是 9×9 的雷区这 81 个被遮盖的格子 当我们随机的点击其中的格子时会出现以下二种情况 ① 当翻开的格子是地雷时玩家被炸“死”游戏结束 ② 当翻开的格子不是地雷时该格子会显示周围的 8 个格子存在的地雷的个数 由图例可以得出结论实现 9×9 的扫雷游戏创建一个 9 行 9 列的二维数组并不合适。 既然对 9 行 9 列的二维数组的边界元素进行操作时会导致数组越界访问那我们干脆就直接将二维数组扩大一圈将那些会导致越界访问的范围包括在数组内从源头上解决问题这是一个非常巧妙的办法 所以需要设置两个数组二维数组 1一个为储存埋雷数据的用于判断是否踩雷 2一个为展示给玩家的棋盘类似于上面的蓝色未知方块点开后显示周围8格雷数 需要将两个数组同时初始化initboard子函数
void initboard(char board[rows][cols], int hang, int lie,char set)
{int i 0;int j 0;for (i 0; i hang; i){for (j 0; j lie; j){board[i][j] set;}}
}//initboard(mine, rows, cols, 0);//在test.c中引用的函数
//initboard(show, row, col, *);
优化棋盘
由于雷区行号较长所以需要给每行列标注序号displayboard子函数
void displayboard(char board[rows][cols], int hang, int lie)
{int i 0;int j 0; printf(---------------------------------------\n);for(j 0; j lie; j){printf(%d ,j);}printf(\n);for (i 1; i hang; i){printf(%d , i);for (j 1; j lie; j){printf(%c , board[i-1][j-1]);}printf(\n);}printf(---------------------------------------\n);
} 效果图 随机埋入地雷
应为此为9x9雷区故10个雷足够。但怎么样实现随机在合适的区域内埋雷呢
C语言生成随机数的方法
void setmine(char board[rows][cols], int hang, int lie)//随机埋入地雷
{int count 10;while (count){int x rand() % hang ;int y rand() % lie ;if (board[x][y] 0){board[x][y] 1;}count--;}}//srand((unsigned int)time(NULL));//布置雷的随机时间函数在test.c主函数
中引用一次就够
点击后的决策
展开后周围多少雷
在扫雷游戏中当我们点击的方格不是地雷且周围一片区域都没有地雷时会直接展开一片雷区具体效果如下图 扫雷游戏中当玩家翻转一个方格时若该方格不是地雷则会显示该方格周围 8 个方格存在的地雷个数。如果该方格周围 8 个坐标都不存在地雷时会将这 9 个方格都展开以此类推直到遇到一个方格的周围 8 个方格存在地雷时停止展开两种情况如下图所 为实现这一功能则需要我们遍历玩家输入的坐标的周围 8 个坐标统计该坐标周围所存在的地雷个数。
int get_mine(char board[rows][cols],int x, int y)
{return (board[x - 1][y - 1] board[x - 1][y] board[x - 1][y 1] board[x][y 1] board[x][y - 1] board[x 1][y 1] board[x 1][y] board[x 1][y - 1] - 8* 0);//周围8个坐标相加
} 实现此功能代码
void Mark(char board[ROWS][COLS], int row, int col)
{int x 0;int y 0;while (1){printf(\n请输入要标记的坐标);scanf(%d %d, x, y);if (x 1 x row y 1 y col) //判断玩家输入坐标是否合法{if (board[x][y] !) //若坐标元素为 ! 则表示该坐标已被标记过{printf(\n该坐标已标记无需重复标记请重新输入\n);}else //该坐标未被标记{board[x][y] !; //将 ! 赋值给该坐标元素DisplayBoard(board, row, col); //将标记地雷后的雷区展示于玩家break;}}else{printf(\n坐标非法请重新输入\n\n);}}
}
game的安排
void game()
{char mine[rows][cols] { 0 };//存放雷的信息char show[rows][cols] { 0 };//显示给玩家的游戏界面信息initboard(mine, rows, cols, 0);initboard(show, row, col, *);//displayboard(mine, row, col);setmine(mine, row,col);displayboard(show, row, col);panduan(show,mine, row, col);
}好了以上内容到今天就结束了希望大家多多支持
其中一些内容借鉴了一些博主的希望大家谅解。