思路如下:
*定义宏表盘为ROW*COL的规格 然后雷数为MINE
*定义宏 ROWS和COLS为ROW+2,COL+1,方便后期计算九宫格的雷数
*设定真实埋雷的函数
*设定显示给玩家的雷盘函数
*设定显示雷盘的函数
*设定埋雷函数
*设定输入函数
*设定判断函数
头文件如下
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define MINE 10
#define ROWS ROW+2
#define COLS COL+2
void Initiateshow(char boardshow[ROWS][COLS], int rows, int cols);
void Displayshow(char boardshow[ROWS][COLS], int rows, int cols);
void Setmine(char board[ROWS][COLS]);
void Display(char board[ROWS][COLS], int rows, int cols);
void Initiatejudge(char board[ROWS][COLS], int rows, int cols);
int Input(char board[ROWS][COLS], char boardshow[ROWS][COLS], int over);
void Scan(char board[ROWS][COLS], char boardshow[ROWS][COLS], int a, int b);
void game();
int Win(int win, int over);
逻辑主体如下,为常规的菜单、选择
void menu()
{
printf("************************\n");
printf("***** 1.PLAY *****\n");
printf("***** 2.QUIT *****\n");
printf("************************\n");
}
void choose()
{
printf("Plz input ur choice : ");
int i = 0;
int g = 1;
while (g)
{
scanf("%d", &i);
switch (i)
{
case 1:
game();
g = 0;
break;
case 2:
printf("Game over.");
g = 0;
break;
default:
printf("Plz try again : ");
}
}
}
void game()
{
char show[ROWS][COLS] = { 0 }; //用于显示的雷盘
char board[ROWS][COLS] = { 0 }; //用于判断的雷盘 -> 直接当作真实雷盘
Initiateshow(show, ROWS, COLS); //全#
Initiatejudge(board, ROWS, COLS); //全0
Setmine(board); //埋雷
Displayshow(show, ROWS, COLS); //打印各表盘
//Display(board, ROWS, COLS);
int over = 1;
while (over)
{
over = Input(board, show, over);
}
}
int main()
{
menu();
choose();
return 0;
}
然后是游戏函数主体
初始化函数:将展示给玩家的表盘全除了行标列标全设置为#,将真实的雷盘全设置为0
void Initiatejudge(char board[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = '0'; //初始化为0
}
}
}
void Initiateshow(char show[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
show[i][j] = '#'; // 将表盘初始化为#
}
}
}
打印表盘函数:
void Display(char board[ROWS][COLS], int rows, int cols) //只是设计出来为了看看雷
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++) //范围0~10
{
for (j = 0; j < cols; j++)
{
if (j != (cols - 1))
printf("%c ", board[i][j]);
else
printf("%c\n", board[i][j]);
}
}
}
void Displayshow(char show[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0, j = 0; j < cols; j++) //输入第一排的指示数字,只到9
{
if (j != (cols - 1))
printf("%d ", j);
else
printf("%c", j);
} //no problem
for (i = 1; i < rows-1; i++) //输入接下来排的指示数字
{
printf("%d ", i);
for (j = 1; j < cols-1; j++)
{
if (j != cols - 2)
printf("%c ", show[i][j]);
else
printf("%c\n", show[i][j]);
}
}
}
埋雷函数:常规的rand和if判断、循环
void Setmine (char board[ROWS][COLS])
{
srand((size_t)time(NULL));
int i = 0;
int r = 0;
int c = 0;
for (i = 0; i < MINE; i++) //设定十颗雷
{
int s = 1;
while (s)
{
int r = rand() % ROW;
int c = rand() % COL; //下标范围0~8 +1后下标范围1~9 总范围为0~10
if (board[r+1][c+1] == '0') //若位置为空 则埋雷* 否则继续寻找下一个空位置
{
board[r+1][c+1] = '*';
s = 0; //成功埋雷后跳出死循环
}
}
}
}
输入函数:、
????????为函数设置返回值,是为了实现结束前面死循环。在代码编写初期就遇到了无法结束死循环的问题,后来是发现函数没有设置返回值,导致前面的over值没有办法被改变,一直死循环,下面的函数同理。
? ? ? ? 嵌套了扫描函数,判断九宫格雷的个数;判断是否取得最终胜利的函数
int Input(char board[ROWS][COLS], char show[ROWS][COLS], int over)
{
int a = 0;
int b = 0;
printf("Plz input two number within 1~9 : ");
int g = 1;
int win = 0;
while (g)
{
scanf("%d %d", &a, &b); //a和b是输入的数 也是真实的下标
if (a >= 1 && a <= 9 && b >= 1 && b <= 9) //输入合法则进入判断程序, 死循环终止
{
if (board[a][b] != '*') //若没有雷,进入Scan函数,将四周雷数显示出来
{
Scan(board, show, a, b);
win++; //没有踩雷后win++
Win(win, over); //判断是否赢了
}
else //有雷 直接游戏结束
{
Displayshow(board, ROWS, COLS);
printf("Game over!\n");
over = 0;
}
g = 0;
}
else
printf("Plz try agin : "); //输入不合法则重新输入,死循环继续进行
}
return over;
}
void Scan(char board[ROWS][COLS], char show[ROWS][COLS], int a, int b) //在board上扫雷 在show上显示结果
{
int count = 0; //检测到又雷就++
int r = 0;
int c = 0;
for (r = a-1; r < a + 2; r++)
{
for (c = b - 1; c < b + 2; c++)
{
if (board[r][c] == '*')
count++;
}
} //计算完成
if (count != 0)
show[a][b] = count + '0'; //字符形式不能直接输出整型数字 而是对应的ASC码值 '0'+对应数字可以实现
else
show[a][b] = '0';
Displayshow(show, ROWS, COLS);
}
int Win(int win, int over)
{
if (win == ROW * COL - MINE)
{
printf("BINGO!!");
over = 0;
}
return over;
}
代码的不足:
? ? ? ?* 还是希望晚些时候可以学习一个函数,可以实现页面的刷新功能,将显示过的内容屏蔽
? ? ? ? *后期再尝试一下扫开一片无雷区的实现
|