zoukankan      html  css  js  c++  java
  • 功能超级丰富的彩色贪吃蛇,有道具,有等级!

    彩色的贪吃蛇实现,功能强大。有等级模块。道具功能,后面有效果预览。先上代码:

    console.h

    #include <windows.h>
    
    //颜色定义
    #define FWHITE    FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE	//白色前景
    #define FRED      FOREGROUND_INTENSITY|FOREGROUND_RED	//红色前景
    #define FBLUE     FOREGROUND_INTENSITY|FOREGROUND_BLUE	//蓝色前景
    #define FGREEN    FOREGROUND_INTENSITY|FOREGROUND_GREEN    //绿色前景
    #define FYELLOW   FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN   //黄色前景
    #define FPURPLE   FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE     //紫色前景
    #define FBLACK    NULL					//黑色前景
    
    #define BBLACK    NULL					//黑色背景
    #define BWHITE    BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE  //白色背景
    #define BRED      BACKGROUND_INTENSITY|BACKGROUND_RED  //红色背景
    #define BBLUE     BACKGROUND_INTENSITY|BACKGROUND_BLUE  //蓝色背景
    #define BGREEN    BACKGROUND_INTENSITY|BACKGROUND_GREEN  //绿色背景
    #define BYELLOW   BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN  //黄色背景
    #define BPURPLE   BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_BLUE  //紫色背景
    
    void xSetCursor(int x,int y)
    {
        COORD c;
        c.X = x - 1;
        c.Y = y - 1;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
    }
    void HideCursor()
    {
           CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
           SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
    }
    void xSetColor(WORD color)
    {
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
    }
    
    /*  
    int SetConsoleTitle(char *title)
    */
    
    int ShowConsoleInfo()
    {
       int ret;
       HANDLE hWin = GetStdHandle(STD_OUTPUT_HANDLE);
       CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
    
       ret = GetConsoleScreenBufferInfo(hWin, &csbiInfo);
       if (ret)
       {
          printf("Buffer Size: [X]%d - [Y]%d
    ", csbiInfo.dwSize.X, csbiInfo.dwSize.Y);
          printf("Cursor Pos : [X]%d - [Y]%d
    ", csbiInfo.dwCursorPosition.X, csbiInfo.dwCursorPosition.Y);
          printf("Attributes : %d
    ", csbiInfo.wAttributes);
          printf("Current Win: [L]%d - [R]%d - [T]%d - [B]%d
    ", 
                 csbiInfo.srWindow.Left, csbiInfo.srWindow.Right, csbiInfo.srWindow.Top, csbiInfo.srWindow.Bottom);
          printf("Maximum Win: [X]%d - [Y]%d
    ", csbiInfo.dwMaximumWindowSize.X, csbiInfo.dwMaximumWindowSize.Y);
          puts("Over.");
       }
       return ret;
    }


    setting.h

    #include <windows.h>
    
    //界面图案设定
    char sharp[][3] = {"★","■","□","◎","◆"};
    #define SnakeHead		0
    #define SnakeBody		1
    #define Wall			1
    #define White			2
    #define SnakeEnd		3
    #define SFood			4
    #define StartSnakeLen	8
    
    //游戏设定
    #define MAP_WIDTH 24
    #define MAP_HIGH 22
    #define CTRLWNDLEFT 5
    #define CTRLWNDWIDTH 10
    #define CTRLWNDHIGH MAP_HIGH
    #define MINSPEED 400
    #define MAXSPEED 200
    
    //蛇定义
    struct Snake
    {
        int x,y;
    	struct Snake *next,*front;
    };
    struct Snake *Snake_Head;
    
    struct Snake *Snake_End	=NULL;
    struct Snake *Snake_OldEnd	=NULL;
    struct Snake Food;
    struct Snake *ExtraFood[5];
    struct Snake temp;
    
    
    
    enum direct {LEFT,RIGHT,UP,DOWN};
    enum direct Direct;
    
    //食物
    enum styfood {FOOD_NORMAL,FOOD_GETDEF,FOOD_FIVEFOOD};
    enum styfood FoodStyle;
    enum styfood ExtraFoodStyle[5];
    
    //定义属性
    long int	Score			=	0;
    int		IsPause			=	0;
    int			EatNum			=	0;
    int			LEVEL			=	0;
    long int	EXP				=	0;
    int			SPEED			=	MINSPEED;
    
    
    int			Tool_Defense	=	0;
    int			Tool_FiveFood	=	0;
    
    /*初始化数据*/ 
    void Init()
    {
    	Snake_Head = (struct Snake*)malloc(sizeof(struct Snake));
    	int i; 
    	for (i = 0 ; i < 5; i++)
    	{
    		ExtraFood[i] = (struct Snake*)malloc(sizeof(struct Snake));
    		ExtraFood[i]->next = NULL;
    	}
    	temp.x=0;
    	temp.y=0;
    	Score			= 0;
    	IsPause			= 0;
    	EatNum			= 0;
    	LEVEL			= 0;
    	EXP				= 0;
    	SPEED			= MINSPEED;
    	Direct			= RIGHT;
    	Tool_Defense	= 10;
    	Tool_FiveFood	= 10;
    }
    
    
    
    
    


    snake.h

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<string.h>
    #include"setting.h"
    #include"console.h"
    
    /*函数声明*/
    
    /*  开场画面 */
    void BeginImage();
    /*初始化,画蛇,画食物*/
    void Start();	
    /*移动。包含蛇的描绘*/
    void Move();		
    /*画地图*/
    void Draw_Map();								
    /*画所有蛇*/
    void Draw_Snake();			
    /*输出成绩*/
    void Draw_Score();
    /*画食物*/
    void Draw_Food();
    /*画控制区域*/
    void Draw_CtrlWnd();
    /*输出游戏中提示*/
    void Draw_Play();
    /*输出升级提示*/
    void Draw_UpLevel();
    /*输出工具信息*/
    void Draw_Tool();
    /*推断是否死亡*/
    int IsDeath();				
    /*推断输入是否是游戏控制按键*/
    int IsGameCtrl(unsigned char ch);		
    /*生成食物*/
    int CreateFood(int count);			
    /*食物被吃,包含画食物*/
    int EatFood();				//
    /*对蛇的操控*/
    int Snake_Ctrl(unsigned char ch);
    /*蛇不死*/
    int Snake_Defense();
    /*游戏暂停*/
    void Game_Pause();
    /*游戏结束*/
    void Game_Over();
    /*计算并输出分数*/
    void CalcScore(int num);
    /*清空控制区域*/
    void Cls_CtrlWnd();
    /*控制区域闪烁型提示*/
    void CtrlWnd_Flash(char *a,char *b,int loc,int);
    
    
    void BeginImage()
    {	//开场画面
    	HideCursor();
    	xSetColor(FGREEN);
        printf(" 
    
    			 /^/^\	
    ");
        printf("        	       ◇_|__| ◇|\	 
    ");
        printf("         	   \/ ~   〓   \_/ \		 
    ");
        printf("      按 	    \____|________/  \		 
    ");
        printf("      任 		        \_______\			
    ");
        printf("      意  	              `       \                \	 
    ");
        printf("      键  	               |      |         贪      \	 
    ");
        printf("      进  	              /      /          吃        \\	 
    ");
        printf("      入 	             /     /            蛇         \\	 
    ");
        printf("      贪  	           /      /                         \ \	 
    ");
        printf("      吃 	          /     /                            \  \	 
    ");
        printf("      蛇	         /     /             _----_            \  \	 
    ");
        printf("      世   	        /     /           _-~      ~-_          |  |	 
    ");
        printf("      界   	       (      (        _-~    _--_    ~-_     _/   |	 
    ");
        printf("       !   	       \      ~-____-~    _-~    ~-_    ~-_-~    /	 
    ");
        printf("          	         ~-_           _-~          ~-_       _-~   	 
    ");
        printf("         	           ~--______-~                ~-___-~	 
    ");
    	printf("	 
    ");
    	int t = getch();
    	if (t == 0 || t==224) getch();		//特殊输入会输入两个字符,如F1~F12和控制键
    	system("cls");
    }
    
    void Start()
    {	
    	Snake_Head->x = MAP_WIDTH/3*4 - 1 ;  //蛇头坐标
    	Snake_Head->y = MAP_HIGH / 4*1;
    	Snake_Head->front = NULL;
    	struct Snake *ps = Snake_Head, *p;
    	int m;
        for (m = 2; m <= StartSnakeLen; m++)	//蛇身坐标
        {
    		p = (struct Snake *)malloc(sizeof(struct Snake));
            p->x = MAP_WIDTH/3*4 - m*2 +1;
    		p->y = MAP_HIGH / 4*1;
    		p->next = NULL;
    		p->front = ps;
    		ps->next = p;
    		ps = p;
        }
    	Snake_End = Snake_Head;
    	while(Snake_End->next != NULL)
    		Snake_End = Snake_End->next;
    
    	Draw_Map(); 
    	Draw_CtrlWnd();
    	Draw_Snake();
    	Draw_Score();
    	Draw_Tool();
    	Draw_Play();
    	
    	xSetColor(FPURPLE);
    	xSetCursor(MAP_WIDTH/2*2-7,MAP_HIGH/2);
    	printf("  随意键開始!  ");
    	int t = getch();
    	if (t == 0 || t==224) getch();		//特殊输入会输入两个字符,如F1~F12和控制键
    	xSetColor(FGREEN);
    	xSetCursor(MAP_WIDTH/2*2-7,MAP_HIGH/2);
    	for (m = 1 ; m <= 8; m++)
    		printf("%2s",sharp[White]);
    
    	srand(time(NULL));
    	CreateFood(0);		
    	Draw_Food();
    
    }
    void Draw_Map()
    {	//描绘地图
    	xSetColor(FGREEN);
        int m,n;
        for (m = 1; m <= MAP_HIGH; m++)
        {
            for (n = 1; n <= MAP_WIDTH; n++)
                printf("%s",sharp[White]);
            xSetCursor(1,m+1);
        }
    	for (m = 1; m <= MAP_HIGH; m++)
    	{
    		xSetCursor(1,m);
    		printf("%s",sharp[Wall]);
    		xSetCursor(MAP_WIDTH * 2 - 1,m);
    		printf("%s",sharp[Wall]);
    	}
    	
    	for (m = 1; m <= MAP_WIDTH; m++)
    	{
    		xSetCursor(m * 2 - 1,1);
    		printf("%s",sharp[Wall]);
    		xSetCursor(m * 2 - 1,MAP_HIGH);
    		printf("%s",sharp[Wall]);
    	}
    }
    void Draw_Snake()
    {		//画所有蛇
    	xSetColor(FRED);
        struct Snake *ps = Snake_Head;
    	for (;ps != NULL; ps = ps->next)
    	{
            xSetCursor(ps->x , ps->y);
            if (ps == Snake_Head)
                printf("%s",sharp[SnakeHead]);
            else if (ps->next == NULL)
                printf("%s",sharp[SnakeEnd]);
            else
                printf("%s",sharp[SnakeBody]);
    	}
    }
    int IsDeath()
    {
    	struct Snake *ps = Snake_Head ;
    	switch(Direct) //与蛇身相撞
    	{
    	case LEFT:
    		for (;ps != NULL; ps = ps->next)
    			if ((Snake_Head->y == ps->y) && (Snake_Head->x - 2 == ps->x) )
    				return 1;
    		if (Snake_Head->x - 2 <= 2)
    			return 1;
    		break;
    	case RIGHT:
    		for (;ps != NULL; ps = ps->next)
    			if ((Snake_Head->y == ps->y) && (Snake_Head->x + 2 == ps->x) )
    				return 1;
    		if (Snake_Head->x + 2 >= MAP_WIDTH*2-1)
    			return 1;
    		break;
    	case UP:
    		for (;ps != NULL; ps = ps->next)
    			if ((Snake_Head->y - 1 == ps->y) && (Snake_Head->x == ps->x) )
    				return 1;
    		if (Snake_Head->y - 1 <= 1)
    			return 1;
    		break;
    	case DOWN:
    		for (;ps != NULL; ps = ps->next)
    			if ((Snake_Head->y + 1 == ps->y) && (Snake_Head->x  == ps->x) )
    				return 1;
    		if (Snake_Head->y + 1 >= MAP_HIGH)
    			return 1;
    		break;
    	}
    	return 0;
    }
    
    
    void Move()  
    {		//移动
    	struct Snake *ps = (struct Snake*)malloc(sizeof(struct Snake));	//初始化新蛇头
    	switch(Direct)
    	{
    	case LEFT:
    		ps->x = Snake_Head->x - 2;
    		ps->y = Snake_Head->y ;
    		break;
    	case RIGHT:
    		ps->x = Snake_Head->x + 2;
    		ps->y = Snake_Head->y ;
    		break;
    	case UP:
    		ps->x = Snake_Head->x ;
    		ps->y = Snake_Head->y - 1 ;
    		break;
    	case DOWN:
    		ps->x = Snake_Head->x ;
    		ps->y = Snake_Head->y + 1;
    		break;
    	}
    	ps->front = NULL;
    	ps->next = Snake_Head;
    	Snake_Head->front = ps;
    	Snake_Head = ps;
    	
    	//填补地图
    	xSetColor(FGREEN);		//地图颜色
    	xSetCursor(Snake_End->x,Snake_End->y);	
    	printf("%2s",sharp[White]);	
    	//画蛇
    	xSetColor(FRED);				//蛇颜色
    	xSetCursor(Snake_Head->x,Snake_Head->y);			//画蛇头
    	printf("%2s",sharp[SnakeHead]);
    	xSetCursor(Snake_Head->next->x,Snake_Head->next->y);		//画第二节蛇身
    	printf("%2s",sharp[SnakeBody]);
    	xSetCursor(Snake_End->front->x,Snake_End->front->y);			//画蛇尾
    	printf("%2s",sharp[SnakeEnd]);
    	Snake_End = Snake_End->front;
    	free(Snake_End->next);		//删除最后一个节点
    	Snake_End->next = NULL;	
    }
    int CreateFood(int count)
    {		//生成食物
    	
    	int Success = 0;
    	struct Snake *ps;
    	int num,i;
    	if (count == 0)
    	{
    		while(!Success)
    		{
    			Food.x = rand()%(MAP_WIDTH - 3) * 2 + 3;
    			Food.y = rand()%(MAP_HIGH - 2) + 2 ;
    			for (ps = Snake_Head; ps != NULL; ps = ps->next)
    				if ((ps->x == Food.x) && (ps->y == Food.y))
    				{
    					Success = 0;
    					break;
    				}
    			if (ps == NULL)
    				Success = 1;
    		}
    		if (Success)		//食物样式
    		{
    			num = rand()%16;
    			if (num == 1)
    				FoodStyle = FOOD_GETDEF;
    			else if (num == 2)
    				FoodStyle = FOOD_FIVEFOOD;
    			else
    				FoodStyle = FOOD_NORMAL;
    		}
    	}
    	else
    	{
    		for (i = 0; i < 5; i++)
    		{
    			Success = 0;
    			while(!Success)
    			{			//随机食物位置
    				ExtraFood[i]->x = rand()%(MAP_WIDTH - 3) * 2 + 3;
    				ExtraFood[i]->y = rand()%(MAP_HIGH - 2) + 2 ;
    				for (ps = Snake_Head; ps != NULL; ps = ps->next)
    					if ((ps->x == ExtraFood[i]->x) && (ps->y == ExtraFood[i]->y))
    					{
    						Success = 0;
    						break;
    					}
    				if (ps == NULL)
    					Success = 1;
    			}
    			if (Success)		//食物样式
    			{
    				ExtraFood[i]->next =  &temp; //避免NULL值
    				num = rand()%20;
    				if (num == 1)
    					ExtraFoodStyle[i] = FOOD_GETDEF;
    				else if (num == 2)
    					ExtraFoodStyle[i] = FOOD_FIVEFOOD;
    				else
    					ExtraFoodStyle[i] = FOOD_NORMAL;
    			}
    		}
    	}
    	return Success;
    }
    
    int EatFood()
    {
    	int success = 0;
    	struct Snake *ps = (struct Snake*)malloc(sizeof(struct Snake));
    	if (Snake_Head->x == Food.x && Snake_Head->y == Food.y)
    	{
    		//食物被吃
    		ps->x = Food.x;
    		ps->y = Food.y;
    		ps->next = Snake_Head;
    		ps->front = NULL;
    		Snake_Head->front = ps;
    		Snake_Head = ps;
    
    		//生成食物
    		CreateFood(0);
    		//描绘食物
    		xSetColor(FWHITE);
    		xSetCursor(Food.x,Food.y);
    		printf("%2s",sharp[SFood]);
    		success = 1;
    		if (FoodStyle == FOOD_GETDEF)
    			Tool_Defense++;
    		if (FoodStyle == FOOD_FIVEFOOD)
    			Tool_FiveFood++;
    	}
    	
    
    	int i;
    	for (i = 0; i < 5; i++)	//额外食物
    	{
    		if (ExtraFood[i]->next != NULL)
    		{
    			if (Snake_Head->x == ExtraFood[i]->x && Snake_Head->y == ExtraFood[i]->y)
    			{
    				ps = (struct Snake*)malloc(sizeof(struct Snake));
    				ps->x = ExtraFood[i]->x;
    				ps->y = ExtraFood[i]->y;
    				ps->next = Snake_Head;
    				ps->front = NULL;
    				Snake_Head->front = ps;
    				Snake_Head = ps;
    				if (ExtraFoodStyle[i] == FOOD_GETDEF)
    					Tool_Defense++;
    				if (ExtraFoodStyle[i] == FOOD_FIVEFOOD)
    					Tool_FiveFood++;
    				ExtraFood[i]->next = NULL;
    				success = 1;
    			}
    		}
    	}
    	Draw_Tool();
    	return success;
    }
    
    int Snake_Ctrl(unsigned char ch)
    {			
    	switch(ch)		//方向改变返回1 用于Sanke_Defense()
    	{
    	case 224:
    		Snake_Ctrl(getch());
    		break;
    	case 72:
    	case 119:
    		if (Direct != DOWN )
    			Direct = UP;
    		return 1;
    	case 80:
    	case 115:
    		if (Direct != UP)
    			Direct = DOWN;
    		return 1;
    	case 77:
    	case 100:
    		if (Direct != LEFT)
    			Direct = RIGHT;
    		return 1;
    	case 75:
    	case 97:
    		if (Direct != RIGHT)
    			Direct = LEFT;
    		return 1;
    	case 32:
    		IsPause = 1;
    		break;
    	case 49:
    		if (Tool_FiveFood > 0)
    		{
    			CreateFood(5);
    			Draw_Food();
    			Tool_FiveFood--;
    			Draw_Tool();
    		}
    	default:		
    		while(kbhit())
    		{	
    			if (IsGameCtrl(ch))
    				Snake_Ctrl(getch());
    			else 
    				ch = getch();
    		}
    	}
    	return 0;
    }
    int Snake_Defense()
    {
    	if (Tool_Defense > 0)
    	{
    		CtrlWnd_Flash("撞车了!","无敌护罩开启!",4,1);
    		CtrlWnd_Flash("撞车了!","无敌护罩开启!",4,1);
    		CtrlWnd_Flash("撞车了!","无敌护罩开启!",4,1);
    		CtrlWnd_Flash("赶紧跑!","换个方向继续!",6,1);
    		CtrlWnd_Flash("赶紧跑!","换个方向继续!",6,0);
    		while(IsDeath())
    		{
    			if (Snake_Ctrl(getch())  && !IsDeath()) break;
    		}
    		CtrlWnd_Flash("        ","              ",6,0);
    		Tool_Defense--;
    		Draw_Play();
    		Draw_Tool();
    		return 1;
    	}
    	return 0;
    }
    
    void Draw_Score()
    {
    	xSetColor(FGREEN);
    	xSetCursor(MAP_WIDTH * 2 + CTRLWNDLEFT + 4, 3);
    	printf("等级:%8d",LEVEL);
    	xSetCursor(MAP_WIDTH * 2 + CTRLWNDLEFT + 4, 4);
    	if (Score == 0)
    		printf("经验:%8d",EXP);
    	else
    		printf("经验:%6d/%d",EXP,(LEVEL+1)*30);
    	xSetCursor(MAP_WIDTH * 2 + CTRLWNDLEFT + 4, 5);
    	printf("吞噬:%8d",EatNum);
    	xSetCursor(MAP_WIDTH * 2 + CTRLWNDLEFT + 4, 6);
    	printf("分数:%8d",Score);
    	
    }   
     
    void Draw_CtrlWnd()
    {	//画控制面板
    	int m,n;
    	//xSetColor(BBLACK|FBLUE);
    	xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT,1);
    	for (n = 1; n <= CTRLWNDWIDTH; n++)
    	{
    		printf("%2s",sharp[Wall]);
    	}
    	xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT , CTRLWNDHIGH);
    	for (n = 1; n <= CTRLWNDWIDTH; n++)
    	{
    		printf("%2s",sharp[Wall]);
    	}
    	for (m = 1; m <= CTRLWNDHIGH; m++)
    	{
    		xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT, m);
    		printf("%2s",sharp[Wall]);
    		xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + CTRLWNDWIDTH*2, m );
    		printf("%2s",sharp[Wall]);
    	}
    }
    
    int IsGameCtrl(unsigned char ch)
    {
    	switch(ch)
    	{
    	case 49:	//1
    	case 97:	//a  
    	case 100:	//d
    	case 115:	//s
    	case 119:	//w
    	case 224:	//控制
    	case 72:	//上
    	case 75:	//左
    	case 80:	//下
    	case 77:	//右
    	case 32:	//空格
    		return 1;
    	default:
    		return 0;
    	}
    }
    void Game_Pause()
    {
    	int m;
    	xSetColor(FPURPLE);
    	xSetCursor(MAP_WIDTH/2*2-6,MAP_HIGH/2);
    	printf("  暂停中!  ");
    
    	while(IsPause)
    	{
    		CtrlWnd_Flash("暂停中!","按随意键继续!",4,1);
    		if (kbhit())
    		{
    			if (getch() == 224) getch();
    			IsPause = 0;
    		}
    	}
    	xSetColor(FGREEN);
    	xSetCursor(MAP_WIDTH/2*2-7,MAP_HIGH/2);
    	for (m = 1 ; m <= 8; m++)
    		printf("%2s",sharp[White]);
    	Draw_Snake();
    	Draw_Play();
    }
    
    void Game_Over()
    {
    	Cls_CtrlWnd();
    	Draw_Score();
    	xSetColor(FPURPLE);
    	xSetCursor(MAP_WIDTH/2*2-10,MAP_HIGH/2);
    	printf("  GAME OVER!   SCORE = %d  ",Score);
    	CtrlWnd_Flash("已阵亡!","按回车再来一把!",9,0);
    	xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 3,CTRLWNDHIGH - 12);
    	printf("终于得分: %d",Score);
    	while(getch() != 13);
    	Cls_CtrlWnd();
    }
    
    void CalcScore(int num)
    {
    	Score= Score + num*5 + rand()%3;
    	EatNum++;
    	EXP = EXP + (LEVEL + 1)*3 + num*5 + rand()%4;
    	if (EXP >= (LEVEL+1)*30) 
    		Draw_UpLevel();
    	while (EXP >= (LEVEL+1)*30) 
    	{
    		EXP = EXP - (LEVEL+1)*30;
    		LEVEL++;
    		if (EXP < 0 )
    			EXP = 0;
    		if (SPEED - 10 > MAXSPEED)
    			SPEED = SPEED - 10;
    	}
    	Draw_Score();
    	
    }
    void Draw_Play()
    {
    	CtrlWnd_Flash("游戏中!","按空格键暂停!",4,0);
    }
    
    void Draw_Food()
    {
    	//描绘食物
    	xSetColor(FWHITE);
    	xSetCursor(Food.x,Food.y);
    	printf("%2s",sharp[SFood]);
    	int i;
    	for (i=0; i<5; i++)
    	{
    		if (ExtraFood[i]->next != NULL)
    		{
    			xSetColor(FWHITE);
    			xSetCursor(ExtraFood[i]->x,ExtraFood[i]->y);
    			printf("%2s",sharp[SFood]);
    		}
    	}
    }
    void Cls_CtrlWnd()
    {
    	int m,n;
    	//xSetColor(BBLACK);
    	for (m = 2; m < CTRLWNDHIGH; m++)
    	{
    		xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 2 , m);
    		for (n = 2; n < CTRLWNDWIDTH; n++)
    			printf("11");
    		
    	}
    }
    void Draw_UpLevel()
    {	
    	CtrlWnd_Flash("           ","             ",4,0);
    	CtrlWnd_Flash("升级了!","速度有所提升!",7,1);
    	CtrlWnd_Flash("升级了!","速度有所提升!",7,1);
    	CtrlWnd_Flash("游戏中!","按空格键暂停!",4,0);
    	
    }
    
    void Draw_Tool()
    {
    	xSetColor(FGREEN);
    	xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 4,8);
    	printf("道具:      ");
    	if (Tool_Defense > 0)
    	{
    		xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 7,9);
    		printf("无敌护罩:%-4d",Tool_Defense);
    	}
    	if (Tool_FiveFood > 0)
    	{
    		xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 4,10);
    		printf("[1]食物爆发:%-4d",Tool_FiveFood);
    	}
    
    	if (Tool_Defense <= 0 && Tool_FiveFood <= 0)
    	{
    		xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 11,8);
    		printf("无");
    		CtrlWnd_Flash("                ","                 ",CTRLWNDHIGH - 10,0);
    	}
    
    }
    
    /*控制区域闪烁型提示*/
    void CtrlWnd_Flash(char *a,char *b,int loc,int isflash)
    {
    	int t;
    	xSetColor(FGREEN);
    	xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 3,CTRLWNDHIGH - 1 - loc);
    	printf("%s",a);
    	if (b != NULL)
    	{
    		xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 3,CTRLWNDHIGH  - loc);
    		printf("%s",b);
    	}
    	if (isflash)
    	{
    		Sleep(500);
    		xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 3,CTRLWNDHIGH - 1 - loc);
    		t = strlen(a);
    		for (; t > 0 ; t--)
    			printf(" ");
    		if (b != NULL)
    		{
    			xSetCursor(MAP_WIDTH*2 + CTRLWNDLEFT + 3,CTRLWNDHIGH  - loc);
    			t = strlen(b);
    			for (; t > 0 ; t--)
    				printf(" ");
    		}
    		Sleep(500);
    	}
    }
    


    main.c

    /*
      	wsad或方向键控制上下左右
    	取消多线程
    	修正死亡时钻入墙中
    	修正与自身相撞漏洞
    	修正非法输入时失控 
    	增加開始画面 
    	增加控制面板显示区域 
    */
    #include"snake.h" 
     
    
    int main() 
    {
    	SetConsoleTitle("贪吃蛇V3.0       QQ:836663997  WSAD或方向键控制 1键使用道具");
    	BeginImage();
    	while(1)		//一次循环一次游戏 
    	{
    		/*游戏初始准备*/
    		system("cls");
    		Init();
    		Start();
    		while(1)		//游戏主体           
    		{
    			Move(); 
    			Sleep(SPEED);	
    			if (kbhit())	Snake_Ctrl(getch());
    			if (EatFood())	CalcScore(1);
    			if (IsPause)	Game_Pause();
    			if (IsDeath())
    				if (Snake_Defense()) ;
    				else break; 
    		}
    		Game_Over();
    	}
        return 0;
    }
    


    预览图:




  • 相关阅读:
    Using sudo inside a docker container
    python enumerate用法总结
    如何保存Keras模型
    python pickle模块
    如何选择开源项目的license
    github在线创建文件夹
    关于python3.4版本中的zip函数
    使用sqoop 在关系型数据库和Hadoop之间实现数据的抽取
    HBase Shell 常见操作
    Java API 实现HBase的数据添加与过滤查询
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5230847.html
Copyright © 2011-2022 走看看