项目1:C语言实现贪吃蛇小游戏

实现这个小游戏我们可以分为以下几步:

1.把蛇要走的地图打印出来;

2.把蛇和食物打印出来;

3.让蛇动起来,控制方向;

4.判断蛇目前所处状态。

//.C文件

#include"Snack.h"
void SetPos(int x,int y)
{
    COORD pos = {0};
    HANDLE handle = NULL;
    handle = GetStdHandle(STD_OUTPUT_HANDLE);
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}

void WelcomeToGame()
{
    system("mode con cols=100 lines=30");
    SetPos(35,14);
    printf("欢迎来到贪吃蛇小游戏\n");
    system("pause");
    system("cls");
    SetPos(30,14);
    printf("用↑、↓、←、→来控制蛇的移动,F1为加速,F2为减速\n");
    system("pause");
    system("cls");
    SetPos(40,14);
    printf("加速分数更高\n");
    system("pause");
    system("cls");
}
pSnakeNode BuyNode()
{
    pSnakeNode pRet = (pSnakeNode)malloc(sizeof(SnakeNode));
    if(pRet == NULL)
    {
        exit(-1);
    }
    pRet->x = 0;
    pRet->y = 0;
    pRet->next = NULL;
    return pRet;
}
void InitSnake(pSnake ps)
{
    int i = 1;
    pSnakeNode first = BuyNode();
    pSnakeNode cur;
    first->x = INIT_X;
    first->y = INIT_Y;
    for(i = 1;i <= 4;i++)
    {
        cur = BuyNode();
        cur->x = first->x+2;
        cur->y = first->y;
        cur->next = first;
        first = cur;
    }
    while(cur)
    {
        SetPos(cur->x,cur->y);
        printf(FOOD);
        cur = cur->next;
    }
    ps->_pSnake = first;
}
void CreateMap()
{
    int i = 0;
    for(i = 0;i <= 58;i+=2)
    {
        SetPos(i,0);
        printf(WALL);
    }
    for(i = 0;i <= 58;i+=2)
    {
        SetPos(i,27);
        printf(WALL);
    }
    for(i = 1;i <= 26;i++)
    {
        SetPos(0,i);
        printf(WALL);
    }
    for(i = 1;i <= 26;i++)
    {
        SetPos(58,i);
        printf(WALL);
    }
}
void CreateFood(pSnake ps)
{
    pSnakeNode pFood = BuyNode();
    pSnakeNode cur = ps->_pSnake;
    pFood->y = rand()%26 + 1;
    do
    {
        pFood->x = rand() % 55 + 2;
    }while(pFood->x % 2 !=  0);
    while(cur)
    {
        if(cur->x == pFood->x && cur->y == pFood->y)
        {
            CreateFood(ps);
            return;
        }
        cur = cur->next;
    }
    ps->_pFood = pFood;
    SetPos(pFood->x,pFood->y);
    printf(FOOD);
}

void GameStart(pSnake ps)
{
    //打印游戏界面1
    WelcomeToGame();
    //创建地图
    CreateMap();
    //初始化蛇
    InitSnake(ps);
    //初始化食物
    CreateFood(ps);
    
    ps->_AddScore = 10;
    ps->_TotalScore = 0;
    ps->_Dir = RIGHT;
    ps->_SleepTime = 200;
    ps->_Status = OK;   
}
void Pause()
{
    while(1)
    {
        Sleep(100);
        if(GetAsyncKeyState(VK_SPACE))
        {
            break;
        }
    }
}
int NextHasFood(pSnakeNode pn,pSnakeNode pf)
{
    return ((pn->x == pf->x) && (pf->y == pn->y));
}
void EatFood(pSnake ps,pSnakeNode pn)
{
    pn->next = ps->_pSnake;
    ps->_pSnake = pn;
    SetPos(ps->_pSnake->x,ps->_pSnake->y);
    printf(FOOD);
    ps->_TotalScore += ps->_AddScore; 
    CreateFood(ps);
}
void NotFood(pSnake ps,pSnakeNode pn)
 {
    pSnakeNode cur = NULL;
    pn->next = ps->_pSnake;
    ps->_pSnake = pn;
     SetPos(ps->_pSnake->x,ps->_pSnake->y);
    printf(FOOD);
    cur = ps->_pSnake;
    while(cur->next->next)
    {
        cur = cur->next;
    }
    SetPos(cur->next->x,cur->next->y);
    printf(" ");
    free(cur->next);
    cur->next = NULL;
}
void SnakeMove(pSnake ps)
{
    pSnakeNode pNextNode = BuyNode();
    switch(ps->_Dir)
    {
    case UP:
        {
            pNextNode->x = ps->_pSnake->x;
            pNextNode->y = ps->_pSnake->y-1;
            if(NextHasFood(pNextNode,ps->_pFood))
            {
                //下一个结点是食物
                EatFood(ps,pNextNode);
            }
            else
            {
                NotFood(ps,pNextNode);
            }
        }break;
    case DOWN:
        {
            pNextNode->x = ps->_pSnake->x;
            pNextNode->y = ps->_pSnake->y+1;
            if(NextHasFood(pNextNode,ps->_pFood))
            { 
                //下一个结点是食物
                EatFood(ps,pNextNode);
            }
            else
            {
                NotFood(ps,pNextNode);
            }
        }break;
    case LEFT:
        {
            pNextNode->x = ps->_pSnake->x-2;
            pNextNode->y = ps->_pSnake->y;
            if(NextHasFood(pNextNode,ps->_pFood))
            {
                //下一个结点是食物
                EatFood(ps,pNextNode);
            }
            else
            {
                NotFood(ps,pNextNode);
            }
        }break;
    case RIGHT:
        {
            pNextNode->x = ps->_pSnake->x+2;
            pNextNode->y = ps->_pSnake->y;
            if(NextHasFood(pNextNode,ps->_pFood))
            {
                //下一个结点是食物
                EatFood(ps,pNextNode);
            }
            else
            {
                NotFood(ps,pNextNode);
            }
        }break;
    }
}
void KillByWall(pSnake ps)
{
    if((0 == ps->_pSnake->x) || (ps->_pSnake->x == 58) || (ps->_pSnake->y == 0) || (ps->_pSnake->y == 27))
    {
        ps->_Status = KILL_BY_WALL;
    }
}
void KillBySelf(pSnake ps)
{
    pSnakeNode pnext = ps->_pSnake->next;
    while(pnext)
    {
        if((pnext->x == ps->_pSnake->x) && (pnext->y == ps->_pSnake->y))
        {
            ps->_Status = KILL_BY_SELF;
            return;
        }
        pnext = pnext->next;
    }
}
void PrintHelpInfo(pSnake ps)
{
    SetPos(62,12);
    printf("用↑、↓、←、→来控制蛇的移动");
    SetPos(70,13);
    printf("F1为加速,F2为减速");
    SetPos(70,14);
    printf("按ESC退出游戏");
    SetPos(65,8);
    printf("总分:%d",ps->_TotalScore);
    SetPos(65,9);
    printf("每个食物的分数:%d",ps->_AddScore);
    printf("   ");
}
void GameRun(pSnake ps)
{
    do
    {
        PrintHelpInfo(ps);
        //确定方向
        if((GetAsyncKeyState(VK_UP)) && (ps->_Dir != DOWN))
        {
            ps->_Dir = UP;
        }
        else if((GetAsyncKeyState(VK_DOWN)) && (ps->_Dir != UP))
        {
            ps->_Dir = DOWN;
        }
        else if((GetAsyncKeyState(VK_LEFT)) && (ps->_Dir != RIGHT))
        {
            ps->_Dir = LEFT;
        }
        else if((GetAsyncKeyState(VK_RIGHT)) && (ps->_Dir != LEFT))
        {
            ps->_Dir = RIGHT;
        }

        else if(GetAsyncKeyState(VK_SPACE))
        {
            //暂停
            Pause();
        }
        else if(GetAsyncKeyState(VK_ESCAPE))
        {
            //结束
            ps->_Status = NORMAL_END;
            break;
        }
        else if(GetAsyncKeyState(VK_F1))
        {
            //加速
            if(ps->_SleepTime >= 40)  
            {
                ps->_SleepTime -= 20;
                ps->_AddScore += 2;
            }
        }
        else if(GetAsyncKeyState(VK_F2))
        {
            //减速
            
            if(ps->_SleepTime <= 300)
            {
                ps->_SleepTime += 30;
                ps->_AddScore -= 2;
            } 
                if(ps->_SleepTime >= 300)   
            {
                ps->_AddScore = 2;
            }
        }
        Sleep(ps->_SleepTime);
        SnakeMove(ps);
        KillByWall(ps);
        KillBySelf(ps);
    }while(ps->_Status == OK);
}
void GameEnd(pSnake ps)
{
    pSnakeNode cur = ps->_pSnake; 
    SetPos(25,14);
    if(ps->_Status == NORMAL_END)
    {
        printf("正常结束游戏\n");
    }
    else if(ps->_Status == KILL_BY_WALL)
    {
        printf("撞墙死掉\n");
    }
    else if(ps->_Status == KILL_BY_SELF)
    {
        printf("撞上自己死掉\n");
    }

    while(cur)
    {
        pSnakeNode del = cur;
        cur = cur->next;
        free(del);
        del = NULL;
    }
    ps->_pSnake = NULL;
    ps->_pFood = NULL;
    
}

//.h头文件

#ifndef __SNAKE_H__
#define __SNAKE_H__
#include<Windows.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>
#define WALL "★"
#define FOOD "■"
#define INIT_X 20
#define INIT_Y 10
typedef struct SnakeNode
{
    int x;
    int y;
    struct SnakeNode* next;
}SnakeNode,*pSnakeNode;

enum Direction
{
    UP = 1,
    DOWN,
    LEFT,
    RIGHT
};
enum GameStatus
{
    OK,
    NORMAL_END,
    KILL_BY_WALL,
    KILL_BY_SELF
};
typedef struct Snake
{
    pSnakeNode _pSnake;//维护蛇身的指针
    pSnakeNode _pFood;
    int _TotalScore;
    int _AddScore;
    int _SleepTime;//休眠时间
    enum Direction _Dir;
    enum GameStatus _Status;
}Snake,*pSnake;


pSnakeNode BuyNode();
void CreateFood(pSnake ps);
void GameRun(pSnake ps);
void WelcomeToGame();
void CreateMap();
void GameStart(pSnake ps);
void InitSnake(pSnake ps);
void Pause();
int NextHasFood(pSnakeNode pn,pSnakeNode pf);
void SnakeMove(pSnake ps);
void GameRun(pSnake ps);
void EatFood(pSnake ps,pSnakeNode pn);
void NotFood(pSnake ps,pSnakeNode pn);
void KillByWall(pSnake ps);
void KillBySelf(pSnake ps);
void PrintHelpInfo();
void GameEnd(pSnake ps);
#endif //__SNACK_H__


//.C测试文件

#include"Snack.h"


void test()
{
    Snake snake = {0};//创建贪吃蛇
    srand ((unsigned int)time(NULL));
    GameStart(&snake);
    GameRun(&snake);
    GameEnd(&snake);
    system("pause");
}
int main()
{
    test();
    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/R_T_P_A_D/article/details/83478096