贪吃蛇游戏(附源码)

#include <stdio.h>  
#include <conio.h>  
#include <stdlib.h>  
#include <time.h>  
 
const int maxn = 100; 
const int n = 20; 
 
struct node 

    int x, y; 
}; 
 
int map[maxn][maxn]; // 0表示空格,1表示蛇身,2表示食物,3表示撞死的位置, 4表示蛇头.  
node food; 
node squence[maxn]; // 蛇的身子的坐标.  
int len; // 蛇的长度.  
bool eat; // 判断当前事物是否被吃了.  
bool gameover; // 游戏是否失败.  
int direction; // 判断当前蛇头是朝哪个方向.  
 
void Output(void); 
void Move(int direction); 
void Move_up(void); 
void Move_down(void); 
void Move_left(void); 
void Move_right(void); 
 
int main() 

    int i, j; 
    double start; 
    int gamespeed; // 游戏速度自己调整.  
    int timeover; 
    int game_times = 1; // 游戏的次数.  
    char c = 'x'; 
    printf("请输入游戏的级别(1到500,1最难,500最简单): "); 
    scanf("%d", &gamespeed); 
    gamespeed = gamespeed; 
    // 对图的初始化.  
    for (i = 0; i <= n + 1; i++) 
    { 
        for (j = 0; j <= n + 1; j++) 
        { 
            map[i][j] = 0; 
        } 
    } 
    // 对蛇的初始化.  
    for (i = 1; i <= n; i++) 
    { 
        squence[i].x = 0; 
        squence[i].y = 0; 
    } 
    len = 1; // 蛇的长度为1.  
    squence[len].x = 1; 
    squence[len].y = 1; // 初始位置在点(1, 1).  
    map[1][1] = 4; 
    direction = 4; // 默认开始时蛇向右走.  
    srand(time(0)); 
    while (game_times <= 20) 
    { 
        eat = 0; // 食物还没被吃.  
        while (true) 
        { // 随机生出食物的坐标,注意不能与蛇身重合,否则就重新随机产生.  
            food.x = rand() % 20 + 1; 
            food.y = rand() % 20 + 1; 
            if (map[food.x][food.y] == 0) 
            { 
                break; 
            } 
        } 
        map[food.x][food.y] = 2; // 食物位置.  
        system("cls"); 
        Output(); 
        // 以下这段半秒钟不按键还取原方向继续前行.  
        while (!eat) 
        { 
            start = clock(); 
            timeover=1; 
            while(!kbhit()) 
            { // 说明没有按键.  
                if (clock() - start <= gamespeed) 
                { // 如果时间超过游戏时间.  
                    timeover = 1; 
                } 
                else 
                { 
                    timeover = 0; 
                    break; 
                } 
            } 
            if (timeover) 
            { // 说明有按键.  
                // 按一次键,可以连取两个  
                c = getch(); 
                c = getch(); 
                // 以下几行告诉怎样判断用户按的哪个方向键  
                if(c==72) direction = 1; // printf("向上");  
                if(c==80) direction = 2; // printf("向下");  
                if(c==75) direction = 3; // printf("向左");  
                if(c==77) direction = 4; // printf("向右");  
            } 
            Move(direction); 
            system("cls"); 
            if (gameover) 
            { 
                Output(); 
                printf("Game Over!!! "); 
                return 0; 
            } 
            Output(); 
        } 
        game_times++; // 又成功吃到一次食物.  
    } 
    printf("You win!!! "); 
    return 0; 

 
void Move(int direction) 

    switch (direction) 
    { 
    case 1 : Move_up(); break; 
    case 2 : Move_down(); break; 
    case 3 : Move_left(); break; 
    default : Move_right(); 
    } 

 
void Output(void) 

    int i, j; 
    for (j = 0; j <= n + 1; j++) 
    { 
        printf("#"); 
    } 
    printf(" "); 
    for (i = 1; i <= n; i++) 
    { 
        for (j = 0; j <= n + 1; j++) 
        { 
            if (j == 0 || j == n + 1) 
            { 
                if (map[i][j] == 3) 
                { 
                    printf("!"); 
                } 
                else 
                { 
                    printf("#"); 
                } 
            } 
            else 
            { 
                if (map[i][j] == 1) 
                { 
                    printf("*"); 
                } 
                else if (map[i][j] == 2) 
                { 
                    printf("@"); 
                } 
                else if (map[i][j] == 3) 
                { 
                    printf("!"); 
                } 
                else if (map[i][j] == 4) 
                { 
                    switch (direction) 
                    { 
                    case 1 : printf("%c", 30); break; 
                    case 2 : printf("%c", 31); break; 
                    case 3 : printf("%c", 17); break; 
                    default : printf("%c", 16); 
                    } 
                } 
                else 
                { 
                    printf(" "); 
                } 
            } 
        } 
        printf(" "); 
    } 
    for (j = 0; j <= n + 1; j++) 
    { 
        printf("#"); 
    } 
    printf(" "); 

 
void Move_up(void) 

    int i; 
    int x, y; 
    if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x + 1) 
    { // 不能移动,则按原来的移动.  
        direction = 2; // 按原来的向下移动.  
        Move(direction); 
        return ; 
    } 
    // 开始移动.  
    x = squence[len].x - 1; 
    y = squence[len].y; 
    if (x == 0 || map[x][y] == 1) 
    { // 撞到边界或者自己撞到自己.  
        map[x][y] = 3; 
        gameover = 1; 
    } 
    if (map[x][y] == 2) 
    { // 说明已经吃到事物.  
        map[squence[len].x][squence[len].y] = 1; 
        len++; 
        squence[len].x = x; 
        squence[len].y = y; 
        map[x][y] = 4; 
        eat = 1; 
    } 
    else 
    { 
        map[squence[1].x][squence[1].y] = 0; 
        for (i = 1; i <= len - 1; i++) 
        { 
            squence[i].x = squence[i + 1].x; 
            squence[i].y = squence[i + 1].y; 
            map[squence[i + 1].x][squence[i + 1].y] = 1; 
        } 
        squence[len].x = squence[len].x - 1; 
        if (gameover) 
        { 
            map[squence[len].x][squence[len].y] = 3; 
        } 
        else 
        { 
            map[squence[len].x][squence[len].y] = 4; 
        } 
    } 

 
void Move_down(void) 

    int i; 
    int x, y; 
    if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x - 1) 
    { // 不能移动,则按原来的移动.  
        direction = 1; // 按原来的向上移动.  
        Move(direction); 
        return ; 
    } 
    // 开始移动.  
    x = squence[len].x + 1; 
    y = squence[len].y; 
    if (x == n + 1 || map[x][y] == 1) 
    { // 撞到边界或者自己撞到自己.  
        map[x][y] = 3; 
        gameover = 1; 
    } 
    if (map[x][y] == 2) 
    { // 说明已经吃到事物.  
        map[squence[len].x][squence[len].y] = 1; 
        len++; 
        squence[len].x = x; 
        squence[len].y = y; 
        map[x][y] = 4; 
        eat = 1; 
    } 
    else 
    { 
        map[squence[1].x][squence[1].y] = 0; 
        for (i = 1; i <= len - 1; i++) 
        { 
            squence[i].x = squence[i + 1].x; 
            squence[i].y = squence[i + 1].y; 
            map[squence[i + 1].x][squence[i + 1].y] = 1; 
        } 
        squence[len].x = squence[len].x + 1; 
        if (gameover) 
        { 
            map[squence[len].x][squence[len].y] = 3; 
        } 
        else 
        { 
            map[squence[len].x][squence[len].y] = 4; 
        } 
    } 

 
void Move_left(void) 

    int i; 
    int x, y; 
    if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y + 1) 
    { // 不能移动,则按原来的移动.  
        direction = 4; // 按原来的向右移动.  
        Move(direction); 
        return ; 
    } 
    // 开始移动.  
    x = squence[len].x; 
    y = squence[len].y - 1; 
    if (y == 0 || map[x][y] == 1) 
    { // 撞到边界或者自己撞到自己.  
        map[x][y] = 3; 
        gameover = 1; 
    } 
    if (map[x][y] == 2) 
    { // 说明已经吃到事物.  
        map[squence[len].x][squence[len].y] = 1; 
        len++; 
        squence[len].x = x; 
        squence[len].y = y; 
        map[x][y] = 4; 
        eat = 1; 
    } 
    else 
    { 
        map[squence[1].x][squence[1].y] = 0; 
        for (i = 1; i <= len - 1; i++) 
        { 
            squence[i].x = squence[i + 1].x; 
            squence[i].y = squence[i + 1].y; 
            map[squence[i + 1].x][squence[i + 1].y] = 1; 
        } 
        squence[len].y = squence[len].y - 1; 
        if (gameover) 
        { 
            map[squence[len].x][squence[len].y] = 3; 
        } 
        else 
        { 
            map[squence[len].x][squence[len].y] = 4; 
        } 
    } 

 
void Move_right(void) 

    int i; 
    int x, y; 
    if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y - 1) 
    { // 不能移动,则按原来的移动.  
        direction = 3; // 按原来的向左移动.  
        Move(direction); 
        return ; 
    } 
    // 开始移动.  
    x = squence[len].x; 
    y = squence[len].y + 1; 
    if (y == n + 1 || map[x][y] == 1) 
    { // 撞到边界或者自己撞到自己.  
        map[x][y] = 3; 
        gameover = 1; 
    } 
    if (map[x][y] == 2) 
    { // 说明已经吃到事物.  
        map[squence[len].x][squence[len].y] = 1; 
        len++; 
        squence[len].x = x; 
        squence[len].y = y; 
        map[x][y] = 4; 
        eat = 1; 
    } 
    else 
    { 
        map[squence[1].x][squence[1].y] = 0; 
        for (i = 1; i <= len - 1; i++) 
        { 
            squence[i].x = squence[i + 1].x; 
            squence[i].y = squence[i + 1].y; 
            map[squence[i + 1].x][squence[i + 1].y] = 1; 
        } 
        squence[len].y = squence[len].y + 1; 
        if (gameover) 
        { 
            map[squence[len].x][squence[len].y] = 3; 
        } 
        else 
        { 
            map[squence[len].x][squence[len].y] = 4; 
        } 
    } 

原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410987.html