贪吃蛇大作战 - CSDN
精华内容
参与话题
  • 贪吃蛇大作战游戏——C语言

    千次阅读 2019-09-25 08:39:56
    是你想要的贪吃蛇吗? 快来看看吧~ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <Windows.h> #include <time.h> //宏...

    是你想要的贪吃蛇吗?
    快来看看吧~
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <Windows.h>
    #include <time.h>
    
    //宏定义
    #define UP 1
    #define DOWN 2
    #define LEFT 3
    #define RIGHT 4
    
    typedef struct snake	//链表,存放蛇身坐标 
    {
    	int x;
    	int y;
    	struct snake *next; //蛇身的下一个节点 
    }snake;
    snake *head = NULL;
    snake *food = NULL;
    
    int score;
    int add = 1;
    int direction = RIGHT;
    int sleepTime = 300;
    int endStatus = 0;
    
    int setColor(int c);
    int gotoXY(int x, int y);
    int printSnake(void);
    int welcomeGame(void);
    int aboutGame(void);
    int printMap(void);
    int showScoreTips(void);
    int readFile(void);
    int initSnake(void);
    int randFood(void);
    int moveSnake(void);
    int moveKeyControl(void);
    int speedUp(void);
    int isHitWall(void);
    int isBiteSelf(void);
    int failGameUi(void);
    int endGame(void);
    int writeFile(int score);
    int snakeDestroy(void);
    
    int setColor(int c)
    {
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
    
    	return 0;
    } 
    
    int gotoXY(int x, int y)
    {
    	COORD c;
    	c.X = x;
    	c.Y = y;
    	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
    	
    	return 0; 
    } 
    
    int printSnake(void)
    {
     	//清屏
        system("cls");
    
        gotoXY(35, 1);
        setColor(6);
        printf("/^\\/^\\");      //蛇眼睛
    
        gotoXY(34, 2);
        printf("|__|  O|");      //蛇眼睛
    
        gotoXY(33, 2);
        setColor(2);
        printf("_");
    
        gotoXY(25, 3);
        setColor(12);
        printf("\\/");          //蛇信
    
        gotoXY(31, 3);
        setColor(2);
        printf("/");
    
        gotoXY(37, 3);
        setColor(6);
        printf(" \\_/");        //蛇眼睛
    
        gotoXY(41, 3);
        setColor(10);
        printf(" \\");
    
        gotoXY(26, 4);
        setColor(12);
        printf("\\____");       //舌头
    
        gotoXY(32, 4);
        printf("_________/");
    
        gotoXY(31, 4);
        setColor(2);
        printf("|");
    
        gotoXY(43, 4);
        setColor(10);
        printf("\\");
    
        gotoXY(32, 5);
        setColor(2);
        printf("\\_______");    //蛇嘴
    
        gotoXY(44, 5);
        setColor(10);
        printf("\\");
    
        gotoXY(39, 6);
        printf("|     |                  \\");  //下面都是画蛇身
    
        gotoXY(38, 7);
        printf("/      /                   \\");
    
        gotoXY(37, 8);
        printf("/      /                    \\ \\");
    
        gotoXY(35, 9);
        printf("/      /                       \\ \\");
    
        gotoXY(34, 10);
        printf("/     /                          \\  \\");
    
        gotoXY(33, 11);
        printf("/     /             _----_         \\   \\");
    
        gotoXY(32, 12);
        printf("/     /           _-~      ~-_         |  |");
    
        gotoXY(31, 13);
        printf("(      (        _-~    _--_    ~-_     _/  |");
    
        gotoXY(32, 14);
        printf("\\     ~-____-~    _-~    ~-_    ~-_-~    /");
    
        gotoXY(33, 15);
        printf("~-_           _-~          ~-_       _-~");
    
        gotoXY(35, 16);
        printf("~--______-~                ~-___-~");
    	
    }
    
    int welcomeGame(void)
    {
    	int i;
    	int j;
    	int n;
    	 
    	printSnake();
    	
    	setColor(11);
    	gotoXY(45, 18);
    	printf("贪 吃 蛇 游 戏");
    	 
    	setColor(14); 
    	for(i = 20; i <= 26; i++){
    		for (j = 27; j <= 74; j++)
    		{
    			gotoXY(j, i);
    			if(i == 20 || i == 26)
    			{
    				printf("-");
    			}
    			else if (j == 27 || j == 74)
    			{
    				printf("|");
    			}		
    			else
    			{
    				printf(" "); 
    			}	
    		}
    	} 
    	
    	//输出菜单 
    	setColor(12);
    	gotoXY(35, 22);
    	printf("1.开始游戏");
    	gotoXY(55, 22);
    	printf("2.游戏说明");
    	gotoXY(35, 24);
    	printf("3.退出游戏"); 
    	
    	setColor(3);
    	gotoXY(27, 27);
    	printf("请选择[1 2 3]: [   ]\b\b\b");
    	
    	scanf("%d", &n);
    	getchar(); 
    	
    	return n;	
    }
    
    int aboutGame(void)
    {
    	int i, j;
    	
    	system("cls");
    	setColor(13);
    	gotoXY(44, 3);
    	printf("游戏说明");
    	
    	setColor(2);
    	for(i=6; i <= 22; i++)
    	{
    		for(j = 20; j<=75; j++)
    		{
    			gotoXY(j, i);
    			if(i == 6 || i == 22)
    			{
    				printf("=");		
    			}
    			else if(j == 20 || j == 75)
    			{
    				printf("||");	
    			}	
    			else 
    			{
    				printf(" ");
    			}
    		}	
    	}
    	
    	//输出游戏说明界面 
    	setColor(3);
    	gotoXY(30, 8);
    	printf("☆1: 不能穿墙,不能咬到自己");
    	
    	setColor(10);
    	gotoXY(30, 11);
    	printf("☆2: 用↑、↓、←、→控制蛇的移动方向");
    	
    	setColor(14);
    	gotoXY(30, 14);
    	printf("☆3: F1加速,F2减速");
    	
    	setColor(11);
    	gotoXY(30, 17);
    	printf("☆4: 按空格键暂停游戏,再按空格键继续");
    	
    	setColor(4);
    	gotoXY(30, 20);
    	printf("☆5: ESC退出游戏,spece暂停游戏");	
    	
    	gotoXY(20, 24);
    	setColor(12);
    	printf("请按下回车键返回主界面"); 
    	
    	return 0;
    }
    
    int printMap(void)
    {
    	int i=0, j=0;
    	
    	system("cls");
    	
    	//一个方块占两列 
    	for(i=0; i<27; i++)
    	{
    		for(j=0; j<57; j+=2)	
    		{
    			gotoXY(j, i);
    			if(i == 0 || i == 26 || j == 0 || j == 56)
    			{
    				setColor(5);
    				printf("□");				
    			}
    			else
    			{
    				setColor(3);
    				printf("■");
    			}
    		}
    	} 
    
    }
    
    int showScoreTips(void)
    {
    	int highScore = 0;
    	
    	setColor(11);
    	gotoXY(64, 4);
    	highScore = readFile(); 
    	printf("☆最高记录☆: %d", highScore);
    	
    	setColor(14);
    	gotoXY(64, 8);
    	printf("得分: %d", score    );
    	
    	setColor(12);
    	gotoXY(72, 11);
    	printf("温 馨 提 示");
    	
    	setColor(6);
    	gotoXY(60, 13);
    	printf("==============================");
    	gotoXY(60, 25);
    	printf("==============================");
    	
    	setColor(3);
    	gotoXY(61, 14);
    	printf("每个食物得分:%d", score);
    	gotoXY(61, 16);
    	printf("不能穿墙,不能咬到自己");
    	gotoXY(61, 18);
    	printf("用↑↓←→分别控制蛇移动方向");
    	gotoXY(61, 20);
    	printf("tip3: F1加速,F2减速");
    	gotoXY(61, 22);
    	printf("space: 暂停游戏");
    	gotoXY(61, 24);
    	printf("ESC: 退出游戏"); 
    }
    
    int readFile(void)
    {
    	int n = 0; 
    	FILE *fp = NULL;
    	//打开文件 
    	fp = fopen("save.txt", "a+");
    	if(NULL == fp)
    	{
    		printf("打开文件失败、、、\n");
    		return -1; 
    	}
    
    	fscanf(fp, "%d", &n);
    	
    	fclose(fp);
    	
    	return n;
    	  
    }
    
    int initSnake(void)
    {
    	int i= 0;
    	
    	snake *new1 = NULL;
    	snake *tmp = NULL;
    	
    	//创建四个蛇节点 
    	for (i = 0; i < 4; i++)
        {  
        	//分配空间		        
    		new1 = (snake*)malloc(sizeof(snake));
    		if(NULL == new1)
    		{
    			printf("malloc failes...\n");
    			break;
    		}
    		//清零 
    		memset(new1, 0, sizeof(snake));
    		
    		//初始化列为偶数 
            new1->x = 24 + i * 2;
            new1->y = 5;
            
    		//头插法 
    	    new1->next = head;
            head = new1;
        }
        
    	tmp = head;
        while (NULL != tmp)
        {
            setColor(14);
            gotoXY(tmp->x, tmp->y);
            
            if (head == tmp)
            {
                printf("◆");
            }
            else
            {
                printf("★");
            }
    		//指向下一个节点 
            tmp = tmp->next;
        }
       return 0; 
    }
    
    int randFood(void)
    {
    	snake *new2 = NULL;
        snake *tmp = NULL;
        
        //分配空间 
        new2 = malloc(sizeof(snake));
        if (NULL == new2)
        {
            gotoXY(1, 28);
            printf("malloc failed...\n");
            return -1;
        }   
    	 
        while (1)
        {        
        	//清零 
        	memset(new2, 0, sizeof(snake));
        	
        	//随机X值 
            while (1)
            {
            	//随机X值,为偶数 
                new2->x = rand() % 53 + 2;
                if (new2->x % 2 == 0)
                {
                    break;
                }
            }
            //1-25
            new2->y = rand() % 25 + 1;
            
    		//判断食物不能在蛇身上
            tmp = head;
            while (NULL != tmp)
            {
                if ((tmp->x == new2->x) && ( tmp->y == new2->y))
                {
                    break;
                }
    			tmp = tmp->next;
            }
            
            //食物不在蛇身上 
            if (NULL == tmp)
            {
                gotoXY(new2->x, new2->y);
                setColor(12);
                printf("●");
                
                food = new2;
                break;
            }
            else
            {
                continue;
            }
        }
    	
    	
    	return 0;
    }
    
    int moveSnake(void)
    {
    	snake *new = NULL;
    	snake *tmp = NULL;
    	snake *save = NULL; 	//保存上一个节点 
    	
    	//分配空间 
    	new = malloc(sizeof(snake));
    	if(NULL == new)
    	{
    		printf("malloc failed...\n");
    		return -1;		
    	}	
    	memset(new, 0, sizeof(snake));
    	
    	//向上 
    	if(direction == UP)
    	{
    		new->x = head->x;
    		new->y = head->y-1;	
    	}
    	
    	//向下 
    	if(direction == DOWN) 
    	{
    		new->x = head->x;
    		new->y = head->y+1;	
    	}
    	
    	//向左 
    	if(direction == LEFT)
    	{
    		new->x = head->x-2;
    		new->y = head->y;	
    	}
    	
    	//向右 
    	if(direction == RIGHT)
    	{
    		new->x = head->x+2;
    		new->y = head->y;	
    	}
    	
    	//头插法
    	new->next = head;
    	head = new;
    	
    	//使用临时节点指向链表第一个节点
    	tmp = head;
    	//前面是否为食物
    	if(head->x == food->x && head->y == food->y) 
    	{
    		while (NULL != tmp)
      	    {
    		setColor(14);
            gotoXY(tmp->x, tmp->y);
            
            if (tmp == head)
            {
            	printf("◆");
            }
            else
            {
                printf("★");
            }
    		//指向下一个节点 
            	tmp = tmp->next;
    		}
    		
    		//吃掉食物后,分数增加
    		score += add;
    		
    		//随机食物
    		randFood(); 
    	}
    	else
    	{
    		//删除最后一个节点 
    		while (NULL != tmp->next)
    		{
    			setColor(14);
            	gotoXY(tmp->x, tmp->y);
            
    	        if (tmp == head)
    	        {
    	        	printf("◆");
    	        }
    	        else
    	        {
    	            printf("★");
    	        }
    	        
    	        //保存tmp节点
    			save = tmp; 
    			//指向下一个节点 
            	tmp = tmp->next;
    		}
    	
    		gotoXY(tmp->x, tmp->y);
    		setColor(3);
    		printf("■");
    		
    		save->next = NULL;
    		free(tmp);
    		tmp = NULL;		
    	}	
    	
    	return 0; 
    	
    }
    
    int moveKeyControl(void)
    {
    	//默认向右 
    	direction = RIGHT;
    	
    	while(1)
    	{
    		showScoreTips();
    		
    		if(GetAsyncKeyState(VK_UP) && direction != DOWN)
    		{
    			direction = UP;
    		}
    		 
    		if(GetAsyncKeyState(VK_DOWN) && direction != UP)
    		{
    			direction = DOWN;
    		} 
    	
    		if(GetAsyncKeyState(VK_LEFT) && direction != RIGHT)
    		{
    			direction = LEFT;
    		}
    		
    		if(GetAsyncKeyState(VK_RIGHT) && direction != LEFT)
    		{
    			direction = RIGHT;
    		}
    		
    		if(GetAsyncKeyState(VK_SPACE))
    		{
    			while(1)
    			{
    				if(GetAsyncKeyState(VK_SPACE))
    				{
    					break;
    				}
    				Sleep(200);
    			}
    		}		
    		
    		if(GetAsyncKeyState(VK_F1))
    		{
    			speedUp();
    		}
    		
    		if(GetAsyncKeyState(VK_F2))
    		{
    			speedDown();
    		}
    		
    		//ESC结束游戏 
    		if(GetAsyncKeyState(VK_ESCAPE))
    		{
    			endStatus = 3;
    			endGame();
    			break;
    		}
    		
    		moveSnake();
    		
    		if(isHitWall() == 1)
    		{
    			endStatus = 1;
    			endGame();
    			break;
    		}
    		if(isBiteSelf())
    		{
    			endStatus = 2;
    			endGame();
    			break;
    		}
    		Sleep(sleepTime);	
    	}	
    	return 0;
    } 
    
    int speedUp(void)
    {
    	if(sleepTime > 50)
    	{
    		sleepTime -= 50;
    		add +=2; 
    	}
    	return 0;
    }
    
    int speedDown(void)
    {
    	if(sleepTime <300)
    	{
    		sleepTime += 10;
    		add -=2; 
    	}
    	if(sleepTime > 250)
    	{
    		add =1; 
    	}
    	return 0;
    }
    
    int isHitWall(void)
    {
    	if(head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)
    	{
    		return 1;
    	}
    	
    	return 0;
    }
    
    int isBiteSelf(void)
    {
    	snake *tmp = NULL;
    	
    	tmp = head->next;
    	while(tmp != NULL)
    	{
    		if(head->x == tmp->x && head->y == tmp->y)
    		{
    			return 1;
    		}
    		tmp = tmp->next; 
    	}
    	return 0;
    }
    
    int failGameUi(void)
    {
    	system("cls");
    	 
    	int i;
    	
    	gotoXY(46, 2);
    	setColor(6);
    	printf("\\\\\\|///");
    	gotoXY(44, 3);
    	printf("\\\\");
    	
    	setColor(15);
    	gotoXY(47, 3);
    	printf(".-.-");
    	
    	setColor(6);
    	gotoXY(53, 3);
    	printf("//");
    	
    	setColor(14);
    	gotoXY(44, 4);
    	printf("(");	//左耳朵
    	
    	setColor(15);
    	gotoXY(47, 4);
    	printf(".@.@");
    	
    	setColor(14);
    	gotoXY(53, 4);
    	printf(")");	//右耳朵 
    	
    	//边框	
    	setColor(11);
    	gotoXY(17, 5);
    	printf("+-----------------");
    	
    	gotoXY(35, 5);
    	setColor(14);
    	printf("o00o");
    	
    	gotoXY(39, 5);
    	setColor(11);
    	printf("----------");
    	
    	gotoXY(48, 5);
    	setColor(14);
    	printf("(_)");
    	
    	gotoXY(51, 5);
    	setColor(11);
    	printf("----------");
    	
    	gotoXY(61, 5);
    	setColor(14);
    	printf("o00o");
    	
    	gotoXY(65, 5);
    	setColor(11);
    	printf("-----------------+");
    	
    	for(i=6; i<20; i++)
    	{
    		gotoXY(17, i);
    		printf("|");
    		gotoXY(82, i);
    		printf("|");
    	}
    	
    	gotoXY(17, 20);
    	printf("+----------------------------------");
    	
    	gotoXY(52, 20);
    	setColor(14);
    	printf("☆☆☆");
    	
    	gotoXY(60, 20);
    	setColor(11);
    	printf("----------------------+"); 
    
    	return 0;
    } 
    
    int endGame(void)
    {
    		
    	system("cls");
    	
    	//显示失败界面边框 
    	failGameUi(); 
    	
    	int highScore=0;
    	int n=0;
    
    	
    	while(1)
    	{
    		gotoXY(38, 9);
    		setColor(12);
    		
    		switch(endStatus)
    		{
    			case 1:
    				printf("对不起,您已撞墙,游戏结束!");
    				break;
    			
    			case 2:
    				printf("对不起,您咬到自己,游戏结束!");
    				break;
    				
    			case 3:
    				printf("您已经结束了游戏!");
    				break;
    				
    			default:
    				break;		
    		}
    		
    		//显示得分 
    		setColor(13);
    		gotoXY(43, 12);
    		printf("您的得分是:%d", score);
    		
    		//显示最高记录 
    		highScore = readFile();
    		
    		if(score > highScore)
    		{
    			setColor(10); 
    			gotoXY(38, 16);
    			printf("您已创造新的最高记录!"); 
    			writeFile(score);
    		} 
    		else
    		{
    			setColor(10);
    			gotoXY(38, 16);
    			printf("继续努力,离最高分还差:%d", highScore - score); 	 	
    		}
    		
    		//显示选择菜单
    		setColor(12);
    		gotoXY(25, 23);
    		printf("我要再玩一局----1");
    		gotoXY(52, 23);
    		printf("不玩了,退出----2");
    		
    		setColor(11);
    		gotoXY(46, 25);
    		printf("请选择:[   ]\b\b\b");
    		
    		scanf("%d", &n);
    		getchar();
    		
    		if(n == 1)
    		{
    			//回到初始状态 
    			sleepTime = 250;
    			score = 0;
    			add = 1;
    			
    			//销毁蛇节点 
    			snakeDestroy();
    			
    			//初始化头指针 
    			head = NULL;
    			break;
    		}
    		else if(n == 2)
    		{
    			exit(0);	
    		} 
    		else
    		{
    			setColor(12);
    			gotoXY(30, 27);
    			printf("您的输入有误,请重新输入,按下任意键继续");
    			getchar();
    			continue; 
    		}
    	}
    	return 0;
    }
    
    int writeFile(int score)
    {
    	FILE *fp = NULL;
    	fp = fopen("save.txt", "w");
    	if(NULL == fp)
    	{
    		printf("打开文件失败...\n");
    		return -1;			
    	}	
    	
    	fprintf(fp, "%d", score);
    	
    	return 0;
    }
    
    int snakeDestroy(void)
    {
    	snake *tmp = NULL;
    	snake *save = NULL;
    	
    	tmp = head;
    	while(NULL != tmp)
    	{
    		save = tmp->next;
    		free(tmp);
    		tmp = save;	
    	}	
    	head = NULL;
    	
    	return 0;	
    }
    	
    
     
    int main()
    {
    	//显示控制台宽高 
    	system("mode con cols=100 lines=30");
    	
    	int n;
    	
    	while(1)
    	{
    		system("cls");
    		
    		n = welcomeGame();
    		switch(n)
    		{
    		case 1:
    			printMap();
    			showScoreTips();
    			initSnake();
    			randFood();
    			moveKeyControl();
    		
    			break;
    			
    		case 2:
    			aboutGame();
    			break;
    			
    		case 3:
    			exit(0);
    			break;
    			
    		default:
    			;
    		}
    		getchar();
    	}
    	system("pause"); 
    	return 0; 
    }
    
    展开全文
  • 代码: 代码有点长, #include<stdio.h> #include<Windows.h> #include<time.h> #include<stdlib.h> #include<conio.h> #define U 1 #define D 2 #define L 3 ... i...

    代码:

    代码有点长,

    #include<stdio.h>
    #include<Windows.h>
    #include<time.h>
    #include<stdlib.h>
    #include<conio.h>
    
    #define U 1
    #define D 2
    #define L 3
    #define R 4
    
    struct snake
    {
    	int x;
    	int y;
    	snake* next;
    };
    
    int score = 0, add = 10;
    int HighScore = 0;
    int status = 0, Sleeptime = 200;
    snake* head, * food;
    snake* q;
    int endgamestatus = 0;
    HANDLE Hout;
    
    /*         函  数  声  明           */
    int color(int c);                 //1
    void gotoxy(int x, int y);        //2
    void printsnake();                //3
    void welcome_to_game();           //4
    void createMap();                 //5  
    void score_and_tips();            //6
    void File_out();                  //7
    void initsnake();                 //8
    void createfood();                //9
    bool bitself();                   //10
    void cantcrosswall();             //11
    void speedup();                   //12
    void speeddown();                 //13
    void snakemove();                 //14
    void keyboardControl();           //15
    void Lostdraw();                  //16
    void endgame();                   //17
    void file_in();                   //18
    void choose();                    //19
    void explation();                 //20
    
    
    //主类型
    int main()
    {
    	printsnake();
    	welcome_to_game();
    	return 0;
    }
    
    /*          子    函    数          */
    
    //改变颜色
    int color(int c)
    {
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
    	return 0;
    }
    
    /*获得控制台的坐标位置*/
    void gotoxy(int x, int y)
    {
    	COORD c;
    	c.X = x;
    	c.Y = y;
    	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
    }
    
    //打印贪吃蛇
    void printsnake()
    {
    	gotoxy(35, 1);
    	color(6);
    	printf("/^\\/^\\");
    
    	gotoxy(34, 2);
    	printf("|__|  o|");
    
    	gotoxy(32, 2);
    	color(2);
    	printf("_");
    
    	gotoxy(30, 3);
    	color(2);
    	printf("/      \\_/ \\");
    
    	gotoxy(37, 3);
    	color(6);
    	printf("\\_/");
    
    	gotoxy(30, 4);
    	color(2);
    	printf("|__________/\\");
    
    	gotoxy(20, 3);
    	color(12);
    	printf("\\/");
    
    	gotoxy(21, 4);
    	color(12);
    	printf("\\________ __________");
    
    	gotoxy(30, 4);
    	color(2);
    	printf("|");
    
    	gotoxy(41, 4);
    	color(2);
    	printf("/\\");
    
    	gotoxy(30, 5);
    	printf("\\______      \\");
    
    	gotoxy(36, 7);
    	printf("/      /");
    
    	gotoxy(35, 8);
    	printf("/      /");
    
    	gotoxy(34, 9);
    	printf("/      /                             \\");
    
    	gotoxy(33, 10);
    	printf("/      /                             \\   \\");
    
    	gotoxy(32, 11);
    	printf("/      /                               \\    \\");
    
    	gotoxy(31, 12);
    	printf("/      /            ----------- ~-       \\     \\");
    
    	gotoxy(31, 13);
    	printf("\\      \\_________-~                ~-      \\    \\");
    
    	gotoxy(32, 14);
    	printf("\\                    -~-----~-      ~-----       \\");
    
    	gotoxy(33, 15);
    	printf("\\_______________- ~           ~-________________/");
    
    	printf("\n");
    }
    
    //游戏欢迎界面
    void welcome_to_game()
    {
    	int n;
    	int i, j = 1;
    	color(11);
    	gotoxy(43, 18);
    	printf("贪 吃 蛇 大 作 战");
    	color(14);
    	for (i = 20; i <= 26; ++i)
    	{
    		for (j = 27; j <= 74; ++j)
    		{
    			gotoxy(j, i);
    			if (i == 20 || i == 26)
    				printf("-");
    			if (j == 28 || j == 73)
    				printf("|");
    			
    		}
    	}
    	color(12);
    	gotoxy(35, 22);
    	printf("1.开始游戏");
    	gotoxy(55, 22);
    	printf("2.游戏说明");
    	gotoxy(35, 24);
    	printf("3.退出游戏");
    
    	color(3);
    	gotoxy(29, 27);
    	printf("请选择:[1,2,3]:[ ]\b\b");
    	color(14);
    	scanf_s("%d", &n);
    	switch (n)
    	{
    	case 1:system("cls");
    		createMap();
    		initsnake();
    		createfood();
    		File_out();
    		keyboardControl();
    		break;
    	case 2:
    		explation();
    		break;
    	case 3:
    		exit(0);
    		break;
    	}
    }
    
    //创建游戏地图
    void createMap()
    {
    	int i, j;
    	for (i = 0; i < 58; i += 2)
    	{
    		gotoxy(i, 0);
    		color(5);
    		printf("□");
    		gotoxy(i, 26);
    		printf("□");
    	}
    	for (i = 1; i < 26; ++i)
    	{
    		gotoxy(0, i);
    		printf("□");
    		gotoxy(56, i);
    		printf("□");
    	}
    
    	for (i = 2; i < 56; i += 2)
    	{
    		for (j = 1; j < 26; j++)
    		{
    			gotoxy(i, j);
    			color(3);
    			printf("■\n\n");
    		}
    	}
    }
    
    //分数和操作提示
    void score_and_tips()
    {
    	File_out();
    	color(11);
    	color(11);
    	gotoxy(64, 4);
    	printf("☆最高纪录☆:%d", HighScore);
    	color(14);
    	gotoxy(64, 8);
    	printf("得分:%d", score);
    	color(13);
    	gotoxy(73, 11);
    	printf("小 提 示:");
    	color(6);
    	gotoxy(60, 13);
    	printf("╬------------------------------╬");
    	gotoxy(60, 25);
    	printf("╬------------------------------╬");
    	color(3);
    	gotoxy(64, 14);
    	printf("每个食物得分:%d分",add);
    	gotoxy(64, 16);
    	printf("不能穿墙,不能咬到自己");
    	gotoxy(64, 18);
    	printf("用↑↓←→分别控制蛇的移动");
    	gotoxy(64, 20);
    	printf("F1为加速,F2为减速");
    	gotoxy(64, 22);
    	printf("space:暂停游戏");
    	gotoxy(64, 24);
    	printf("ESC:退出游戏");
    }
    
    //读入最高分
    void File_out()
    {
    	FILE* fp;
    	fopen_s(&fp, "save.txt", "a+");
    	fscanf_s(fp, "%d", &HighScore);
    	fclose(fp);
    }
    
    //绘制蛇身
    void initsnake()
    {
    	snake* tail;
    	int i;
    	tail = (snake*)malloc(sizeof(snake));
    	tail->x = 24;
    	tail->y = 5;
    	tail->next = NULL;
    	for (i = 1; i <= 4; ++i)
    	{
    		head = (snake*)malloc(sizeof(snake));
    		head->next = tail;
    		head->x = 24 + 2 * i;
    		head->y = 5;
    		tail = head;
    	}
    	while (tail != NULL)
    	{
    		gotoxy(tail->x, tail->y);
    		color(14);
    		printf("☆");
    		tail = tail->next;
    	}
    	gotoxy(30, 30);
    }
    
    //绘制食物
    void createfood()
    {
    	snake* food_1;
    	food_1 = (snake*)malloc(sizeof(snake));
    	food_1->x = 1;
    	while ((food_1->x % 2) != 0)
    	{
    		srand((unsigned)time(0));
    		food_1->x = rand() % 52 + 2;
    	}
    	food_1->y = rand() % 24 + 1;
    	q = head;
    	while (q != NULL)
    	{
    		if (q->x == food_1->y && q->y == food_1->y)
    		{
    			free(food_1);
    			createfood();
    			return;
    		}
    		q = q->next;
    	}
    	gotoxy(food_1->x, food_1->y);
    	food = food_1;
    	color(12);
    	printf("●");
    }
    
    //判断是否咬到自己
    bool bitself()
    {
    	snake* self;
    	self = head->next;
    	while (self != NULL)
    	{
    		if (head->x == self->x && head->y == self->y)
    			return true;
    		self = self->next;
    	}
    	return false;
    }
    
    //判断是否撞墙
    void cantcrosswall()
    {
    	if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)
    	{
    		endgamestatus = 1;
    		endgame();
    	}
    }
    
    //蛇加速
    void speedup()
    {
    	if (Sleeptime >= 50)
    	{
    		Sleeptime -= 10;
    		add += 2;
    	}
    }
    
    //蛇减速
    void speeddown()
    {
    	if (Sleeptime < 350)
    	{
    		Sleeptime += 30;
    		add -= 2;
    	}
    	if (Sleeptime == 350)
    		add = 1;
    }
    
    //控制方向
    void snakemove()
    {
    	snake* nexthead;
    	nexthead = (snake*)malloc(sizeof(snake));
    	cantcrosswall();
    	if (status == U)
    	{
    		nexthead->x = head->x;
    		nexthead->y = head->y - 1;
    		nexthead->next = head;
    		head = nexthead;
    		q = head;
    		if (head->x == food->x && head->y == food->y)
    		{
    			while (q != NULL)
    			{
    				gotoxy(q->x, q->y);
    				color(14);
    				printf("☆");
    				q = q->next;
    			}
    			score += add;
    			createfood();
    			speedup();
    		}
    		else 
    		{
    			while (q->next->next != NULL)
    			{
    				gotoxy(q->x, q->y);
    				color(14);
    				printf("☆");
    				q = q->next;
    			}
    			gotoxy(q->next->x, q->next->y);
    			color(3);
    			printf("■");
    			free(q->next);
    			q->next = NULL;
    		}
    	}
    	else if (status == D)
    	{
    		nexthead->x = head->x;
    		nexthead->y = head->y + 1;
    		nexthead->next = head;
    		head = nexthead;
    		q = head;
    		if (head->x == food->x && head->y == food->y)
    		{
    			while (q != NULL)
    			{
    				gotoxy(q->x, q->y);
    				color(14);
    				printf("☆");
    				q = q->next;
    			}
    			score += add;
    			createfood();
    			speedup();
    		}
    		else
    		{
    			while (q->next->next != NULL)
    			{
    				gotoxy(q->x, q->y);
    				color(14);
    				printf("☆");
    				q = q->next;
    			} 
    			gotoxy(q->next->x, q->next->y);
    			color(3);
    			printf("■");
    			free(q->next);
    			q->next = NULL;
    		}
    	}
    	else if (status == L)
    	{
    		nexthead->x = head->x - 2;
    		nexthead->y = head->y;
    		nexthead->next = head;
    		head = nexthead;
    		q = head;
    		if (nexthead->x == food->x && nexthead->y == food->y)
    		{
    			while (q != NULL)
    			{
    				gotoxy(q->x, q->y);
    				color(14);
    				printf("☆");
    				q = q->next;
    			}
    			score += add;
    			createfood();
    			speedup();
    		}
    		else
    		{
    			while (q->next->next != NULL)
    			{
    				gotoxy(q->x, q->y);
    				color(14);
    				printf("☆");
    				q = q->next;
    			} 
    			gotoxy(q->next->x, q->next->y);
    			color(3);
    			printf("■");
    			free(q->next);
    			q->next = NULL;
    		}
    	}
    	else if (status == R)
    	{
    		nexthead->x = head->x + 2;
    		nexthead->y = head->y;
    		nexthead->next = head;
    		head = nexthead;
    		q = head;
    		if (nexthead->x == food->x && nexthead->y == food->y)
    		{
    			while (q != NULL)
    			{
    				gotoxy(q->x, q->y);
    				color(14);
    				printf("☆");
    				q = q->next;
    			}
    			score += add;
    			createfood();
    			speedup();
    		}
    		else
    		{
    			do
    			{
    				gotoxy(q->x, q->y);
    				color(14);
    				printf("☆");
    				q = q->next;
    			} while (q->next->next != NULL);
    			gotoxy(q->next->x, q->next->y);
    			color(3);
    			printf("■");
    			free(q->next);
    			q->next = NULL;
    		}
    	}
    
    	if (bitself())
    	{
    		endgamestatus = 2;
    		endgame();
    	}
    }
    
    //用键盘控制蛇的走向
    void keyboardControl()
    {
    	status = R;
    	while (1)
    	{
    		score_and_tips();
    		if (GetAsyncKeyState(VK_UP) && status != D)
    		{
    			status = U;
    		}
    		else if (GetAsyncKeyState(VK_DOWN) && status != U)
    		{
    			status = D;
    		}
    		else if (GetAsyncKeyState(VK_LEFT) && status != R)
    		{
    			status = L;
    		}
    		else if (GetAsyncKeyState(VK_RIGHT) && status != L)
    		{
    			status = R;
    		}
    
    		if (GetAsyncKeyState(VK_SPACE))
    		{
    			system("pause");
    			if (GetAsyncKeyState(VK_SPACE))
    			{
    				continue;
    			}
    		}
    		else if (GetAsyncKeyState(VK_ESCAPE))
    		{
    			endgamestatus = 3;
    			endgame();
    			break;
    		}
    		else if (GetAsyncKeyState(VK_F1))
    		{
    			speedup();
    		}
    		else if (GetAsyncKeyState(VK_F2))
    		{
    			speeddown();
    		}
    		Sleep(Sleeptime);
    		snakemove();
    	}
    }
    
    //失败页面
    void Lostdraw()
    {
    	system("cls");
    	int i;
    	gotoxy(46, 2);
    	color(6);
    	printf("\\\\\\|///");
    	gotoxy(43, 3);
    	printf("\\\\");
    	color(15);
    	gotoxy(47, 3);
    	printf(".-.-");
    	color(6);
    	gotoxy(54, 3);
    	printf("//");
    	color(14);
    	gotoxy(44, 4);
    	printf("<");
    	color(15);
    	gotoxy(47, 4);
    	printf(".@.@");
    	color(14);
    	gotoxy(54, 4);
    	printf(">");
    	color(11);
    	gotoxy(17, 5);
    	printf("+-----------------");
    	color(14);
    	printf("o00o");
    	color(11);
    	printf("---------");
    	color(14);
    	printf("<_>");
    	color(11);
    	printf("---------");
    	color(14);
    	printf("o00o");
    	color(11);
    	printf("-----------------+");
    	gotoxy(17, 19);
    	color(11);
    	printf("+----------------------------");
    	color(14);
    	printf(" ☆☆☆ ");
    	color(11);
    	printf("----------------------------+");
    	
    	for (int i = 6; i < 19; i++)
    	{
    		gotoxy(17, i);
    		printf("|");
    		gotoxy(82, i);
    		printf("|");
    	}
    	gotoxy(30, 30);
    }
    
    //游戏结束界面
    void endgame()
    {
    	system("cls");
    	if (endgamestatus == 1)
    	{
    		Lostdraw();
    		color(12);
    		gotoxy(35, 9);
    		printf("对不起,您撞到了墙,游戏结束。");
    	}
    	else if (endgamestatus == 2)
    	{
    		Lostdraw();
    		color(12);
    		gotoxy(35, 9);
    		printf("对不起,您咬到了自己,游戏结束。");
    	}
    	else if (endgamestatus == 3)
    	{
    		Lostdraw();
    		color(12);
    		gotoxy(40, 9);
    		printf("您已结束了游戏。");
    	}
    
    	color(13);
    	gotoxy(43, 12);
    	printf("您的得分是:%d\n", score);
    
    	if (score >= HighScore)
    	{
    		color(10);
    		gotoxy(33, 16);
    		printf("创纪录啦!最高分被您刷新了,真棒!!!");
    		file_in();
    	}
    	else
    	{
    		color(10);
    		gotoxy(33, 16);
    		printf("继续努力吧!你离最高分还差%d分。",HighScore - score);
    	}
    	choose();
    }
    
    //将最高分存储进文件中
    void file_in()
    {
    	FILE* fp;
    	fopen_s(&fp, "save.txt", "w+");
    	fprintf(fp, "%d", score);
    	fclose(fp);
    }
    
    //边框下方的分支选项
    void choose()
    {
    	int n;
    	color(12);
    	gotoxy(25, 22);
    	printf("我要重新玩一局-----1");
    	gotoxy(52, 22);
    	printf("不玩了,退出吧-----2");
    
    	color(15);
    	gotoxy(46, 25);
    	printf("选择:");
    	scanf_s("%d", &n);
    	switch (n)
    	{
    	case 1:
    		system("cls");
    		score = 0;
    		Sleeptime = 200;
    		printsnake();
    		welcome_to_game();
    		break;
    	case 2:
    		exit(0);
    		break;
    	default:
    		color(12);
    		printf("※※您的输入有误,请重新输入。※※");
    		gotoxy(51, 25);
    		system("pause >nul");
    		endgame();
    		choose();
    		break;
    	}
    }
    
    //游戏说明界面
    void explation()
    {
    	int i, j = 1;
    	system("cls");
    	color(13);
    	gotoxy(44, 3);
    	printf("游戏说明");
    	color(2);
    	for (i = 20; i <= 75; ++i)
    	{
    		for (j = 6; j <= 22; ++j)
    		{
    			gotoxy(i, j);
    			if (j == 6 || j == 22)
    			{
    				printf("=");
    			}
    			if ((i == 20 || i == 74) && j != 6 && j != 22)
    			{
    				printf("||");
    			}
    		}
    	}
    	color(3);
    	gotoxy(30, 8);
    	printf("tip1:不能穿墙,不能咬到自己。");
    	color(10);
    	gotoxy(30, 11);
    	printf("tip2:用↑↓←→分别控制蛇的移动");
    	color(14);
    	gotoxy(30, 14);
    	printf("tip3:F1为加速,F2为减速。");
    	color(11);
    	gotoxy(30, 17);
    	printf("tip4:按space空格键暂停,再按空格键继续。");
    	color(4);
    	gotoxy(30, 20);
    	printf("ESC:退出游戏。Space:暂停游戏。");
    	_getch();
    	system("cls");
    	printsnake();
    	welcome_to_game();
    }
    
    

    运行效果:

    1.欢迎界面

    在这里插入图片描述

    2.游戏界面:

    在这里插入图片描述

    3.失败界面:

    在这里插入图片描述

    4.游戏说明界面:

    在这里插入图片描述

    展开全文
  • JavaScript实现贪吃蛇小游戏

    千次阅读 2020-07-04 15:44:05
    一、对贪吃蛇进行梳理 1.页面上的主要元素 地图 食物 属性:宽、高;背景颜色。 方法:显示食物;删除食物。 小蛇 属性:每截身体的宽、高;移动的方向;每截身体的x、y坐标和颜色。 方法:显示小蛇;小蛇的移动;...

    一、对贪吃蛇进行梳理

    1.页面上的主要元素

    1. 食物(food)
      属性:宽、高;背景颜色。
      方法:显示食物;删除食物。
    2. 小蛇(snake)
      属性:每截身体的宽、高;移动的方向;每截身体的x、y坐标和颜色。
      方法:显示小蛇;小蛇的移动;删除小蛇。
    3. 地图(map)

    因为小蛇和食物都是相对于地图显示的,所以小蛇和食物都是地图的子元素是随机位置显示的,所以食物和小蛇需要脱离文档流(设置样式position: absolute)地图也需要脱离文档流(设置样式position: relative)

    2.游戏逻辑

    1. 通过WASD || ↑←↓→控制蛇的移动方向;
    2. 吃食物,吃到一个食物小蛇的身体长度加1;
    3. 蛇撞到地图边界则游戏结束;
    4. 蛇吃到自己则游戏结束;
    5. 允许掉头、不允许后退;
    6. 要避免食物出现在蛇身所在位置。

    二、运行效果图

    在这里插入图片描述

    三、全部代码展示

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <title>js实现贪吃蛇小游戏</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            .title {
                text-align: center;
                margin-top: 20px;
            }
            .btn {
                width: 80px;
                height: 30px;
                border: 1px solid rgb(51, 50, 50);
                background-color: #eee;
                margin: 20px auto 0;
                display: block;
            }
            .map {
                width: 800px;
                height: 400px;
                background-color: #ccc;
                margin: 0 auto;
                position: relative;
            }
        </style>
    </head>
    
    <body>
        <h2 class="title">贪吃蛇小游戏</h2>
        <button id="btn" class="btn" type="button">开始游戏</button>
        <div id="map" class="map"></div>
    
        <script>
            var map = document.getElementById("map");
    
            // 存放food的数组,用来删除food
            var foodElements = [];
    
            function Food() {
                this.x = 0;
                this.y = 0;
                // Food的width、height和color属性并不需要修改,所以为了节省内存空间,采用原型对象的方式创建这三个属性
                Food.prototype.width = 20;
                Food.prototype.height = 20;
                Food.prototype.color = "green";
                // 动态原型模式创建对象。用来完成数据共享,节省内存空间
                /* 
                	判断this.init的类型是不是function
                	如果不是function则证明是第一次创建对象,则把这个funcion添加到原型中
                	如果是function,则代表原型中已经有了这个方法,则不需要再添加该方法。
                */
                // 初始化food
                if (typeof this.init != "function") {
                    Food.prototype.init = function () {
                        // 先删除之前的food
                        food.remove();
                        // 创建元素
                        var div = document.createElement("div");
                        // 设置food的样式
                        div.style.width = this.width + "px";
                        div.style.height = this.height + "px";
                        div.style.backgroundColor = this.color;
                        // 设置为相对定位
                        div.style.position = "absolute";
                        this.x = parseInt(Math.random() * (map.offsetWidth / this.width));
                        this.y = parseInt(Math.random() * (map.offsetHeight / this.height));
                        // 设置食物出现的位置不是当前小蛇身体所在位置
                        for (var i = 0; i < snake.body.length; i++) {
                            while (this.x == snake.body[i].x && this.y == snake.body[i].y) {
                                this.x = parseInt(Math.random() * (map.offsetWidth / this.width));
                                this.y = parseInt(Math.random() * (map.offsetHeight / this.height));
                                continue;
                            }
                        }
                        div.style.left = this.x * this.width + "px";
                        div.style.top = this.y * this.height + "px";
    
                        // 将食物添加到map和foodElements数组中
                        map.appendChild(div);
                        foodElements.push(div);
                    };
                }
    
                // 删除food
                if (typeof this.remove != "function") {
                    Food.prototype.remove = function () {
                        for (var i = 0; i < foodElements.length; i++) {
                            // 删除该元素
                            map.removeChild(foodElements[i]);
                            // 删除foodElements数组中的内容
                            foodElements.splice(i, 1);
                        }
                    };
                }
            };
    
            // 存放snake的数组,用来删除snake
            var snakeElements = [];
    
            function Snake() {
                this.direction = "right";
                this.body = [{
                        x: 3,
                        y: 2,
                        color: "red"
                    },
                    {
                        x: 2,
                        y: 2,
                        color: "orange"
                    },
                    {
                        x: 1,
                        y: 2,
                        color: "orange"
                    }
                ];
                // 使用原型对象的方式设置Snake的width和height
                Snake.prototype.width = 20;
                Snake.prototype.height = 20;
    
    			// 动态原型模式创建对象
                // 初始化snake
                if (!(this.init instanceof Function)) {	// 判断是否为function的另一种方式
                    Snake.prototype.init = function () {
                        this.remove();
                        for (var i = 0; i < this.body.length; i++) {
                            // 设置snake的样式
                            var obj = this.body[i];
                            var div = document.createElement("div");
                            map.appendChild(div);
                            div.style.width = this.width + "px";
                            div.style.height = this.height + "px";
                            div.style.position = "absolute";
                            div.style.backgroundColor = obj.color;
                            div.style.left = obj.x * this.width + "px";
                            div.style.top = obj.y * this.height + "px";
    
                            // 设置头部为圆角,可省略
                            while (i == 0) {
                                switch (this.direction) {
                                    case "right":
                                        div.style.borderTopRightRadius = "15px";
                                        div.style.borderBottomRightRadius = "15px";
                                        break;
                                    case "left":
                                        div.style.borderTopLeftRadius = "15px";
                                        div.style.borderBottomLeftRadius = "15px";
                                        break;
                                    case "top":
                                        div.style.borderTopRightRadius = "15px";
                                        div.style.borderTopLeftRadius = "15px";
                                        break;
                                    case "bottom":
                                        div.style.borderBottomRightRadius = "15px";
                                        div.style.borderBottomLeftRadius = "15px";
                                        break;
                                }
                                break;
                            }
    
                            // 将snake的每个节点添加到数组中,以便后期删除使用
                            snakeElements.push(div);
                        }
                    };
                }
    
                // 删除snake
                if (!(this.remove instanceof Function)) {
                    Snake.prototype.remove = function () {
                        for (var i = snakeElements.length - 1; i >= 0; i--) {
                            // 在map中移除snake这个子节点
                            map.removeChild(snakeElements[i]);
                            // 删除snakeElements数组中的内容
                            snakeElements.splice(i, 1);
                        }
                    };
                }
    
                // 移动snake
                if (!(this.move instanceof Function)) {
                    Snake.prototype.move = function () {
                        // 改变小蛇的身体的坐标位置
                        for (var i = this.body.length - 1; i > 0; i--) {
                            this.body[i].x = this.body[i - 1].x;
                            this.body[i].y = this.body[i - 1].y;
                        }
    
                        // 根据direction属性确定蛇头移动的方向并改变小蛇的头的坐标位置
                        switch (this.direction) {
                            case "right":
                                this.body[0].x += 1;
                                break;
                            case "left":
                                this.body[0].x -= 1;
                                break;
                            case "top":
                                this.body[0].y -= 1;
                                break;
                            case "bottom":
                                this.body[0].y += 1;
                                break;
                        }
    
                        // 如何让蛇看起来像是在移动:
                        // 在小蛇移动后,删除之前的蛇(删除方法在init()中调用了),然后重新显示蛇
                        this.init();
    
                        // 判断是否吃到食物,吃到则蛇身加一节,删除吃掉的食物,生成新的食物
                        // 蛇头的x、y与食物的x、y均相等则为吃到食物
                        if (this.body[0].x == food.x && this.body[0].y == food.y) {
                            var last = this.body[this.body.length - 1];
                            this.body.push({
                                x: last.x,
                                y: last.y,
                                color: last.color
                            });
                            // 删除吃掉的食物,生成新的食物
                            food.init();
                        }
    
                        // 判断是否撞墙,撞墙 即死
                        var maxX = map.offsetWidth / this.width; // map中最大的x值
                        var maxY = map.offsetHeight / this.height; // map中最大的y值
                        var headX = this.body[0].x; // 蛇头所在位置的x值
                        var headY = this.body[0].y; // 蛇头所在位置的y值
                        if (headX < 0 || headX > maxX - 1 || headY < 0 || headY > maxY - 1) {
                            // 清除定时器
                            clearInterval(timeId);
                            timeId = null; 	// 通过timeId = null保证以后每次能正常启动定时器
                            alert("对不起,您撞墙了,游戏结束!");
                            // 移除snake
                            this.remove();
                            // 还原Snake中direction和body的初始值,让蛇恢复原状
                            this.direction = "right";
                            this.body = [{
                                    x: 3,
                                    y: 2,
                                    color: "red"
                                },
                                {
                                    x: 2,
                                    y: 2,
                                    color: "orange"
                                },
                                {
                                    x: 1,
                                    y: 2,
                                    color: "orange"
                                }
                            ];
                            // 重新显示snake
                            this.init();
                            // 结束游戏
                            return false;
                        }
    
                        // 判断是否吃到自己,吃到自己 即死
                        // 因为蛇长为5时才能吃到自己,所以i从4开始
                        for (var i = 4; i < this.body.length; i++) {
                            // 如果头部的x、y与身体某一段的x、y相等则为吃到自己
                            if (this.body[0].x == this.body[i].x && this.body[0].y == this.body[i].y) {
                                // 清除定时器
                                clearInterval(timeId);
                                timeId = null;
                                alert("对不起,您把自己吃了,游戏结束!");
                                // 移除snake
                                this.remove();
                                // 还原Snake中direction和body的初始值,让蛇恢复原状
                                this.direction = "right";
                                this.body = [{
                                        x: 3,
                                        y: 2,
                                        color: "red"
                                    },
                                    {
                                        x: 2,
                                        y: 2,
                                        color: "orange"
                                    },
                                    {
                                        x: 1,
                                        y: 2,
                                        color: "orange"
                                    }
                                ];
                                // 重新显示snake
                                this.init();
                                // 结束游戏
                                return false;
                            }
                        }
                    };
                }
            };
    
            // 初始化food和snake
            var food = new Food();
            var snake = new Snake();
            // 显示food和snake
            food.init();
            snake.init();
    
            // 给页面添加键盘按下事件,
            document.onkeydown = function (e) {
                var eve = e || window.event; // 兼容低版本IE
                switch (eve.keyCode) {
                    case 37: // ←键的keyCode
                    case 65: // A键的keyCode
                        if (snake.direction != "right") { // 不允许后退的简单处理。不过有bug,手速够快的话还是会后退...
                            snake.direction = "left";
                        }
                        break;
                    case 38: // ↑键的keyCode
                    case 87: // W键的keyCode
                        if (snake.direction != "bottom") {
                            snake.direction = "top";
                        }
                        break;
                    case 39: // →键的keyCode
                    case 68: // D键的keyCode
                        if (snake.direction != "left") {
                            snake.direction = "right";
                        }
                        break;
                    case 40: // ↓键的keyCode为38
                    case 83: // S键的keyCode
                        if (snake.direction != "top") {
                            snake.direction = "bottom";
                        }
                        break;
                }
            };
    
            var btn = document.getElementById("btn");
            var timeId = null;
            // 给按钮注册点击事件,点击按钮开始游戏
            function begin() {
                // clearInterval(timeId); // 防止多次点击造成多次触发setInterval (方法1,有bug)
                // 上面方法存在bug:当连续多次快速点击时,程序就一直在清除定时器,在界面上给人的感觉就像卡住了一样...
                /*
                	修改方法如下:
                	1.将clearInterval(timeId);换成if(timeId != null) return;
                	2.在其余clearInterval(timeId); 后加一句timeId = null; 保证每次能正常启动定时器
                */
                if(timeId != null) return;	// 防止多次点击造成多次触发setInterval(方法2,改进版)
                timeId = setInterval("snake.move()", 200);
            };
            btn.onclick = begin;
        </script>
    </body>
    
    </html>
    

    附上在线HTML/CSS/JavaScript代码运行工具:HTML/CSS/Javascript在线代码运行工具
    谢谢您的查看,希望能对您有所帮助!

    展开全文
  • 前言: 刚学unity没多久吧(大概1个月多点),这是我自己做的除官网之外的第一个游戏demo,中间存在很多不足的地方,但是还是希望可以给需要的人提供一些思路和帮助,有问题的小伙伴可以找我一起探讨一起学习。...

    前言:

    刚学unity没多久吧(大概1个月多点),这是我自己做的除官网之外的第一个游戏demo,中间存在很多不足的地方,但是还是希望可以给需要的人提供一些思路和帮助,有问题的小伙伴可以找我一起探讨一起学习。游戏的资源和脚本都放在我的github上了,需要的小伙伴也可以去这里clone一份资源下来自己做一做这个游戏,有不会的地方可以参考一下我的脚本,附地址:

    https://github.com/li-zheng-hao/Snake-Demo


    游戏开始界面:

    首先游戏的开始界面仅仅涉及到一些UGUI的元素

    UI部分其实没什么太多的难点,主要是要做好屏幕的适配,需要注意的地方有:

    1、在Canvas画布的组件中需要将画布的渲染模式设置为Overlay,这样的话UI元素就会显示在所有游戏物体的前方,不会被遮挡。其次UI的放大缩小模式根据设计分辨率调整,这里我采用的设计分辨率是1334×750,优先按照宽度适配。

    2、各个UI元素的锚点根据需求设置到相应的位置,这样在设备分辨率发生改变的情况下,UI会进行拉伸和放缩,我们需要将UI的锚点设置到父类元素的相对位置,比如左上角的头像的锚点可以设置为UI画布的左上角,这样分辨率发生变化的时候,头像的相对位置也不会发生变化,不会出现在很奇怪的位置。

    3、这里的场景跳转我使用的是一个单例类SceneController脚本以及一个脚本ChangeScene来控制,下面是代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class SceneController : MonoBehaviour {
    
        private static SceneController _instance;
        public static SceneController Instance {
            get {
                if(_instance==null)
                    _instance = FindObjectOfType<SceneController>();
                if(_instance==null)
                {
                    GameObject gm = new GameObject("SceneController");
                    _instance = gm.AddComponent<SceneController>();
                }
                return _instance;
            }
        }
        public virtual void Awake()
        {
            //如果实例化的对象不是当前的这个对象,则把当前这个对象附加在的gameobject销毁
            if (Instance!=this)
            {
                Destroy(gameObject);
                return;
            }
            //如果实例化的对象是当前这个对象,则在加载的时候不销毁
            DontDestroyOnLoad(gameObject);
        }
        public void changeScene(string sceneName)
        {
            SceneManager.LoadScene(sceneName);
        }
        
    }
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class ChangeScene : MonoBehaviour {
    
        public void ChangeSceneByName(string sceneName)
        {
            SceneController.Instance.changeScene(sceneName);
        }
    }
    

    在写完脚本将它挂载之后,只需要在相应的跳转的按钮上加上相应的onclick事件即可。

    好了,开始界面的一些难点就是这些了。


    第二章节:https://blog.csdn.net/m0_37316917/article/details/81285524

    展开全文
  • 贪吃蛇大作战demo实现和代码

    热门讨论 2020-07-28 14:34:42
    基于cocos2dx 和c++实现的类似贪吃蛇大作战的游戏demo
  • 贪吃蛇大作战

    2017-09-18 14:19:47
    功能 y 企业版 会员 冒泡 博客 帮助 ...项目logoliganghui/ife-17 收藏 2 关注 0 Fork 0 存放参加ife-17的代码 ...代码 分支 标签 版本对比 Pull Request 项目网络 项目统计 讨论 master 寻找文件 提交历史 ife-
  • 贪吃蛇总结: 1. 创建WPF应用程序   2. 添加Canvas标签。Name=back;   3. 添加loaded事件   4. 在loaded事件中创建蛇(设置蛇的位置,大小,颜色)  this.Left = 0;  this.Top = 0;  this.Width = 800; ...
  • 无尽の悲伤

    万次阅读 2009-05-23 00:28:00
    每一次当我打开落地窗 仰望天空的时候我就在想 天空是有颜色的 它的颜色会随着心情的改变而变化 高兴的时候是白色的 万里无云 一片清明 悲伤的时候是深蓝的 像一眼望不到边的海 很久很久以前 想要写一篇文章 没有想...
  • 贪吃蛇大作战 源码

    2020-07-18 19:42:34
    贪吃蛇大作战单机版源码,有AI的实现,win32开发,android打包!
  • 贪吃蛇大作战JavaFx版完整源码

    千次阅读 多人点赞 2018-03-25 21:11:33
    贪吃蛇大作战 Java版项目源码:https://github.com/silence1772/JavaFX-GreedySnake(记得点star啊,收藏一个项目最好的方式是star而不是fork)游戏下载:贪吃蛇大作战.exe 贪吃蛇大作战.jar游戏截图:几句话:这个...
  • 贪吃蛇大作战的开发(一)

    千次阅读 2019-05-21 23:42:23
    主要由三部分,客户端、游戏服务端、游戏机器人,这里客户端采用的是cocos2d-x 3.17,客户端的业务逻辑我统一用lua编写,原因是脚本语言可以动态解释,游戏的话就采用前几年比较流行的一款游戏,贪吃蛇大作战。...
  • unity贪吃蛇大作战源码,游戏资源齐全,仅供学学使用。
  • 1.关于蛇的移动 每条蛇都有一个移动速度和旋转速度,为什么,因为如果不设置旋转速度的话,如果蛇要转弯,头就会一下子朝向另外一边,所以设置旋转速度来让蛇的运动更加平滑。 2.... 地图比较简单,只需要设置一定...
  • 贪吃蛇大作战类游戏的实现

    万次阅读 2016-11-23 23:51:26
    前段时间玩了一个叫做贪吃蛇大作战的手机游戏,一下子就喜欢上了,然后就有了尝试实现的想法。
  • python实现贪吃蛇大作战
  • 贪吃蛇大作战面向对象的编程思想: 地图: 宽,高,背景颜色,因为小蛇和食物都是相对于地图显示的,这里小蛇和食物都是地图的子元素,随机位置显示,脱离文档流的,地图也需要脱离文档流–css需要设置:宽,高,背景颜色,脱...
  • 贪吃蛇大作战python源代码 自己做的单人吃水果的小游戏只做了雏形不过还是可以玩玩的。
  • 首先我们的游戏场景上包括了一个的背景图片,之外再包围一个红色的区域。中间的区域才是可活动的区域,周围通过碰撞检测盒来检测是否有蛇撞到了墙壁。 2、食物生成 食物生成通过一个单例脚本来实现,创建一个...
  • cocos creator开发微信小游戏(五)贪吃蛇大作战

    千次阅读 热门讨论 2020-06-18 09:59:56
    贪吃蛇小游戏:贪吃蛇试玩(首次加载比较慢),类似贪吃蛇大作战的小游戏。当玩家的蛇头碰到另一条蛇蛇身时死亡,游戏结束。 小游戏cocos creator场景图 小游戏的cocos creator节点结构如下图,Canvas上面的节点是...
1 2 3 4 5 ... 20
收藏数 431
精华内容 172
热门标签
关键字:

贪吃蛇大作战