C_贪吃蛇

#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<time.h>

struct COOR
{
        int x;
        int y;
};

struct SNAKE
{
        int length;//蛇长
        COOR body[500];//蛇的身体
        char dir;//蛇的方向 上72 左75 右77 下80
};

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出句柄
int food_x, food_y;//食物坐标
int score = 0;
int interval = 250;
int level = 1;
int count = 0;
char KEY = 77;
int eat = 0;
int gameover = 0;
SNAKE snake = {3, {6, 0}, 77};

void InitConsole()
{
        srand((long)time(NULL));
        system ("mode con: cols=60 lines=30");//可以在命令提示符中输入mode /?查询此用法
        system ("title 贪吃蛇");
        SetConsoleTextAttribute(hConsole, 0xe);
}

void gotoxy(int x, int y)//设置光标坐标
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition (hConsole, coord);
}

void Print()
{
        gotoxy(0, 28);
        printf("Score:%d\t\tLevel:%d",score, level) ;
}

void SetLevel()//设置游戏难度 
{
    if (count == 10)
        {
                count = 0;
                level++;
                interval -= 50;
        }
        Print();
} 

void Wall()//初始化边界
{
        int x, y;
        
        for (x = 0; x <= 58; x+= 2)
        {
                gotoxy(x, 0);
                printf("■");
                gotoxy(x, 26);
                printf("■");
        }

        for (y = 0; y <= 26; y++)
        {
                gotoxy(0, y);
                printf("■");
                gotoxy(58, y);
                printf("■");
        }
}

void InitFood()
{
        eat = 0;
        while (1)
        {
                food_x = (rand() % 28 + 1) * 2;
        food_y = rand() % 24 +1;
                int i;
                for (i = 0; i < snake.length; i++)
                {
                        if (food_x == snake.body[i].x && food_y == snake.body[i].y)
                                break;
                }
                if (i == snake.length)
                        break;
        }
        gotoxy(food_x, food_y);
        printf("●");
        SetLevel();
}

void InitSnake()
{
        for (int i = 0; i <= snake.length; i++)
        {
                snake.body[i].x = 6 - i * 2;
                snake.body[i].y = 1;
                gotoxy(snake.body[i].x, snake.body[i].y);
                printf("■");
        }
}

int InSnake(int x, int y)//判断蛇是否吃到自己
{
        int flag = 0;
        for (int i = 1; i < snake.length; i++)
        {
                if (x == snake.body[i].x && y == snake.body[i].y)
                {
                        flag = 1;
                        break;
                }
        }
        return flag;
}

int Over()//判断游戏是否结束
{
        int x = snake.body[0].x;
        int y = snake.body[0].y;
        if (InSnake (x, y) || x == 0 || x == 60 || y == 0 || y == 27)
                return 1;
        else
                return 0;
}

void MoveSnake(char key)
{
        int snake_x = snake.body[0].x;
        int snake_y = snake.body[0].y;

        switch (key)
        {
        case 72:
                snake_y--;
                break;
        case 75:
                snake_x -= 2;
                break;
        case 77:
                snake_x += 2;
                break;
        case 80:
                snake_y++;
                break;
        default:
                break;
        }

        if (Over())
        {
                gameover = 1;
        }
        else
        {
                if (snake_x == food_x && snake_y == food_y)
                {
                        score += 100;
                    ++snake.length;
                        count++;
                    eat = 1; 
                }
                else
                {
                        gotoxy (snake.body[snake.length - 1].x, snake.body[snake.length - 1].y);
                    printf("  ");
                }

            gotoxy (snake_x, snake_y);
            printf("■");

                for (int i = snake.length - 1; i > 0; i--)
                {
                        snake.body[i] = snake.body[i - 1];
                }

                snake.body[0].x = snake_x;
                snake.body[0].y = snake_y;
                KEY = key;
        }
}

void Play()//游戏控制
{
        char key1 = 0, key2 = 0;
        while (key1 != 27 && (!gameover))
        {
                Sleep(interval);
                if ( kbhit() )//如果有按键按下,kbhit返回1,否则返回0
                {
                        key1 = getch();//接收键码
                        if (key1 <= 0)
                                key2 = getch();//继续接收键码
                        if (key2 == 72 || key2 == 75 || key2 == 77 || key2 == 80)//说明是方向键 
                        {
                                if (key2 != KEY && key2 + KEY != 152)//说明是使蛇转向的方向键
                                        MoveSnake(key2);
                                else
                                        MoveSnake(KEY);
                        }
                        else
                                MoveSnake(KEY);
                }
                else
                        MoveSnake(KEY);
                if (eat == 1)
                        InitFood();
        }
}

int main(void)
{
        InitConsole();
        Wall();
        InitFood();
        InitSnake();

        Play();
        
        return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值