c++贪吃蛇代码[通俗易懂]

c++贪吃蛇代码[通俗易懂]游戏小代码

大家好,又见面了,我是你们的朋友全栈君。

最近看到很多网友寻找游戏代码,10年前火爆全网的贪吃蛇,我们可以重拾继续使用!!!!

1:首先是我们的头文件

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
#define HENG 80
#define SHU 25  //HENG是宽度,SHU是高度
#define TIME 400 //初始速度

2:中间部分,也是整个代码最核心的部分

使用了我们从语言最基本的语句

void Gotoxy(int x, int y);
void Food(struct SHE *head);
int Move(struct SHE *head);
int Panduan(struct SHE *head, int x, int y);
struct SHE *Link(struct SHE *head);
void FreeShe(struct SHE *head);
void Gameover(void);
void Huitu(struct SHE *head);


int Fx, Fy;  //食物的位置
int fen;   //得分
int fang; //方向参数
int Tx, Ty;

//构造蛇身
struct SHE
{
    int x;
    int y;
    struct SHE *next;
};

int main(void)
{
    struct SHE *head = NULL;
    int temp;
    int times = TIME;
    char m;

    do
    {
        fen = 0;
        fang = 2;
        temp = fen;
        times = TIME;
        head = NULL;

        head = (struct SHE *)malloc(sizeof(struct SHE));
        head -> x = 40;
        head -> y = 13;
        head -> next = NULL;

        Food(head);

        while (1)
        {
            Huitu(head);
            Sleep(times);
            if (0 == Move(head))
            {
                FreeShe(head);
                Gameover();
                break;
            }
            if (temp < fen)
            {
                Food(head);
                temp = fen;
                if (times > 50)
                {
                    times -=10;
                }
                else if (times > 20)
                {
                    times -=1;
                }
                else
                    ;
            }
        }
        do
        {
            Gotoxy(19,21);
            printf("是否继续?Y/N:");
            scanf(" %c", &m);
            system("cls");
        } while (m != 'Y' && m != 'y' && m != 'n' && m != 'N');
    } while (m == 'Y' || m == 'y');

    return 0;
}

//绘图
void Huitu(struct SHE *head)
{
    int flag = 1;

    while (head != NULL)
    {
        Gotoxy(head -> x, head -> y);
        if (flag == 1)
        {
            printf("□");
        }
        else if (flag == 2)
        {
            printf("■");
        }
        else
            ;
        Gotoxy(Tx, Ty);
        printf(" ");
        flag++;
        head = head -> next;
    }
}

//用于光标的移动
void Gotoxy(int x, int y)
{ 
  COORD coord; 
  coord.X = x; 
  coord.Y = y; 
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

//食物位置构造
void Food(struct SHE *head)
{
    int flag = 0;
    struct SHE *pr = head;

    do
    {
        srand(GetTickCount()); //基于毫秒级的随机数产生办法,需头文件winbase.h, windows中设计程序可以用windows.h
        Fx = (rand()%40) * 2;
        Fy = (rand()%12) * 2;
        flag = 0;
        pr = head;
        while (pr != NULL) //防止食物位置与蛇形重合
        {
            if (pr -> x == Fx && pr -> y == Fy)
            {
                flag = 1;
                break;
            }
            pr = pr -> next;
        }
    } while (flag == 1);
    Gotoxy(Fx, Fy);
    printf("■");
}

//用于蛇的移动
int Move(struct SHE *head)
{
    char op;
    int tox, toy, flag, temp;

    if (kbhit())  //kbhit函数用于检查当前是否有键盘输入,若有则返回一个非0值,否则返回0,需头文件conio.h
    {
        op = getch();
        switch (op)
        {
            case 'w':
                if (fang != 3)
                fang = 1;
                break;
            case 'd':
                if (fang != 4)
                fang = 2;
                break;
            case 's':
                if (fang != 1)
                fang = 3;
                break;
            case 'a':
                if (fang != 2)
                fang = 4;
                break;
            default:
                break;
        }
    }

    switch (fang)
    {
        case 1:
            toy = (head -> y) - 1;
            tox = (head -> x);
            break;
        case 2:
            tox = (head -> x) + 2;
            toy = (head -> y);
            break;
        case 3:
            toy = (head -> y) + 1;
            tox = (head -> x);
            break;
        case 4:
            tox = (head -> x) - 2;
            toy = (head -> y);
            break;
        default:
            break;
    }
    flag = Panduan(head, tox, toy);
    if (flag == 0)
    {
        return 0; //game over
    }
    else if (flag == 1)
    {
        head = Link(head);
        fen++;
    }
    else
    {
        ;
    }
    while (head != NULL)
    {
        temp = head -> x;
        head -> x = tox;
        tox = temp;

        temp = head -> y;
        head -> y = toy;
        toy = temp;

        head = head -> next;
    }
    return 1;
}

//用于食物与失败条件的判断
int Panduan(struct SHE *head, int x, int y)
{

    int flag = 1;

    if (x < 0 || x > HENG - 1 || y < 0 || y > SHU - 1)
    {
        return 0;  //撞墙
    }
    while (head != NULL)
    {
        if (head -> x == x && head -> y == y && flag != 1)
        {
            return 0; //咬到自己
        }
        flag++;
        if (head -> next == NULL)
        {
            Tx = head -> x;
            Ty = head -> y;
        }
        head = head -> next;
    }
    if (x == Fx && y == Fy)
    {
        return 1;//有食物
    }
    return 2;//无异常
}

//蛇身增长
struct SHE *Link(struct SHE *head)
{
    struct SHE *p, *pr;

    pr = head;
    p = (struct SHE *)malloc(sizeof(struct SHE));
    if (p == NULL)
    {
        printf("发生错误!!!");
        exit(0);
    }
    if (head == NULL)
    {
        head = p;
    }
    else
    {
        while (pr -> next != NULL)
        {
            pr = pr -> next;
        }
        pr -> next = p;
    }
    p -> x = Tx;
    p -> y = Ty;
    p -> next = NULL;
    return head;
}

//释放内存
void FreeShe(struct SHE *head)
{
    struct SHE *pr = NULL;

    while (head != NULL)
    {
        pr = head;
        head = head -> next;
        free(pr);
    }
}

//游戏失败画面,如果窗口大小不是80*25导致画面不协调可舍去

3:这一部分我们将会对于代码小块进行整理,也是代码的结束:

void Gameover(void)
{
    int i,j;

    int a[SHU][HENG]={
  
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,1,0,0,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,1,1,0,0,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,1,1,0,0,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,1,1,0,0,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,1,1,0,0,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,0,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

    Gotoxy(0, 0);
    for (i = 0; i < SHU; i++)
    {
        for (j = 0; j< HENG; j++)
        {
            if (a[i][j] == 0)
            {
                printf(" ");
            }
            else
            {
                printf("0");
            }
        }
    }

    Gotoxy(19, 20);
    printf("游戏最终得分是 %d 分!!!\n", fen);
}

代码运行使用

VC6.0 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141551.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月25日 下午5:20
下一篇 2022年5月25日 下午5:40


相关推荐

  • spring中@transactional注解的作用(spring 事务实现原理)

    事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。spring支持编程式事务管理和声明式事务管理两种方式。编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。 声明式事务管理建立在

    2022年4月15日
    288
  • c语言函数的迭代与递归_递归与迭代

    c语言函数的迭代与递归_递归与迭代斐波那契数列:11235813213455…fb(n):1n<=2fb(n-1)+fb(n-2)n>2intfb(n){if(n<=2){return1;}else{returnfb(n-1)+fb(n-2);}}使用递归需进行,如果递归的深度并不是很深,便可以使用。递归的子问题一定要有解。(即递归一定要有回归条件。)递归有两个过程…

    2022年5月3日
    66
  • linux线程互斥量pthread_mutex_t使用简介

    linux线程互斥量pthread_mutex_t使用简介为什么使用线程锁在多线程应用程序中 当多个线程共享相同的内存时 如同时访问一个变量时 需要确保每个线程看到一致的数据视图 即保证所有线程对数据的修改是一致的 如下两种情况不存在不一致的问题 每个线程使用的变量都是其他线程不会读取和修改的变量是只读的当一个线程在修改变量的值时 其他线程在读取这个变量时可能会得到一个不一致的值 一个典型的例子是 在一个多线程程序中 两个及以上

    2026年3月17日
    2
  • java 字符串转集合_字符串转化为 List 集合

    java 字符串转集合_字符串转化为 List 集合解决方案Java.lang包中的String.split()方法可对现有的字符串进行切割,并返回一个字符串数组Strings=”张三123,李四456,王五789″;String[]str=s.split(“,”);对str的遍历所以我们可以用Arrays.asList()方法,将数组转化为List集合Listlist=Arrays.asList(s.sp…

    2022年5月14日
    67
  • 南京大学LAMDA面经汇总

    南京大学LAMDA面经汇总节选自 https://www.jianshu.com/p/7640174a15561.南大计算机网址:南京大学计算机系2016“本科生开放日”申请流程时间:5月13日-5月15日入营条件:985院校的话,绩点排名前5%基本可以入营吃住补助:LAMDA实验室报销车票,住宿费,但是南大不报销车票,但管吃管住,住的很高级的宾馆,条件特别好。参营记录:南大的夏令营是开的最早的一个计算机夏令营,正因为开…

    2022年6月9日
    134
  • 时域卷积网络TCN详解:使用卷积进行序列建模和预测

    时域卷积网络TCN详解:使用卷积进行序列建模和预测CNN 经过一些简单的调整就可以成为序列建模和预测的强大工具尽管卷积神经网络 CNNs 通常与图像分类任务相关 但经过适当的修改 它已被证明是进行序列建模和预测的有价值的工具 在本文中 我们将详细探讨时域卷积网络 TCN 所包含的基本构建块 以及它们如何结合在一起创建一个强大的预测模型 使用我们的开源 DartsTCN 实现 我们展示了只用几行代码就可以在真实数据集上实现准确预测 以下对时间卷积网络的描述基于以下论文 https arxiv org pdf 1803 01271 pdf 本文引用用

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号