小游戏,贪食蛇

#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;  

你可能感兴趣的:(小游戏,贪食蛇)