注册会员 
  
 
- 威望
 - 65 
 
- 贡献
 - 90 
 
- 热心值
 - 0 
 
- 金币
 - 10 
 
- 注册时间
 - 2021-4-24
 
 
 
 
 | 
#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#include <windows.h> 
#include <conio.h> 
#define WIDE  60 
#define HIGH  20 
//1 设置地图范围(边界) 宽 高 
//2 初始化蛇  初始化食物 
//3 将蛇和食物显示在屏幕上 
//4 蛇的移动(通过wasd按键控制蛇的移动方向) 
/* 
        a> 蛇碰到墙 
        b> 蛇碰到蛇的身体 
        c> 蛇碰到障碍物 
        d> 蛇碰到食物( 蛇的身体增长一节,原食物消失,生成新的食物,增加分数) 
 
*/ 
//5 蛇的死亡 积分 
 
typedef struct _body 
{ 
        int x; 
        int y; 
 
}BODY; 
typedef struct snake 
{ 
        BODY list[WIDE*HIGH];//身体.身体的每一节坐标都是BODY类型 
        int size;//蛇的身体大小 
        BODY food;//食物的坐标 
        COORD coord;//光标的位置信息 
        int dx;//蛇x轴移动的方向 
        int dy;//蛇y轴移动的方向 
        int score;//得分 
        BODY tail; 
}SNAKE; 
 
void init_ui() 
{ 
        for (int i = 0; i <HIGH;i++ ) 
        { 
 
                for (int j = 0; j < WIDE; j++) 
                { 
                        printf("#"); 
                 
                } 
                printf("\n"); 
         
        } 
 
} 
void init_food(SNAKE  *snake) 
{ 
        srand(time(NULL));//设置随机数种子 
        //初始化食物坐标 
        snake->food.x =  rand() % WIDE; 
        snake->food.y = rand() % HIGH; 
} 
void init_snake(SNAKE  *snake) 
{ 
        //初始化蛇头坐标 
        snake->list[0].x = WIDE / 2; 
        snake->list[0].y = HIGH / 2; 
        //初始化蛇尾坐标 
        snake->list[1].x = WIDE / 2-1; 
        snake->list[1].y = HIGH / 2; 
        //初始化蛇的身体大小 
        snake->size = 2; 
        //初始化食物的坐标 
        init_food(snake); 
        //初始化蛇的移动方向 
        snake->dx = 1; 
        snake->dy = 0; 
        //初始化分数 
        snake->score = 0; 
 
} 
void show_ui(SNAKE  *snake) 
{ 
        //显示蛇 注意: 每次显示蛇或食物,都要设置显示的位置,(光标的位置) 
        for (int i = 0; i < snake->size; i++) 
        { 
                snake->coord.X = snake->list[i].x; 
                snake->coord.Y = snake->list[i].y; 
                SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord); 
                if (0 == i) 
                { 
                        printf("@"); 
                } 
                else 
                { 
                        printf("*"); 
                } 
         
        } 
        //显示食物 
        snake->coord.X = snake->food.x; 
        snake->coord.Y = snake->food.y; 
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord); 
        printf("#"); 
        //将原来尾巴的位置显示为空格 
        snake->coord.X = snake->tail.x; 
        snake->coord.Y = snake->tail.y; 
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord); 
        printf(" "); 
} 
void move_snake(SNAKE  *snake) 
{ 
        //记录尾巴的坐标 
        snake->tail.x = snake->list[snake->size - 1].x; 
        snake->tail.y = snake->list[snake->size - 1].y; 
        //更新蛇的身体坐标,除蛇头 
        for (int i = snake->size - 1; i > 0; i--) 
        { 
                snake->list[i] = snake->list[i-1];//将数组的前一个元素的坐标给后一节 
        } 
        //更新蛇头 
 
        snake->list[0].x += snake->dx; 
        snake->list[0].y += snake->dy; 
 
} 
void control_snake(SNAKE  *snake) 
{ 
        char  key=0; 
        while (_kbhit()) //判断是否按下按键,按下不等于0  
        { 
                key = _getch(); 
        } 
        switch (key) 
        { 
        case 'a': 
                snake->dx = -1; 
                snake->dy = 0; 
                break; 
        case 'w': 
                snake->dx = 0; 
                snake->dy = -1; 
                break; 
        case 's': 
                snake->dx = 0; 
                snake->dy = 1; 
                break; 
        case 'd': 
                snake->dx = 1; 
                snake->dy = 0; 
                break; 
        } 
 
} 
void game_end(SNAKE  *snake) 
{ 
        snake->coord.X = 25; 
        snake->coord.Y = 25; 
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord); 
        printf("游戏结束 得分为%d\n",snake->score); 
        Sleep(3000); 
        exit(0);//退出进程 
 
         
} 
//咬到自己 
void snake_eat_body(SNAKE  *snake) 
{ 
        //如果蛇头和蛇的身体的任意一节身体坐标相同,则吃到自己身体 
        for (int i = 1; i < snake->size; i++) 
        { 
                if (snake->list[0].x == snake->list[i].x && 
                        snake->list[0].y == snake->list[i].y) 
                { 
                        game_end(snake); 
                 
                } 
                 
        } 
 
} 
void snake_eat_food(SNAKE  *snake) 
{ 
        //如果蛇头和食物的坐标重合.则吃到了食物 
        if (snake->list[0].x == snake->food.x && 
                snake->list[0].y == snake->food.y) 
        { 
                 
                //原食物消失,生成新的食物 
                init_food(snake); 
                //蛇的身体增长一节 
                snake->size++; 
                //分数增加if() 
                snake->score += 10; 
         
        } 
 
} 
void init_wall() 
{ 
        for (int i = 0; i <= HIGH; i++) 
        { 
                for (int j = 0; j <= WIDE; j++) 
                { 
                        if (i == HIGH || j == WIDE) 
                        { 
                                printf("+"); 
                        } 
                        else 
                        { 
                                printf(" "); 
                        } 
 
                } 
                printf("\n"); 
        } 
} 
void start_game(SNAKE  *snake) 
{ 
        while ( snake->list[0].x <60  && snake->list[0].x >= 0 && 
                snake->list[0].y <20 && snake->list[0].y >=0) 
        { 
                //控制蛇的方向 
                control_snake(snake); 
                //更新蛇的坐标 
                move_snake(snake); 
                //蛇移动 
                //system("cls");//清屏 
                //init_wall(); 
                show_ui(snake); 
                //蛇是否碰到自己 
                snake_eat_body(snake); 
                //蛇是否碰到食物-(碰到食物,原食物消失,产生新的食物) 
                snake_eat_food(snake); 
                Sleep(100);//延时0.5s 
        } 
        game_end(snake); 
         
} 
 
void hide_cur() 
{ 
 
        //隐藏控制台光标 
        CONSOLE_CURSOR_INFO  cci; 
        cci.dwSize = sizeof(cci); 
        cci.bVisible = FALSE; 
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); 
} 
int main() 
{ 
        hide_cur(); 
        //init_ui(); 
        init_wall(); 
        //申请蛇的结构体 
        SNAKE  *snake = (SNAKE  *)malloc(sizeof(SNAKE)); 
        init_snake(snake);//初始化蛇和食物 
        show_ui(snake);//显示界面信息 
        start_game(snake);//开始游戏 
         
        system("pause"); 
        return 0; 
} 
 |   
 
 
 
 |