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