⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3-8.c

📁 《C程序员成长攻略》-黎陡-源代码-4282 中国水利水电出版社 程序员成长之路丛书
💻 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 + -