C语言 单链表 贪吃蛇小游戏 (控制台)

C语言实现单链表控制台贪吃蛇小游戏编译环境:vs2019需求:统计游戏开始后的时间,控制贪吃蛇;吃到食物蛇身加长,得分加一;碰墙或蛇头碰到身体减一条生命;生命消耗完则结束游戏。思路:使用wasd键控制蛇的移动方向,蛇头碰到食物得分加一,并在地图上随机产生一个食物,累加得分,碰墙或碰自己减一条生命,并初始化整条蛇,生命值为0时结束游戏。做法:使用单链表控制贪吃蛇移动的核心思想就是:链表...
摘要由CSDN通过智能技术生成
C语言实现单链表控制台贪吃蛇小游戏

编译环境:vs2019

需求:
统计游戏开始后的时间,控制贪吃蛇;吃到食物蛇身加长,得分加一;碰墙或蛇头碰到身体减一条生命;生命消耗完则结束游戏。

思路:
使用wasd键控制蛇的移动方向,蛇头碰到食物得分加一,并在地图上随机产生一个食物,累加得分,碰墙或碰自己减一条生命,并初始化整条蛇,生命值为0时结束游戏。

做法:
使用单链表控制贪吃蛇移动的核心思想就是:链表存储贪吃蛇所有坐标,每次循环贪吃蛇不断向一个方向插入一个新的结点作为新的蛇头,按下按键控制新蛇头产生的位置,然后从新蛇头处遍历链表输出蛇身到上一个蛇尾,清除上一个蛇尾的痕迹,并释放相关结点。
每次向链表插入新节点后,判断新节点的坐标是否和食物的坐标重合,如果重合本轮循环不释放清除蛇尾结点,反之释放清除上一个蛇尾的结点。
另外,在写蛇生命相关代码的时候,还需要注意一下哪些值应该初始化,哪些值不应该初始化。
只要明白了贪吃蛇运动的核心思想,整个程序其实就不难写出来。

难点:
wsad控制贪吃蛇上下左右移动,并清除蛇尾。

说明:
使用单链表实现贪吃蛇的核心思想是我一开始没有想到的,部分相关代码我学习并借鉴了一些网络上搜索到的代码,如果有违反了相关版权协议,请告知我修改相关代码。

注意:
由于编译器原因程序中_kbhit()和_getch()函数可能在其他编译器上编译会出现错误,解决办法是去掉函数前面的“_”。

运行效果:
贪吃蛇运行效果

代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>

void HideCursor();              //光标隐藏
void gotoxy(int x, int y);      //光标定位

typedef struct snake
{
   
    int x;
    int y;
    struct snake* next;
}snake;

#define WIDTH 100           //控制台窗口宽度
#define HEIGHT 30           //控制台窗口高度
#define SNAKEN 4            //贪吃蛇初始长度
#define LIFE 3              //初始生命次数
#define SPEED 200           //游戏速度、循环休眠时间
#define U 1                 //使用宏代替需要数字代替的蛇的行动方向
#define D 2                 //宏名含义是各方向英文单词首字母
#define L 3                 //蛇的状态,U:上 ;D:下;L:左 R:右
#define R 4                 


void dtxxcsh()              //输出地图
{
   

    for (int i = 1; i < WIDTH-1; i++)        //输出上下面墙
    {
   
        gotoxy(i, 26);
        printf("-");
        gotoxy(i, 0);
        printf("-");
    }
    for (int i = 0; i < HEIGHT-3; i++)    //输出左右两面墙
    {
   
        gotoxy(0, i);
        printf("|");
        gotoxy(99, i);
        printf("|");
    }
    gotoxy(24, 28);
    printf("得分:  0           生命:  %d           时间:  0           ",LIFE);   
    //xy 30,28可用得分数值      14个空格
}


int foodx, foody;           //食物位置坐标

void sjcsswhs()             //随机产生一个食物
{
   
    srand(time(NULL));      

    foodx = rand() % (WIDTH - 4) + 2;       //使用宏运算随机数最大值需要加括号

    while (foodx % 2)                       //如果食物的x坐标不是偶数,再获取一个x坐标
    {
   
        foodx = rand
  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值