大一新手C语言数据结构实现简单贪吃蛇游戏含源代码
贪吃蛇
1.前言简述
学习编程快一年了,偶然看到网上有做贪吃蛇的视频,于是便一时兴起,用两天时间跟着视频做了起来,在制作过程中也遇到不少问题和陌生的知识,因此通过想博客与大家分享,讨论。(游戏虽然做出来了,但笔者自己也有很多问题一知半解,如有解释不当,欢迎各位解答指正!)
2.编写语言及工具
语言:C语言 工具:Visual Studio 2019
3.游戏的头文件代码(.h)
注:整个游戏包含7个头文件(3个.h文件,4个.c文件)
- .h文件 中一般放的是同名.c文件中定义的变量、数组、函数的声明,声明后.c文件可以直接使用。
- .c文件一般放的是变量、数组、函数,无需再重复定义。
- 使用.h文件和.c文件的原因主要是为了解决文件编译时重复声明的问题,相对来说使代码结构更清晰(改bug也更快)。
3.1map.h
#pragma once
//这个pragma相当于编译指示,我是通过vs2019的类导向功能同时创建.h和.c文件自动出现的,不加上面这句也可以
enum
{
row = 26, col = 26
};
//初始化二维数组
void InitWall();
//输出边界墙
void DrawWall();
//设置场景中的字符
void SetWall(int x, int y, char key);
//获取场景中的字符
char GetWall(int x, int y);
//字符二维数组
char GameArray[row][col];
//移动光标打印字符
void PrintChar(int x,int y,char key);
3.2snake.h
#pragma once
//#define _CRT_SECURE_NO_WARRINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义结点结构体
struct Point
{
int x;
int y;
struct Point* next;
};
//定义运动方向
enum EDiection
{
up='w',down='s',left='a',right='d'
};
//初始化蛇
void InitSnake();
//销毁蛇
void DestroyPoint();
//添加结点
void AddPoint(int x, int y);
//蛇头指针
struct Point* pHead;
//删除结点
void DelPoint();
enum EDiection direction;
//蛇头的坐标,这个决定了游戏是否继续,非常重要!!!!!
int x;
int y;
3.3Food.h
#pragma once
void SetFood();
int FoodX;
int FoodY;
4.游戏的源文件代码(.c)
4.1.地图模块(map.c)
#include "map.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
//初始化二维数组
void InitWall()
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (i == 0 || j == 0 || i == row - 1 || j == col - 1)
{
GameArray[i][j] = '*';//边界围墙
}
else
{
GameArray[i][j] = ' ';//活动区域
}
}
}
}
//输出边界墙
void DrawWall()
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%c ", GameArray[i][j]);
}
switch (i)
{
case 5:printf("贪吃蛇游戏"); break;
case 9:printf("操作提示:"); break;
case 11:printf("上: w"); break;
case 13:printf("下: s"); break;
case 15:printf("左: a"); break;
case 17:printf("右: d"); break;
default:break;
}
printf("\n");
}
}
//设置场景中的字符
void SetWall(int x, int y, char key)
{
GameArray[x][y]