• C语言实现贪吃蛇源码


    先放效果

    源代码

    //2016-2-12
    //zhaoyu
    //Gmail:zhaoyu1995.com@gmail.com
    //Language: C
    //Platform:Code::Blocks
    #include <stdio.h>
    #include <windows.h>
    #include <stdlib.h>
    #include <time.h>
    
    typedef struct snake
    {
        int x;
        int y;
        struct snake *next;
    }Snake;
    int X, Y;
    enum STATUS{Up = 1, Down, Left, Right};
    
    Snake *pHead, *pBody;//the head of the snake
    
    enum STATUS Direction;
    int score=0, scorePerFood=10;
    int gameStatus = 0;
    int timeInterval = 200;
    void gameEnd(void);
    void setPosition(int x, int y)
    {
        COORD pos;
        HANDLE hOutput;
        pos.X = x;
        pos.Y = y;
        hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleCursorPosition(hOutput, pos);
    }
    void hideCursor()
    {
    	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
    }
    void creatInterface(void)
    {
        int i;
        for(i=0;i<58;i+=2)
        {
            setPosition(i,0);
            printf("¡ö");//a ¡ö occupy two character space
            setPosition(i,26);
            printf("¡ö");
        }
        for(i=1;i<26;i++)
        {
            setPosition(0,i);
            printf("¡ö");
            setPosition(56,i);
            printf("¡ö");
        }
        setPosition(65, 10);
        printf("Introduction");
        setPosition(63,12);
        printf("¡ü	Move up.");
        setPosition(63,14);
        printf("¡ý	Move Down.");
        setPosition(63,16);
        printf("¡û	Move left.");
        setPosition(63,18);
        printf("¡ú	Move right.");
        setPosition(63,20);
        printf("F1	Speed up.");
        setPosition(63, 22);
        printf("F2	Slow down.");
        setPosition(63, 24);
        printf("Space	Game pause.");
        setPosition(63,26);
        printf("ESC	Quit the game.");
        setPosition(63, 4);
        printf("Score:");
        setPosition(63, 6);
        printf("Score Per Food:");
    }
    void initializeSnake(void)
    {
        Snake *pTail;
        int i;
        pTail = (Snake *)malloc(sizeof(Snake));
        pTail->x = 24;
        pTail->y = 5;
        pTail->next = NULL;
        for (i = 1; i < 4; i++)
        {
            pHead = (Snake *)malloc(sizeof(Snake));
            pHead->next = pTail;
            pHead->x = 24 + 2*i;
            pHead->y = 5;
            pTail = pHead;//Important
        }
        while (pTail != NULL)
        {
            setPosition(pTail->x, pTail->y);
            printf("¡ö");
            pTail = pTail->next;
        }
    }
    int biteSelf(void)
    {
        Snake *pSelf = pHead->next;
        while (pSelf != NULL)
        {
            if (pHead->x==pSelf->x && pHead->y==pSelf->y)
            {
                return 1;
            }
            pSelf = pSelf->next;
        }
        return 0;
    }
    void creatFood(void)
    {
        int flag = 0;
        X = Y = 4;
        srand((unsigned)time(NULL));
        do{
            X = rand()%52 + 2;
            Y = rand()%24 + 1;
    
            if (X%2 != 0)
            {
                flag = 1;
            }
            else
            {
                flag = 0;
            }//Important
            pBody = pHead;
            while (pBody->next != NULL)
            {
                if(pBody->x==X && pBody->y==Y)
                {
                    flag = 1;
                }
                pBody = pBody->next;
            }
        }while(flag==1);
        setPosition(X, Y);
        printf("¡ö");
    }
    
    void hitWall(void)
    {
        if (pHead->x==0 || pHead->x>=56 || pHead->y==0 || pHead->y>=26)
        {
            gameStatus = 1;
            gameEnd();
        }
    }
    void snakeMove(void)
    {
        Snake *pNextHead;
        hitWall();
    
        pNextHead = (Snake *)malloc(sizeof(Snake));
        pNextHead->next = pHead;
        switch(Direction)
        {
        case Up:
            pNextHead->x = pHead->x;
            pNextHead->y = pHead->y - 1;
            break;
        case Down:
            pNextHead->x = pHead->x;
            pNextHead->y = pHead->y + 1;
            break;
        case Right:
            pNextHead->x = pHead->x + 2;
            pNextHead->y = pHead->y;
            break;
        case Left:
            pNextHead->x = pHead->x - 2;
            pNextHead->y = pHead->y;
            break;
        default:
            break;
        }
        pHead = pNextHead;
        pBody = pHead;
        if (pNextHead->x == X && pNextHead->y == Y)
        {
            while (pBody != NULL)
            {
                setPosition(pBody->x, pBody->y);
                printf("¡ö");
                pBody = pBody->next;
            }
            score += scorePerFood;
            creatFood();
        }
        else
        {
            setPosition(pBody->x, pBody->y);
            printf("¡ö");
            while (pBody->next->next != NULL)
            {
                pBody = pBody->next;
            }
            setPosition(pBody->next->x, pBody->next->y);
            printf("  ");
            free(pBody->next);
            pBody->next = NULL;
        }
        if (biteSelf() == 1)
        {
            gameStatus = 2;
            gameEnd();
        }
    }
    void pause(void)
    {
        while(1)
        {
            Sleep(300);
            if(GetAsyncKeyState(VK_SPACE))
            {
                break;
            }
        }
    }
    void gameCircle(void)
    {
        Direction = Right;
        while (1)
        {
            setPosition(72, 4);
            printf("%d", score);
            setPosition(80, 6);
            printf("%d ", scorePerFood);//Attention space is needed
            if (GetAsyncKeyState(VK_UP) && Direction!=Down)
            {
                Direction = Up;
            }
            else if (GetAsyncKeyState(VK_DOWN) && Direction!=Up)
            {
                Direction = Down;
            }
            else if (GetAsyncKeyState(VK_LEFT) && Direction!=Right)
            {
                Direction = Left;
            }
            else if (GetAsyncKeyState(VK_RIGHT) && Direction!=Left)
            {
                Direction = Right;
            }
            else if (GetAsyncKeyState(VK_SPACE))
            {
                pause();
            }
            else if (GetAsyncKeyState(VK_ESCAPE))
            {
                gameStatus = 3;
                break;
            }
            else if (GetAsyncKeyState(VK_F1))
            {
                if(timeInterval >= 70)
                {
                    timeInterval -= 60;
                }
            }
            else if (GetAsyncKeyState(VK_F2))
            {
                if (timeInterval <= 400)
                {
                    timeInterval += 60;
                }
    
            }
            switch (timeInterval)
            {
                case 20: scorePerFood = 20;break;
                case 80: scorePerFood = 15;break;
                case 140: scorePerFood = 12;break;
                case 200: scorePerFood = 10;break;
                case 260: scorePerFood = 8;break;
                case 320: scorePerFood = 6;break;
                case 380: scorePerFood = 4;break;
                case 440: scorePerFood = 2;break;
                default: scorePerFood = 0;break;
            }
            Sleep(timeInterval);
            snakeMove();
        }
    }
    void welcomePage(void)
    {
        setPosition(35,2);
    	printf("Welcome to Snake");
    	setPosition(15, 5);
    	printf("Rules:");
    	setPosition(15, 7);
    	printf("1.  Use ¡ü.¡ý.¡û.¡ú to control the movement of the Snake.");
    	setPosition(15, 9);
    	printf("2.  Biting the snake itself is forbidden.");
    	setPosition(15, 11);
    	printf("3.  Hit the wall is forbidden.");
    	setPosition(15, 13);
    	printf("Developeder:  zhaoyu.");
        setPosition(15, 15);
        printf("Blog:  http://blog.csdn.net/sinat_30046339");
        setPosition(28, 23);
        printf("Press any key to continue...");
    	setPosition(0, 28);
    	getchar();
    	system("cls");
    }
    void gameEnd(void)
    {
        system("cls");
        setPosition(32, 10);
        switch(gameStatus)
        {
        case 1:
            printf("You hit the wall!");
            break;
        case 2:
            printf("You bit yourself!");
            break;
        case 3:
            printf("You chose to end the game.");
            break;
        default:
            break;
        }
        setPosition(32, 14);
        printf("Your final score is   %d", score);
        getchar();
        setPosition(0, 25);
        exit(0);
    }
    void gameStart(void)
    {
    	system("mode con cols=100 lines=30");//no space around equal sign
    	welcomePage();
    	creatInterface();
    	initializeSnake();
    	creatFood();
    }
    
    
    
    //Main Function
    int main(void)
    {
        hideCursor();
    	gameStart();
    	gameCircle();
    	gameEnd();
    	return 0;
    }
    

      

  • 相关阅读:
    记忆点
    数组的操作
    console.log()中的运算与打印事件
    ie9上传后下载json
    mysql使用on duplicate key update批量更新数据
    vue 弹出菜单
    mysql备份脚本
    uniapp+nodejs微信支付小程序版
    mycat初体验
    vscode格式化html标签属性不换行(vetur插件)
  • 原文地址:https://www.cnblogs.com/zhaoyu1995/p/5299487.html
Copyright © 2020-2023  润新知