猜数字的实现
1游戏面板
2游戏主体
1雷盘的创建
1雷盘的创建很容易想到用二维数组数组的元素
1雷2无雷3显示多少雷4未知的雷面
2用两个数组
1
mine一个用作显示雷和无雷
show一个显示未知的雷面和多少雷
2大小为11 * 11(后面有说明)
2雷盘的初始化
1如果想要用一个函数就进行对mine和show的初始化
- 数组需要同一元素(方便后续初始化传入同一类型元素)
全为字符是个不错的选择
mine一个用作显示雷字符'1'和无雷字符'0'
show一个显示未知的雷'*'和多少雷'字符数字'
2初始化
mine全为无雷'0'
show全为未知的雷面'*'
3雷的设置
可以用随机数--设置随机坐标--录入mine中显示雷'1'
4查找雷
输入坐标 - 坐标与mine中的雷对应 - 则在show中展示旁边八格中雷的数字
显示雷数 - 由于'1''0'的asc码分别为48, 49 - 那么 '1' - '0' = 1
即'数字字符'-'0'=对应的数字
统计mine中一个雷周围8个元素的和再减去8*'0'--即可得到雷数
再将雷数加'0',得到字符数字传到show中
由于需要检索附近的雷数,因此创建11*11的数组更合适
(使用9*9的第一列最后一列第一行最后一行的元素都无法统计到
有数组越界的风险)
在game.h中
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define ROWS ROW+2
#define COLS COL+2
#define ROW 35
#define COL 35
#define EASY 30
#include<stdlib.h>
#include<time.h>
//游戏面板
void menu();
//游戏主体
void game();
//雷盘的初始化
void Init_Board(char board[ROWS][COLS], int rows, int cols,char set);
//雷的设置
void Set_Mine(char mine[ROWS][COLS],int row,int col);
//4查找雷
void Find_Mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
//获得雷数
int Count_Mine(char mine[ROWS][COLS],int row,int col);
//雷盘打印//分隔
void Print_Board(char board[ROWS][COLS], int row, int col);
在test.c中
#include"game.h"
int main()
{
int input = 1;
srand((unsigned int)time(NULL));
while (1)
{//1游戏面板
menu();
scanf("%d", &input);
if (input == 1)
{
//2游戏主体
game();
}
else if (input == 2)
{
printf("游戏结束\n");
break;
}
else
{
printf("输入非法,请重新输入\n");
}
}
}
在game.c中
#include"game.h"
//1游戏面板
void menu()
{
printf("****************************\n");
printf("****** 1.start ********\n");
printf("****** 2.exit ********\n");
printf("****************************\n");
}
//2游戏主体
void game()
{
//1雷盘的创建
char mine[ROWS][COLS];
char show[ROWS][COLS];
//2雷盘的初始化
Init_Board(mine, ROWS, COLS, '0');
Init_Board(show, ROWS, COLS, '*');
//3雷盘打印
Print_Board(show, ROW, COL);
//Print_Board(mine, ROW, COL);
//4雷的设置
Set_Mine(mine, ROW, COL);
Print_Board(mine, ROW, COL);
//5查找雷
Find_Mine(mine, show, ROW, COL);
}
//2雷盘的初始化
void Init_Board(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;
}
}
}
//4雷的设置
void Set_Mine(char mine[ROWS][COLS], int row, int col)
{
int count = 0;
while (count < EASY)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count++;
}
}
}
//3雷盘打印
void Print_Board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i <= row; i++)
{
printf("-");
}printf("\n");
for (i = 0; i <= row; i++)
{
printf("%-3d", i);
}
printf("\n");
for (i = 1; i <= col; i++)
{
printf("%2d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-------------------\n");
}
//4查找雷
void Find_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int count = 0;
while (count < row * col - EASY)
{
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y <= col && y >= 1)
{
if (mine[x][y] == '1')
{
Print_Board(mine, ROW, COL);
printf("踩到雷了,游戏失败\n");
break;
}
else if (show[x][y] == '*')
{
int count1 = 0;
count1 = Count_Mine(mine, x, y);
show[x][y] = count1 + '0';
Print_Board(show, ROW, COL);
count++;
}
else
{
printf("输入非法,请重新输入\n");
}
}
else
printf("输入非法,请重新输入\n");
}
if (count == row * col - EASY)
{
Print_Board(mine, row, col);
printf("你赢了,排完了所有雷\n");
}
}
//获得雷数
int Count_Mine(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');
}