贪吃蛇游戏

实验室学长写的 感觉很厉害的样子  啥时候自己也能写游戏玩啊!!!!

#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最简单):\n");
    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!!!\n");
                return 0;
            }
            Output();
        }
        game_times++; // 又成功吃到一次食物.
    }
    printf("You win!!!\n");
    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("\n");
    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("\n");
    }
    for (j = 0; j <= n + 1; j++)
    {
        printf("#");
    }
    printf("\n");
}

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值