C语言——贪吃蛇游戏项目

蛇的初始化

蛇的初始化实际就是二维数组的初始化,该二维数组存储两个值,里面包含该蛇身体的坐标信息,他出现的初始位置是模拟坐标的中间位置。

蛇的移动

蛇的移动是通过改变二维数组坐标来实现的,例如当蛇向右前进一个单位,则将尾每一个身体位置的坐标更改,同时改变舌头、蛇身以及蛇尾的方向。这样整体来看蛇就前进了一个单位。

蛇的增长

当蛇吃了正常食物后,蛇的长度会增加,增加蛇的长度就是在食物的位置增加一个二维数组并且将这个位置变为蛇头。

蛇的死亡

当蛇撞上障碍物、自身或者通关时,蛇死亡就是二维数组的销毁,

食物的产生

食物出现的位置上都是随机的,这些因素由通过随机函数获取的随机数决定,食物的位置不能出现在障碍物和边界上。

控制键盘输入

通过获取键盘输入的W(上)、S(下)、A(左)、D(右)来改变模块中的移动方向,从而影响蛇的移动方向。

代码示例:

Snake.c

#define
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include"Snake.h"
/*
1.定义蛇的结构体
2.初始化蛇和食物
3.开始游戏
蛇和墙的碰撞
蛇和自身碰撞
蛇和食物碰撞
重新随机食物
蛇身体增长
分数增长
方向键控制
4.游戏结束
*/
void InitFood()
{
food[0] = rand() % WIDE;
food[1] = rand() % HIGH;
}
void InitSnake()
{
snake.size = 2;
snake.body[0].X = WIDE / 2;
snake.body[0].Y = HIGH / 2;
snake.body[1].X = WIDE / 2 - 1;
snake.body[1].Y = HIGH / 2;
}
void ShowUI()
{

COORD coord;
coord.X = lx;
coord.Y = ly;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar(' ');
//显示蛇的位置上
for (int i = 0; i < snake.size; i++)
{
coord.X = snake.body[i].X;
coord.Y = snake.body[i].Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
if (i == 0)
putchar('@');
else
{
putchar('*');
}
//显示食物位置
coord.X = food[0];
coord.Y = food[1];
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar('#');
}
}
void PlayGame()
{
char key = 'D';
while (snake.body[0].X>=0 && snake.body[0].X<WIDE
&&snake.body[0].Y>=0&& snake.body[0].Y<HIGH)
{
//显示界面
ShowUI();
//方向控制
while (_kbhit())
{
key = _getch();
}
//方向控制按钮
switch (key)
{
case 'D':case'd':dx = 1; dy = 0; break;
case 'A':case'a':dx = -1; dy = 0; break;
case 'W':case'w':dx = 0; dy = -1; break;
case 'S':case's':dx = 0; dy = 1; break;
}
//是否和自身碰撞
for (int i = 1; i < snake.size; i++)
{
//当条件满足就停止游戏
if (snake.body[0].X == snake.body[i].X&&snake.body[0].Y == snake.body[i].Y)
{
return;
}
}
//蛇和食物的碰撞
if (snake.body[0].X == food[0] && snake.body[0].Y == food[1])
{
//随机新食物
InitFood();
//蛇身体增长
snake.size++;
score += 10;
//关卡 速度 障碍物
}
//蛇更新坐标
lx = snake.body[snake.size - 1].X;
ly = snake.body[snake.size - 1].Y;
for (int i = snake.size - 1; i > 0; i--)
{
snake.body[i].X = snake.body[i - 1].X;
snake.body[i].Y = snake.body[i - 1].Y;
}
//更新舌头
snake.body[0].X += dx;
snake.body[0].Y += dy;

Sleep(100);
//system("cls");
}
}
//加框架墙
void InitWall()
{
for (int i = 0; i <= HIGH; i++)
{
for (int j = 0; j <= WIDE; j++)
{
if (i == HIGH)
putchar('=');
else if(j==WIDE)
putchar('|');
else
putchar(' ');
}
putchar('\n');
}
}
int main()
{
//添加随机数种子
srand((size_t)time(NULL));
//清除控制台光标
CONSOLE_CURSOR_INFO cci;
cci.dwSize = sizeof(cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
InitWall();
InitFood();
InitSnake();
PlayGame();

//getchar();
return EXIT_SUCCESS;
}

Snake.h

#pragma
#define
#define
struct BODY
{
int X;
int Y;
};
struct SNAKE
{
int size;
struct BODY body[WIDE * HIGH];
}snake;
int food[2] = { 0 };//food[0]为X坐标 food[1]为Y坐标
int score = 0;
//偏移坐标
int dx = 0;
int dy = 0;
//记录蛇末尾坐标
int lx = 0;
int ly = 0;
void InitFood();
void InitSnake();
void ShowUI();
void PlayGame();
void InitWall();

你的关注就是我创作的动力!