📄 3-8.c
字号:
#include"stdlib.h"
#include"graphics.h"
#include"conio.h"
#include"dos.h"
#define BK_COLOR BLACK
#define CHAR_COLOR WHITE
#define C_COLOR BLUE /*定义选项条的颜色*/
#define UpKey 72 /*方向上键*/
#define DownKey 80 /*方向下键*/
#define ESC 27 /*ESC键*/
#define Enter 13 /*Enter键*/
#define MenuX 200 /*菜单左上角x坐标值*/
#define MenuY 110 /*菜单左上角y坐标值*/
#define MenuWidth 200 /*菜单框架的宽度*/
#define MenuSinH 40 /*每项菜单项所占的高度*/
#define ChoiceX MenuX+15 /*选项条最初的左上角x坐标*/
#define ChoiceY MenuY+10 /*选项条最初的左上角y坐标*/
#define ChoiceWidth 170 /*选项条的宽度*/
#define ChoiceH 25 /*选项条的高度*/
int speed=6000; /*字符掉下的速度的初始值*/
void Interface() /*绘制初始界面*/
{
int i,j;
setcolor(CYAN);
for(i=0;i<60;i++)
{
line(i,0,i,500);
line((getmaxx()-i),0,(getmaxx()-i),500);
}
setcolor(YELLOW);
for(i=60,j=0;i<85;i++,j++)
{
line(i,j,i,500);
line((getmaxx()-i),j,(getmaxx()-i),500);
}
setcolor(WHITE);
rectangle(MenuX,MenuY,MenuX+MenuWidth,MenuY+3*MenuSinH);
line(MenuX,MenuY+MenuSinH,MenuX+MenuWidth,MenuY+MenuSinH);
line(MenuX,MenuY+2*MenuSinH,MenuX+MenuWidth,MenuY+2*MenuSinH);
}
void Main_Menu() /*输出主菜单*/
{
settextstyle(0,0,2);
outtextxy(MenuX+20,MenuY+15,"START GAME");
outtextxy(MenuX+20,MenuY+MenuSinH+15,"GAME SETUP");
outtextxy(MenuX+20,MenuY+2*MenuSinH+15,"EXIT");
}
void Option_Menu() /*输出设置难度的子菜单*/
{
settextstyle(0,0,2);
outtextxy(MenuX+20,MenuY+15,"beginner");
outtextxy(MenuX+20,MenuY+MenuSinH+15,"advancer");
outtextxy(MenuX+20,MenuY+2*MenuSinH+15,"senior");
}
void Choice(int c_x,int c_y,int color) /*选项条绘制*/
{
setfillstyle(1,color);
bar(c_x,c_y,c_x+ChoiceWidth,c_y+ChoiceH);
}
/*菜单选择功能模块,参数flag为1时输出主菜单,为0时输出子菜单*/
int ChooseMenu(int flag)
{
int x,y;
char C_Key; /*菜单操作时用来获取所读键*/
x=ChoiceX; y=ChoiceY;
/*定义选项条初始坐标,使选项条最初位于第一个选项上*/
do
{
kbhit(); /*读键*/
C_Key=getch(); /*获取键值*/
if(C_Key==ESC) /*如果用户按键为ESC键*/
return ESC; /*则函数返回ESC键的ASCII码值*/
else
if(C_Key==Enter)/*如果用户按Enter键,则函数返回选项条当前所在的y坐标值*/
return y;
else
switch(C_Key)
{
case UpKey:
if(y==ChoiceY) /*若选项条已到达最上面一项则不做处理*/
break;
else
{
Choice(x,y,BK_COLOR);/*以背景色画一选项条,覆盖原选项*/
y-=MenuSinH; /*选项条的y值减一个菜单项高度*/
Choice(x,y,C_COLOR);/*在新的y值对应的选项上画一选项条*/
}
break;
case DownKey:
if(y==(ChoiceY+2*MenuSinH))
break; /*若选项条已达最下面一项则不做处理*/
else
{
Choice(x,y,BLACK); /*以背景色画一选项条,覆盖原选项*/
y+=MenuSinH; /*选项条的y值加一个菜单项高度*/
Choice(x,y,BLUE); /*在新的y值对应的选项上画一选项条*/
}
break;
default:
break;
}
/*由于上下键操作时选项条的绘制会覆盖菜单选项的文字,因而要再次输出菜单文字*/
/*此时要根据实际调用函数时具体的参数flag的值,来决定是显示主菜单还是子菜单*/
if(flag==0)
Main_Menu(); /*如果flag为0,则输出主菜单*/
else
if(flag==1)
Option_Menu(); /*如果flag为1,则输出子菜单*/
}while(C_Key!=ESC);
}
/*子菜单选择,在其中调用ChooseMenu()函数来实现选择功能*/
void SetResult()
{
int result; /*定义选择结果变量*/
result=ChooseMenu(1); /*调用ChooseMenu()函数实现选择功能,参数为1表示输出95 显示的菜单为子菜单。返回结果赋给变量result。*/
switch(result) /*根据选择子菜单的返回结果分别进行各级别的难度设置*/
{
case ESC:
return 0;
case ChoiceY:
speed=6000;
break;
case ChoiceY+MenuSinH:
speed=3000;
break;
case ChoiceY+2*MenuSinH:
speed=1000;
break;
default:
break;
}
}
main()
{
int gd=DETECT,gm;
int c_x,c_y,result;
char C_Key; /*菜单操作时用来获取所读键*/
initgraph(&gd,&gm,"c:\tc\tc");
c_x=ChoiceX;
c_y=ChoiceY; /*定义选项条初始坐标*/
Begin: /*设置一个标号,用于子菜单操作或游戏后返回初始界面*/
cleardevice(); /*清屏*/
Interface(); /*显示初始界面*/
Choice(c_x,c_y,BLUE); /*将选项条最初绘制在菜单的第一个选项的位置上*/
Main_Menu();/*显示主菜单文字。由于选项条的绘制实际是画一实心矩形,因而要先画选项条后显示主菜单文字,否则选项条所在的主菜单文字将被选项条覆盖*/
result=ChooseMenu(0); /*进行主菜单选择,并将返回值赋给result*/
switch(result)
{
case ESC:
exit(0);
break;
/*若result值为ESC(表示按了ESC键),则退出程序*/
case ChoiceY: /*选定”START GAME”选项,现在暂不做处理*/
goto Begin; /*返回初始界面*/
break;
case ChoiceY+MenuSinH: /*选定”GAME SETUP”选项*/
cleardevice(); /*清屏*/
Interface(); /*画初始界面*/
Choice(c_x,c_y,C_COLOR);/*将选项条绘制在第一个选项位置上*/
Option_Menu(); /*显示输出子菜单文字*/
SetResult(); /*进行难度设置子菜单功能选择,并设定相关速度值*/
goto Begin; /*返回初始界面*/
break;
case ChoiceY+2*MenuSinH: /*选定”EXIT”选项*/
exit(0); /*退出程序*/
break;
default: break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -