zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    微软外服 AlI In One
    js 循环多次和循环一次的时间的性能对比 All In One
    vue inject All In One
    Excel 表格数据倒置 All In One
    SVG tickets All In One
    OH MY ZSH All In One
    js array for loop performance compare All In One
    mac terminal show You have new mail All In one
    新闻视频 26 制作母版页
    转自牛腩 母版页和相对路径
  • 原文地址:https://www.cnblogs.com/zhaoyu1995/p/5299487.html
Copyright © 2011-2022 走看看