#pragma once #include<stdio.h> #include<stdlib.h> #include<time.h>
extern void Game();
#define COL 8 #define ROW 8
#define THUNDER '*' #define NUM 20 ?
(main.c)
#include"test.h"
void Menu() { ?? ?printf("+-----------------------------------+\n"); ?? ?printf("| ? ?1.游戏 ? --------- ? 0.退出 ? ?|\n"); ?? ?printf("+-----------------------------------+\n"); } int main() { ?? ?int select, flag = 1; ?? ?while (flag) ?? ?{ ?? ??? ?Menu(); ?? ??? ?printf("请输入:"); ?? ??? ?scanf_s("%d", &select); ?? ??? ?switch (select) ?? ??? ?{ ?? ??? ?case 0: ?? ??? ??? ?flag = 0; ?? ??? ??? ?break; ?? ??? ?case 1: ?? ??? ??? ?Game(); ?? ??? ??? ?break; ?? ??? ?default: ?? ??? ??? ?printf("输入有问题!!!\n"); ?? ??? ??? ?break; ?? ??? ?} ?? ?} ?? ?printf("结束,再见"); }
(game.c)
#include"test.h"
static void SetThunder(char Mine_board[ROW][COL], int row, int col)//埋雷 { ?? ?int num = NUM; ?? ?while (num) ?? ?{ ?? ??? ?int x = rand() % (ROW - 2) + 1;//生成0~ROW-2的随机数 ?? ??? ?int y = rand() % (COL - 2) + 1; ?? ??? ?if (Mine_board[x][y] != '1')//判断是否已经有雷 ?? ??? ?{ ?? ??? ??? ?Mine_board[x][y] = '1'; ?? ??? ??? ?num--; ?? ??? ?} ?? ?} } static void Show(int col)//和Showboard()相关的函数,仅显示一排横线 { ?? ?printf("---"); ?? ?for (int j = 1; j <= col - 2; j++) ?? ??? ?printf("----"); ?? ?printf("\n"); } static void Showboard(char Show_board[ROW][COL], int row, int col)//展示面板 { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//这块的调试有些细节,慢慢来就好了 ?? ?for (int i = 1; i <= col - 2; i++) ?? ?{ ?? ??? ?printf("%4d", i); ?? ?} ?? ?printf("\n"); ?? ?Show(col); ?? ?for (int i = 1; i <= row - 2; i++) ?? ?{ ?? ??? ?printf("%-2d|", i); ?? ??? ?for (int j = 1; j <= col - 2; j++) ?? ??? ?{ ?? ??? ??? ?printf(" %c |", Show_board[i][j]); ?? ??? ?} ?? ??? ?printf("\n"); ?? ??? ?Show(col); ?? ?} } static char CountThunder(char Mine_board[ROW][COL], int x, int y)//显示数组当前坐标内容更改为周围雷的"个数"(字符型) { ?? ?return Mine_board[x - 1][y - 1] + Mine_board[x - 1][y] + Mine_board[x - 1][y + 1] ?? ??? ?+ Mine_board[x][y - 1] + Mine_board[x][y + 1] ?? ??? ?+ Mine_board[x + 1][y - 1] + Mine_board[x][y + 1] + Mine_board[x + 1][y + 1] - 8 * '0' + '0';//!!! } void Game() { ?? ?char Show_board[ROW][COL];//显示用的数组 ?? ?char Mine_board[ROW][COL];//埋雷用的数组 ?? ?memset(Show_board, THUNDER, sizeof(Show_board));//初始化数组(用宏初始,易于维护) ?? ?memset(Mine_board,'0' , sizeof(Mine_board));//初始化数组(初始成字符0,埋雷的时候改成字符1) ?? ?srand((unsigned long)time(NULL));//种一个随机数种子,埋的雷是随机的 ?? ?SetThunder(Mine_board, ROW, COL);//埋雷 ?? ?int count = (ROW - 2) * (COL - 2) - NUM;//count为要走的步数 NUM为雷的个数 ?? ?while (count) ?? ?{ ?? ??? ?system("cls");//清屏 ?? ??? ?Showboard(Show_board, ROW, COL);//展示面板 ?? ??? ?printf("请输入你的坐标:"); ?? ??? ?int x, y; ?? ??? ?scanf_s("%d%d", &x, &y); ?? ??? ?if (x < 1 || x>11 || y < 1 || y>11) { ?? ??? ??? ?printf("输入坐标不在范围内!请重新输入!\n"); ?? ??? ??? ?continue; ?? ??? ?} ?? ??? ?if (Show_board[x][y] != THUNDER) {//如果该坐标再显示数组内不是初始化的内容说明该位置被用过了 ?? ??? ??? ?printf("该地址已经被使用!!!\n"); ?? ??? ??? ?continue; ?? ??? ?} ?? ??? ?if (Mine_board[x][y] == '1') { ?? ??? ??? ?Showboard(Mine_board, ROW, COL); ?? ??? ??? ?printf("踩雷 GG,游戏结束\n"); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?Show_board[x][y] = CountThunder(Mine_board, x, y);//显示数组当前坐标内容更改为周围雷的个数 ?? ??? ?count--; ?? ?} }
|