跪求贪吃蛇C语言程序,要确保可以运行的,在300行左右,谢谢大神,

 我来答
鸿子92
2018-01-05 · TA获得超过516个赞
知道小有建树答主
回答量:148
采纳率:86%
帮助的人:25.9万
展开全部

共俩个文件,一个game.h的头文件, 一个main.c的主程序文件

//////////////game.h文件

#ifndef _SNAKE_H_H_H
#define _SNAKE_H_H_H

//调节游戏界面大小,这里设置为15*15
int const COL = 15; /**const 修饰的值具有不可变性**/
int const ROW = 15;

//蛇节点
typedef struct Node
{
    int x;
    int y;
    struct Node *pre;
    struct Node *next;
}NODE, *pNODE;

//食物
typedef struct Food
{
    int x;
    int y;
    char c;
}FOOD, *pFOOD;

//初始化,创建蛇的第一节
pNODE InitSnake(void);

//初始化食物成员
FOOD InitFood(void);

//蛇运动函数
int MoveSnake(pNODE pHead, char c);

//检查键盘按键
char KbHit(char orient);

//蛇吃到食物处理函数
pNODE SnakeEatFood(pNODE pHead, pFOOD pFood);

//打印游戏界面函数
void Print(pNODE pHead, FOOD food);

//游戏结束,释放内存函数
void FreeMemory(pNODE *ppHead);

#endif


//////////main.c文件
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <Windows.h>
#include  "game.h"
//主函数
int main(void)
{
    char orien = 'a', get_char;
    int game_over = 0;

    FOOD food = InitFood();      /**初始化食物**/
    pNODE head = InitSnake();   /**初始化头节点*/

    while (1)
    {
        head = SnakeEatFood(head, &food);
        get_char = KbHit(orien);
        if (27 == get_char)
        {
            game_over = 1;
            break;
        }
        else
            orien = get_char;
        game_over = MoveSnake(head, orien);
        if (game_over)
            break;

        system("cls");
        Print(head, food);
        Sleep(200); //ms级,刷屏间隔时间
    }
    if (game_over)
    {
        printf("游戏结束!\n");

        FreeMemory(&head);
        if (NULL == head)
            printf("内存释放成功!\n");
        else
            printf("内存释放失败!\n");
    }
    getch();
    return 0;
}
//初始化,创建蛇的第一节
pNODE InitSnake(void)
{
    pNODE pHead = (pNODE)malloc(sizeof(NODE));
    srand((unsigned)(time(NULL)+1));

    if (NULL == pHead)
    {
        printf("内存分配失败!\n");
        exit(-1);
    }

    pHead->x = rand() % ROW;
    pHead->y = rand() % COL;
    pHead->next = NULL;
    pHead->pre = NULL;

    return pHead;
}
//初始化食物成员
FOOD InitFood(void)
{
    FOOD food;
    srand((unsigned)time(NULL));

    food.x = rand() % ROW;
    food.y = rand() % COL;
    food.c = 65 + rand()%26;

    return food;
}
//蛇吃到食物处理函数
pNODE SnakeEatFood(pNODE pHead, pFOOD pFood)
{
    pNODE p_add = NULL, pt = NULL, rear = NULL;

    if (pFood->x == pHead->x && pFood->y == pHead->y)
    {
        p_add = (pNODE)malloc(sizeof(NODE));
        if (NULL == p_add)
        {
            printf("内存分配失败!\n");
            exit(-1);
        }

        pt = pHead;
        while (pt->next != NULL)
        {
            pt = pt->next;
        }
        p_add->pre = pt;
        p_add->next = NULL;
        pt->next = p_add;

        *pFood = InitFood();
        //不让食物出现在蛇的位置上
        pt = pHead;
        while (pt != NULL)
        {
            if (pFood->x == pHead->x && pFood->y == pHead->y)
            {
                *pFood = InitFood();
                break;
            }
            pt = pt->next;
        }
    }

    return pHead;
}
//检查键盘按键
char KbHit(char orient)
{
    char c;

    if (kbhit())
    {
        c = getch();
        if (orient != 'd' && c == 'a')
        {
            orient = c;
        }
        else if (orient != 'a' && c == 'd')
        {
            orient = c;
        }
        else if (orient != 'w' && c == 's')
        {
            orient = c;
        }
        else if (orient != 's' && c == 'w')
        {
            orient = c;
        }
        else if (27 == c)
        {
            orient = c;
        }
    }

    return orient;
}
//蛇运动函数
int MoveSnake(pNODE pHead, char c)
{
    INT game_over = 0;
    pNODE pt = pHead;

    //让pt指向蛇尾
    while (pt->next != NULL)
    {
        pt = pt->next;
    }

    //从蛇尾向向蛇头前进
    while(pt != pHead)
    {
        pt->x = pt->pre->x;
        pt->y = pt->pre->y;
        pt = pt->pre;
    }

    if ('d' == c)
    {
        pHead->x += 1;
        if (pHead->x >= ROW)
        {
            pHead->x -= ROW;
        }
    }

    if ('a' == c)
    {
        pHead->x -= 1;
        if (pHead->x < 0)
        {
            pHead->x += ROW;
        }
    }

    if ('s' == c)
    {
        pHead->y += 1;
        if (pHead->y >= COL)
        {
            pHead->y -= COL;
        }
    }

    if ('w' == c)
    {
        pHead->y -= 1;
        if (pHead->y < 0)
        {
            pHead->y += COL;
        }
    }

    //当蛇头碰到蛇身,游戏结束
    pt = pHead->next;
    while (pt != NULL)
    {
        if (pt->x == pHead->x && pt->y == pHead->y)
        {
            game_over = 1;
        }
        pt = pt->next;
    }

    return game_over;
}
//打印游戏界面函数
void Print(pNODE pHead, FOOD food)
{
    int row = 0, col = 0, flag = 0;
    pNODE pt = NULL;

    printf("  方向控制——上:w 下:s 左:a 右:d(Esc退出)\n  ");
    for (row=0; row<ROW; row++)
    {
        printf("—");
    }
    putchar('\n');

    for (col=0; col<COL; col++)
    {
        printf(" |");
        for (row=0; row<ROW; row++)
        {
            pt = pHead;
            flag = 0;
            //打印出蛇
            while (pt != NULL)
            {
                if (row == pt->x && col == pt->y)
                {
                    if (pt == pHead)
                        printf("■");
                    else
                        printf("□");
                    flag = 1;
                    break;
                }
                pt = pt->next;
            }
            //打印出食物或两个空格
            if (0 == flag)
            {
                if (row == food.x && col == food.y)
                {
                    putchar(food.c);
                    putchar(food.c);
                    continue;
                }
                printf("  ");
            }
        }
        printf("|");
        putchar('\n');
    }

    printf("  ");
    for (row=0; row<ROW; row++)
    {
        printf("—");
    }
    putchar('\n');
}
//释放内存函数
void FreeMemory(pNODE *ppHead)
{
    pNODE p_delete = NULL, pt = NULL;

    while (*ppHead != NULL)
    {
        pt = (*ppHead)->next;
        if (pt != NULL)
        {
            pt->pre = NULL;
        }
        p_delete = *ppHead;
        free(p_delete);
        p_delete = NULL;
        *ppHead = pt;
    }
}

更多追问追答
追问
有图片吗,这个没有格式的,堆成一堆,看不懂
追答
在电脑上看。没堆成一堆。我调试了可以运行的。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式