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

📄 3-9.c

📁 《C程序员成长攻略》-黎陡-源代码-4282 中国水利水电出版社 程序员成长之路丛书
💻 C
字号:
#include"stdlib.h"
#include"graphics.h"
#include"conio.h"
#include"dos.h"

#define BK_COLOR BLACK
#define C_COLOR  WHITE
#define UpKey 72
#define DownKey 80
#define ESC 27
#define Enter 13
#define MenuX 200
#define MenuY 110
#define MenuWidth 200
#define MenuSinH 40
#define ChoiceX MenuX+15
#define ChoiceY MenuY+10
#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);
}
int ChooseMenu(int flag)
{ 
    int x,y;
    char C_Key;
    x=ChoiceX; 
    y=ChoiceY;
    do
    {
		kbhit();
        C_Key=getch();
        if(C_Key==ESC)
            return ESC;
        else 
            if(C_Key==Enter) 
        return y;
        else
        switch(C_Key)
        {
		case UpKey:    
            if(y==ChoiceY) 
                break;
		    else
		    {
				Choice(x,y,BLACK);
			    y-=MenuSinH;
			    Choice(x,y,BLUE);
			}
		    break;
        case DownKey:  
            if(y==(ChoiceY+2*MenuSinH)) 
                break;
		    else
			{
				Choice(x,y,BLACK);
			    y+=MenuSinH;
			    Choice(x,y,BLUE);
			 }
		     break;
         default: 
			 break;
         }
         if(flag==0) 
             Main_Menu();
         else 
         if(flag==1) 
             Option_Menu();
	}while(C_Key!=ESC);
}

void SetResult()
{  
    int result;
    result=ChooseMenu(1);
    switch(result)
    { 
    case ESC: 
		return 0; 
		break;
    case ChoiceY:
		speed=6000;  
		break;
    case ChoiceY+MenuSinH:  
		speed=3000;  
		break;
    case ChoiceY+2*MenuSinH:
		speed=1000;  
		break;
    default: 
		break;
    }
}

void DrawChar(int i,int j,char c)
{  
    char ch[1];
    ch[0]=c;
    ch[1]='\0';
    moveto(i,j);
    settextstyle(0,0,2);
    outtext(ch);
} 

void AutoDraw_Down(int x,int y,char c,int n)
{
    setcolor(BK_COLOR);
    DrawChar(x,y,c);
    setcolor(C_COLOR);
    DrawChar(x,y+1,c);
    delay(n);
}

void AutoDraw_Up(int x,int y,char c,int n)
{
    setcolor(BK_COLOR);
    DrawChar(x,y,c);
    setcolor(C_COLOR);
    DrawChar(x,y-1,c);
    delay(n);
}

char GenerateChar()
{ 
    int flag;
    char c;
    flag=random(3);
    switch(flag)
	{ 
    case 0:
		c='a'+random(26);  
		break;
    case 1: 
		c='A'+random(26);  
		break;
    case 2: 
		c='0'+random(10);   
		break;
    default: 
		break;
	}
    return c;
}

void Play()
{  
    int x,y,x1,y1,i,j;
    int e=20,PreKey_Count=0,Hit_Count=0;
    char c,key;
    setbkcolor(BK_COLOR);
    while(key!=ESC)
    {  
		randomize();
        x=50+random(500);
        c=GenerateChar();
        for(y=10;y<400;y++)
		{
			AutoDraw_Down(x,y,c,speed);
	        if(kbhit())
			{ 
                key=getch();
	            if(key==ESC) 
					break;
	            else
				{
					if(key==c)
					{
						x1=x;
		                for(y1=400;y1>=y;y1--)
							AutoDraw_Up(x1,y1,key,100);
		                Hit_Count++;
		                setcolor(RED);
		                for(i=10;i<=30;i++)
						{ 
                            circle(x1,y1,i);
		                    delay(1000);
						}
					}
	                else
					{  
                        x1=x+e;
		                for(y1=400;y1>=10;y1--)
		                    AutoDraw_Up(x1,y1,key,100);
					}
                    PreKey_Count++;
				}
	            break;
			}
		}
        cleardevice();
	}
    closegraph();
    printf("     PreKey:  %d,    Hit: %d\n",PreKey_Count,Hit_Count);
    getch();
}

main()
{  
    int gd=DETECT,gm;
    int c_x,c_y,result;
    char C_Key;
    c_x=ChoiceX; 
    c_y=ChoiceY;
Begin:
    initgraph(&gd,&gm,"c:\tc\tc");
/*因为在Play()函数的最后调用了closegraph()函数关闭了图形系统,所以在这里要把initgraph()函数放在Begin标识的后面,以确保每次游戏结束后重新回到初始界面时图形系统已经初始化。*/
    cleardevice();
    Interface();
    Choice(c_x,c_y,BLUE);
    Main_Menu();
    result=ChooseMenu(0);
    switch(result)
    { 
    case ESC: 
		exit(0); 
        break;
    case ChoiceY:
		cleardevice(); 
        sleep(1);  /*延时一秒*/
		Play();   /*清屏后调用游戏函数进入屏幕打飞字游戏*/
		goto Begin; /*游戏结束后,回到初始界面*/
		break;
    case ChoiceY+MenuSinH:
		cleardevice();
		Interface();
		Choice(c_x,c_y,BLUE);
		Option_Menu();
		SetResult();
        goto Begin;
        break;
    case ChoiceY+2*MenuSinH: 
        exit(0); 
		break;
    default: 
		break;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -