赞
踩
接下来,我们分步骤进行详细的解释说明。
在具体的项目实施中,我们需要分成不同的文件进行创建和书写,以此来保证项目的模块化。
那么在扫雷的实际书写中,
void menu()
{
printf("***********************\n");
printf("*****1、开始游戏*******\n");
printf("*****0、退出游戏*******\n");
printf("***********************\n");
}
接着,在main函数里面进行调用:
int main()
{
menu();
return 0;
}
这样目录的表面就写好了,接下来需要写玩家选择进入游戏和退出游戏的功能了
选择功能的逻辑:1进入游戏,0退出游戏。
显然,必备的库函数有scanf,switch、case和default。为了让游戏的体验更加良好,可以再加一个printf增加视觉上的游玩帮助,用户友好。
那么根据刚刚的逻辑,可以写出如下的选择结构,其中game函数虽然还没有写出来,但是整体的框架可以先确定下来,之后再往里慢慢写内容。
int main() { int input = 0; menu(); printf("请选择:--->"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("非法输入!请重试\n"); break; } return 0; }
因为扫雷是一个隐藏式的游戏,放雷的数组玩家是不能看到的,所以需要两个数组,一个用来存放雷,一个用来展示给玩家隐藏后的界面,用来游玩。
创建数组代码示范:
char mine[ROWS][COLS];
char show[ROWS][COLS];
这里的行和列,用自定义变量来代替,这样以后在想更改行列的时候就可以很方便了
自定义变量代码在头文件game.h中,代码示范:
#define ROW 9
#define COL 9
现在数组已经创建好了,由于没有进行初始化,数组里放的是一些“烫烫烫”之类的乱码。
所以需要写一个函数,给这两个数组进行初始化,这一步也是为之后的重玩奠定了基础。
代码思路:遍历数组每一个元素并赋值。
由于是给数组赋值,直接通过地址操作数组的,所以不需要返回值,直接void类型就可以。
至于接收值,需要接收:数组名、行、列、以及需要赋值的符号,这样才能让函数有效的对不同的数组进行初始化。
代码示范:
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
在game里面的函数:
void game()
{
char mine[ROWS][COLS];//用mine数组来放雷
char show[ROWS][COLS];//用show数组来展示隐藏后的雷区
InitBoard(mine, ROWS, COLS,'0');//把放雷的数组赋值成全0,这样可以方便之后的扫雷显示
InitBoard(show, ROWS, COLS, '*');//把隐藏后的雷区赋成*(这个换其他的符号也可以)
}
由于打印游戏界面是一个需要频繁进行的操作,无论是每次扫雷,还是被炸死的时候显示雷的位置,都需要打印。所以在这里,我们同样需要单独写一个函数来完成这个操作。
void DisplayBoard(char board[ROWS][COLS], int row, int col) { printf("------扫雷游戏------\n"); for (i = 0; i <= row; i++) { printf("%d ", i); //在第一行打印列数 } printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i);//在第一列打印行数 for (j = 1; j <= col; j++) { printf("%c ", board[i][j]);//打印每一位元素 } printf("\n"); } }
图片示例:
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
while (count) {
i = rand() % row+1;
j = rand() % col+1;
if (board[i][j] == '0')
{
board[i][j] = '1';
count--;
}
}
}
头文件的代码:
#define EASY_COUNT 10
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS] ,int row, int col) { int win = 0; while (win < col * row - EASY_COUNT) { printf("请输入要排查的坐标>:"); scanf("%d %d", &i, &j); if (i > 0 && i <= row && j > 0 && j <= col) { if (mine[i][j] == '1') { printf("很遗憾,你被炸死了\n"); DisplayBoard(mine, ROW, COL); break; } else { int count = GetCountMine(mine, i, j); show[i][j] = count + '0'; DisplayBoard(show, ROW, COL); win++; } } else printf("位置非法,请重新输入"); } if (win == col * row - EASY_COUNT) { printf("恭喜你,游戏胜利!\n"); } }
#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 row,int col,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS], int row, int col);
void FindMine(char board[ROWS][COLS], int row, int col);
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("********************\n"); printf("****** 1.play ******\n"); printf("****** 0.exit ******\n"); printf("********************\n"); } void game() { char mine[ROWS][COLS]; char show[ROWS][COLS]; InitBoard(mine, ROWS, COLS,'0'); InitBoard(show, ROWS, COLS, '*'); //DisplayBoard(mine, ROW, COL); 这里的展示棋盘是用来测试代码用的,实际应用不需要 DisplayBoard(show, ROW, COL); SetMine(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; }
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" int i, j = 0; void InitBoard(char board[ROWS][COLS], int row, int col, char set) { for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = set; } } } void DisplayBoard(char board[ROWS][COLS], int row, int col) { printf("------扫雷游戏------\n"); for (i = 0; i <= row; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } } void SetMine(char board[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while (count) { i = rand() % row+1; j = rand() % col+1; if (board[i][j] == '0') { board[i][j] = '1'; count--; } } } int GetCountMine(char mine[ROWS][COLS] ,int x,int y) { return (mine[x - 1][y + 1] + mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y + 1] + mine[x][y - 1] + mine[x + 1][y + 1] + mine[x + 1][y] + mine[x + 1][y - 1] - 8 * '0'); } void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS] ,int row, int col) { int win = 0; while (win < col * row - EASY_COUNT) { printf("请输入要排查的坐标>:"); scanf("%d %d", &i, &j); if (i > 0 && i <= row && j > 0 && j <= col) { if (mine[i][j] == '1') { printf("很遗憾,你被炸死了\n"); DisplayBoard(mine, ROW, COL); break; } else { int count = GetCountMine(mine, i, j); show[i][j] = count + '0'; DisplayBoard(show, ROW, COL); win++; } } else printf("位置非法,请重新输入"); } if (win == col * row - EASY_COUNT) { printf("恭喜你,游戏胜利!\n"); } }
如果本文对您有帮助,可不可以给我一个小小的点赞呀❤~您的支持是我最大的动力。
博主小白一枚,才疏学浅,难免有所纰漏,欢迎大家讨论和提出问题,博主一定第一时间改正。
谢谢观看嘿嘿(๑•̀ㅂ•́)و✧~!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。