?? 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 + -