前言:
该篇博客是基于作者上一篇文章扫雷进行的修改,由于扫雷的代码有更新修改,所以博客也与此同步。想要了解扫雷原理的读者们可以阅读作者的上一篇文章《C语言怎样写扫雷》。
更新修改内容:
- 新增了WASD作为方向键操作,不再需要输入坐标操作,极大降低操作难度;
- 修改了原先的0的扩散机制,由原先的向四个方向扩散改为向八个方向扩散,更加贴合原版。
代码:
注:以下代码是更新后的代码,和作者上一篇文章有略微差别
game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define X 16
#define Y 30
int x, y, z, num, hudnum;
//行数,列数,雷盘大小标号,雷数
char board_1[X][Y], board_2[X][Y];
void initboard(char board[X][Y]);
void printboard_2(char board_2[X][Y], int choosex, int choosey);
void resetboard_1(char board_1[X][Y], int choosex, int choosey);
void scoreboard_1(char board_1[X][Y]);
void chooseboard_2(char board_1[X][Y], char board_2[X][Y], int choosex, int choosey);
void highlight(char board_2[X][Y], int choosex, int choosey);
void printnum(char board_2[X][Y], int bx, int by);
void alldisplay(char board_1[X][Y], char board_2[X][Y]);
int testboard_2(char board_1[X][Y], char board_2[X][Y], int choosex, int choosey);
game.c
#include"game.h"
void initboard(char board[X][Y])
{
for (int ax = 0; ax < X; ax++)
{
for (int ay = 0; ay < Y; ay++)
{
board[ax][ay] = ' ';
}
}
}
void printnum(char board_2[X][Y], int bx, int by)
{
switch (board_2[bx][by])
{
case '0':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//白色
printf("0");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '1':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//亮白色
printf("1");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '2':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//淡绿色
printf("2");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '3':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 9 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//淡蓝色
printf("3");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '4':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//淡红色
printf("4");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '5':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 13 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//淡紫色
printf("5");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '6':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//湖蓝色
printf("6");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '7':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 1 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//蓝色
printf("7");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '8':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 5 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//紫色
printf("8");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '*':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//红色
printf("*");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '!':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);//红色
printf("!");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case ' ':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
printf(" ");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
}
}
void highlight(char board_2[X][Y], int choosex, int choosey)
{
switch (board_2[choosex][choosey])
{
case '0':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//白色
printf("0");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '1':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//亮白色
printf("1");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '2':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//淡绿色
printf("2");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '3':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 9 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//淡蓝色
printf("3");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '4':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//淡红色
printf("4");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '5':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 13 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//淡紫色
printf("5");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '6':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//湖蓝色
printf("6");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '7':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 1 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//蓝色
printf("7");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '8':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 5 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//紫色
printf("8");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '*':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//红色
printf("*");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case '!':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);//红色
printf("!");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
case ' ':
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 16 | BACKGROUND_INTENSITY);
printf(" ");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
break;
}
}
void printboard_2(char board_2[X][Y], int choosex, int choosey)
{
int bx, by, i = 0;
for (bx = 0; bx < x - 1; bx++)
{
for (by = 0; by < y - 1; by++)
{
printf(" ");
//---------------v
if ((choosex == bx) && (choosey == by))
{
highlight(board_2, choosex, choosey);
}
else
{
printnum(board_2, bx, by);
}
//--------------^
printf(" |");
}
printf(" ");
//-----------------v
if ((choosex == bx) && (choosey == by))
{
highlight(board_2, choosex, choosey);
}
else
{
printnum(board_2, bx, by);
}
//-------------------^
printf(" %d", bx);
if (i == 0)
{
printf(" 剩余未标记地雷数:%d", hudnum);
i++;
}
printf(" \n");
for (by = 0; by < y - 1; by++)
{
printf("---|");
}
printf("---\n");
}
for (by = 0; by < y - 1; by++)
{
printf(" ");
//------------------------v
if ((choosex == bx) && (choosey == by))
{
highlight(board_2, choosex, choosey);
}
else
{
printnum(board_2, bx, by);
}
//--------------------^
printf(" |");
}
printf(" ");
//------------------v
if ((choosex == bx) && (choosey == by))
{
highlight(board_2, choosex, choosey);
}
else
{
printnum(board_2, bx, by);
}
//-------------------^
printf(" %d", bx);
printf(" \n\n");
for (by = 0; by < y; by++)
{
if (by < 10)
{
printf(" %d ", by);
}
else
{
printf(" %d ", by);
}
}
printf("\n");
}
void resetboard_1(char board_1[X][Y], int choosex, int choosey)
{
int cx, cy, bombnum = num, boardnum = x * y - 1, tmp;
//cx,cy,剩余的未放置的地雷数,剩余的未访问的点数
for (cx = 0; cx < x; cx++)
{
for (cy = 0; cy < y; cy++)
{
if (cx != choosex || cy != choosey)
//if ((cx<choosex - 2 || cx>choosex + 2) && (cy<choosey - 2 || cy>choosey + 2))
{
tmp = rand() % boardnum;//生成0~boardnum-1的随机数tmp
if (tmp < bombnum)//如果tmp在0~bombnum-1内,那么就在该点布雷
{
board_1[cx][cy] = '*';//在board_1[cx][cy]处放置地雷
bombnum--;//放置一个地雷,bumbnum-1
}
boardnum--;//访问一个点,boardnum-1
}
}
}
}
void scoreboard_1(char board_1[X][Y])//用于计算每一个点周围有多少地雷
{
int dx, dy, score;
for (dx = 0; dx < x; dx++)
{
for (dy = 0; dy < y; dy++)
{
if (board_1[dx][dy] != '*')
{
score = 0;
//向上判断 1
if (dx > 0)
{
if (board_1[dx - 1][dy] == '*')
{
score++;
}
}
//向右上判断 2
if (dx > 0 && dy < y - 1)
{
if (board_1[dx - 1][dy + 1] == '*')
{
score++;
}
}
//向右判断 3
if (dy < y - 1)
{
if (board_1[dx][dy + 1] == '*')
{
score++;
}
}
//向右下判断 4
if (dx < x - 1 && dy < y - 1)
{
if (board_1[dx + 1][dy + 1] == '*')
{
score++;
}
}
//向下判断 5
if (dx < x - 1)
{
if (board_1[dx + 1][dy] == '*')
{
score++;
}
}
//向左下判断 6
if (dx < x - 1 && dy>0)
{
if (board_1[dx + 1][dy - 1] == '*')
{
score++;
}
}
//向左判断 7
if (dy > 0)
{
if (board_1[dx][dy - 1] == '*')
{
score++;
}
}
//向左上判断 8
if (dx > 0 && dy > 0)
{
if (board_1[dx - 1][dy - 1] == '*')
{
score++;
}
}
board_1[dx][dy] = score + 48;//加48,请查询asc码表
}
}
}
//printboard_2(board_1);//测试用,请忽视
//Sleep(20000000);
}
void chooseboard_2(char board_1[X][Y], char board_2[X][Y], int choosex, int choosey)//选择排雷该点
{
if (board_2[choosex][choosey] == ' ' || board_2[choosex][choosey] == '!')//若board_2该点未被占用,被标记的点也不算占用,若因选中或者扩散触发标记点,则标记会被覆盖
{
if (board_1[choosex][choosey] != 48)//board_1该点不等于'0',不扩散
{
board_2[choosex][choosey] = board_1[choosex][choosey];
}
else if (board_1[choosex][choosey] == 48)//若该点等于'0',往四个方向扩散
{
board_2[choosex][choosey] = board_1[choosex][choosey];
if (choosex < x - 1)//往下
{
chooseboard_2(board_1, board_2, choosex + 1, choosey);
}
if (choosex > 0)//往上
{
chooseboard_2(board_1, board_2, choosex - 1, choosey);
}
if (choosey < y - 1)//往右
{
chooseboard_2(board_1, board_2, choosex, choosey + 1);
}
if (choosey > 0)//往左
{
chooseboard_2(board_1, board_2, choosex, choosey - 1);
}
if (choosex > 0 && choosey < y - 1)//往右上
{
chooseboard_2(board_1, board_2, choosex - 1, choosey + 1);
}
if (choosex < x - 1 && choosey < y - 1)//往右下
{
chooseboard_2(board_1, board_2, choosex + 1, choosey + 1);
}
if (choosex > 0 && choosey > 0)//往左上
{
chooseboard_2(board_1, board_2, choosex - 1, choosey - 1);
}
if (choosex < x - 1 && choosey>0)//往左下
{
chooseboard_2(board_1, board_2, choosex + 1, choosey - 1);
}
//往四个方向扩散
}
}
}
int testboard_2(char board_1[X][Y], char board_2[X][Y], int choosex, int choosey)
{
int ex, ey, score = 0;
for (ex = 0; ex < x; ex++)
{
for (ey = 0; ey < y; ey++)
{
if (board_2[ex][ey] == '*')//踩到地雷啦
{
return 0;
}
if (board_1[ex][ey] == board_2[ex][ey])//计算board_1和board_2的重合度
{
score++;
}
}
}
if (score == x * y - num)//重合度=x*y-num,即所偶有点位已被探明,胜利
{
return 1;
}
else
{
return 2;//重合度<x*y-num,未胜利
}
}
void alldisplay(char board_1[X][Y], char board_2[X][Y])//踩中地雷时所有地雷显现
{
int fx, fy;
for (fx = 0; fx < x; fx++)
{
for (fy = 0; fy < y; fy++)
{
if (board_1[fx][fy] == '*')
{
board_2[fx][fy] = '*';
}
}
}
}
main.c
#include"game.h"
void menu()//菜单 $$
{
printf("输入以下数字以选择下一步:\n'0'结束游戏\n'1'开始游戏\n'2'游戏信息与设置\n请输入:");
}
int game()
{
int a = 1, test;//a用于控制第一次选择排雷点时重置雷盘,即第一次排雷不可能遇到地雷
int choosex = 0, choosey = 0, choose;
char b, tmp;
hudnum = num;
initboard(board_1);//$$
initboard(board_2);//初始化底层雷区与表面雷区 $$
printboard_2(board_2, choosex, choosey);//打印表面雷区 $$
while (1)
{
while (1)
{
while (1)
{
b = '0';
b = _getch();
if (b == 'a')
{
if (choosey > 0)
{
choosey--;//左
system("cls");
printboard_2(board_2, choosex, choosey);
}
}
else if (b == 'd')
{
if (choosey < y - 1)
{
choosey++;//右
system("cls");
printboard_2(board_2, choosex, choosey);
}
}
else if (b == 'w')
{
if (choosex > 0)
{
choosex--;//上
system("cls");
printboard_2(board_2, choosex, choosey);
}
}
else if (b == 's')
{
if (choosex < x - 1)
{
choosex++;//下
system("cls");
printboard_2(board_2, choosex, choosey);
}
}
else if (b == '1')
{
choose = 1;
break;
}
else if (b == '2')
{
choose = 2;
break;
}
//Sleep(100);
}
if (-1 < choosex && choosex < x && -1 < choosey && choosey < y && choose == 1)//选择了雷盘内合法的点并排雷
{
if (a == 1)//在'第一次'选择排雷后重置雷盘并计算每个点周围的雷数 (后续将不起作用)
{
resetboard_1(board_1, choosex, choosey);//重新布雷底部雷区 $$
scoreboard_1(board_1);//底部雷区计数 $$
a++;
}
if (board_2[choosex][choosey] != '!')
{
chooseboard_2(board_1, board_2, choosex, choosey);//选择排雷点
}
system("cls");
printboard_2(board_2, choosex, choosey);//$$
break;//只有选择该点排雷,才调用break,进入检测环节
}
else if (-1 < choosex && choosex < x && -1 < choosey && choosey < y && choose == 2)//选择雷盘内合法的点并标记/取消标记
{
if (board_2[choosex][choosey] == ' ')
{
board_2[choosex][choosey] = '!';//标记该点
hudnum--;
}
else if (board_2[choosex][choosey] == '!')
{
board_2[choosex][choosey] = ' ';//取消标记该点
hudnum++;
}
system("cls");
printboard_2(board_2, choosex, choosey);
}
else//其余一切操作皆为非法操作
{
printf("请输入正确的数字");
Sleep(2000);
system("cls");
printboard_2(board_2, choosex, choosey);
}
}
test = testboard_2(board_1, board_2, choosex, choosey);
//test=0-->踩到地雷;test=1-->全部点位已被探明且未踩到地雷,胜利;test=2-->未踩到地雷,也没有探明所有点位,未结束
if (test == 0)
{
alldisplay(board_1, board_2);
system("cls");
printboard_2(board_2, choosex, choosey);
return 0;
}
else if (test == 1)
{
return 1;
}
}
}//return-->choose-->result:0-->输,1-->赢
void choose_menu()//菜单选择
{
int menuchoose = 0, result = 0;//menuchoose菜单选择结果,result游戏输赢结果
z = 1, num = 9, x = 9, y = 9;
int set = 0, boa = 1;
do
{
system("cls");
menu();
scanf("%d", &menuchoose);
switch (menuchoose)
{
case 0://结束游戏
system("cls");
printf("结束游戏");
Sleep(2000);
break;
case 1://开始游戏
system("cls");
printf("开始游戏");
Sleep(2000);
system("cls");
result = game();//game()_return:0-->输,1-->赢
if (result == 0)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15 | 8 | 128 | 64);
printf("you lost!!\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
printf("按下回车键以继续");
getchar();
getchar();
}
else if (result == 1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15 | 8 | 128 | 64);
printf("you won!!\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 | FOREGROUND_INTENSITY | 8 | BACKGROUND_INTENSITY);
printf("按下回车键以继续");
getchar();
getchar();
}
break;
case 2://信息与设置
system("cls");
printf("游戏信息与设置");
Sleep(2000);
system("cls");
printf("游戏信息:\n\n游戏名:扫雷\n\n作者:li_zi_jin\n\n提示:\n1.游戏规则与Windows扫雷相同\n2.'adws'作为方向键选择你想选择的格,'1'排雷该点相当于原版左键,'2'标记/取消标记该点相当于原版右键\n3.可以调整雷盘大小,默认为小\n4.请严格按照提示输入合适的内容,否则会出bug\n\n");
printf("信息:\n雷盘大小:");
switch (z)
{
case 1:
printf("小(9*9)\n");
break;
case 2:
printf("中(16*16)\n");
break;
case 3:
printf("大(16*30)\n");
break;
default:
printf("出错\n");
break;
}
printf("地雷数量:");
printf("%d\n", num);
printf("\n输入以下数字以选择下一步:\n'1'调整雷盘大小\n'其他数字'退回初始界面\n请输入:");
scanf("%d", &set);
if (set == 1)
{
printf("\n输入以下数字以选择相应雷盘大小:\n'1'小\n'2'中\n'3'大\n请输入:");
scanf("%d", &boa);
if (0 < boa && boa < 4)
{
z = boa;
switch (z)
{
case 1:
num = 9;
//num = 1;//测试用,请忽略
x = 9;
y = 9;
break;
case 2:
num = 40;
x = 16;
y = 16;
break;
case 3:
num = 99;
x = 16;
y = 30;
break;
}
printf("设置成功");
}
else
{
printf("请输入正确的数字");
}
}
else
{
printf("退回初始界面");
}
Sleep(2000);
break;
default://非法输入
system("cls");
printf("请输入正确的数字\n");
Sleep(2000);
break;
}
} while (menuchoose != 0);
}
int main()
{
srand((unsigned int)time(NULL));
system("color 87");
choose_menu();
return 0;
}
li_zi_jin (20231101)
未经作者同意不得转载