简单的C语言贪吃蛇

一、源代码

snake.h

#ifndef __SNAKE_H__
#define __SNAKE_H__

#include 
#include 
#include 
#include 
#include 
#include 
#include 


#define WIDE 60			// 宽度
#define HIGH 20			// 高度

// 一个身体的对象
struct BODY {
	int X;
	int Y;
};

// 定义蛇对象
struct SNAKE {
	struct BODY body[WIDE*HIGH];
	int size;
}snake;			// 一个蛇对象

				// 定义食物对象
struct FOOD {
	int X;
	int Y;
}food;			// 一个食物对象

int score = 0;	// 分数

int kx = 0;			// 用户按下 asdw 任意一个按键所得到的 坐标值。
int ky = 0;

int lastX = 0;		// 蛇尾的坐标。
int lastY = 0;

int sleepSecond = 400;

// 声明函数
void initSnake(void);
void initFood(void);
void initUI(void);
void playGame(void);
void initWall(void);
void showScore(void);

#endif

main.c

#define _CRT_SECURE_NO_WARNINGS

#include "snake.h"		// 引入自定义头文件

int main(void)
{
	// 去除光标。
	CONSOLE_CURSOR_INFO cci;  /*CONSOLE_CURSOR_INFO 是一个结
							  构体类型,它定义在 wincon.h 头
							  文件中,用来描述控制台窗口光标的
							  信息。
	dwSize:表示光标的大小,取值范围为 1 到 100。
	bVisible:表示光标是否可见,如果为 TRUE,则光标可见;
			如果为 FALSE,则光标不可见。							  
							  */
	cci.dwSize = sizeof(cci);
	cci.bVisible = FALSE;  // TRUE :
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);  设置控制台窗口光标大小和可见性

	srand(time(NULL));  // 播种随机数种子。

	initSnake();	// 初始化蛇
	initFood();		// 初始化食物

	initWall();		// 画墙
	initUI();		// 画蛇和食物

	playGame();		// 启动游戏

	showScore();	// 打印分数

	system("pause");
	return EXIT_SUCCESS;
}

void showScore(void)
{
	// 将光标默认位置移动至 不干扰游戏的任意位置。
	COORD coord;

	coord.X = 0;
	coord.Y = HIGH + 2;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

	printf("Game Over!!!\n");
	printf("成绩为:%d\n\n\n", score);
}

/*
这段代码使用嵌套的循环,分别遍历每一行和每一列,
根据位置情况输出相应的字符。如果到了最后一列,输出一条竖线 |;
如果到了最后一行,输出一条横线 _;其他情况下,输出一个空格。
最后,每输出一行,就换一次行。
*/
void initWall(void)
{
	for (size_t i = 0; i <= HIGH; i++)   // 多行
	{
		for (size_t j = 0; j <= WIDE; j++)   // 一行中的多列
		{
			if (j == WIDE)  // 如果到了最后一列,输出一条竖线
			{
				printf("|");
			}
			else if (i == HIGH) // 如果到了最后一行,输出一条横线
			{
				printf("_");
			}
			else    // 其他情况下,输出一个空格
			{
				printf(" ");
			}
		}
		printf("\n");   // 每输出一行,换行一次
	}
}

void playGame(void)
{
	char key = 'd';     // 定义一个字符变量 key,表示用户的按键输入,默认是向右移动。

	while (snake.body[0].X >= 0 && snake.body[0].X < WIDE
		&& snake.body[0].Y >= 0 && snake.body[0].Y < HIGH)  // 判断蛇是否撞墙
	{
		initUI();       // 更新蛇的位置,打印出贪吃蛇和食物

		if (_kbhit())   // 检测用户是否有按键输入
		{
			key = _getch();     // 获取用户按下的按键
		}
		switch (key)
		{
		case 'w': kx = 0; ky = -1; break;   // 如果用户按下 'w',向上移动
		case 's': kx = 0; ky = +1; break;   // 如果用户按下 's',向下移动
		case 'd': kx = +1; ky = 0; break;   // 如果用户按下 'd',向右移动
		case 'a': kx = -1; ky = 0; break;   // 如果用户按下 'a',向左移动
		default: break;     // 如果用户按下其他键,不进行移动
		}

		// 碰撞
				// 判断蛇头是否撞到身体
		for (size_t 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.X && snake.body[0].Y == food.Y)
		{
			initFood();     // 食物被吃掉了,重新生成一个食物
			snake.size++;   // 蛇的长度增加
			score += 10;    // 得分增加

			sleepSecond -= 100;     // 加速游戏
		}


		// 记录蛇尾的位置
		lastX = snake.body[snake.size - 1].X;
		lastY = snake.body[snake.size - 1].Y;

		// 更新蛇的位置
		for (size_t i = snake.size - 1; i > 0; i--)
		{
			snake.body[i].X = snake.body[i - 1].X;   // 后一节身体部位的 X 坐标等于前一节身体部位的 X 坐标
			snake.body[i].Y = snake.body[i - 1].Y;   // 后一节身体部位的 Y 坐标等于前一节身体部位的 Y 坐标
		}
		snake.body[0].X += kx;  // 蛇头的 X 坐标根据用户按键修改
		snake.body[0].Y += ky;  // 蛇头的 Y 坐标根据用户按键修改

		Sleep(sleepSecond);     // 控制游戏速度,让游戏不会太快。
	}
	return;
}


// 定义初始化蛇函数
void initSnake(void)
{
	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;

	return;
}

// 初始化界面控件
void initUI(void)
{
	COORD coord = { 0 };  // 定义一个 COORD 类型的结构体变量,用来表示光标移动的位置。

	// 画蛇
	for (size_t i = 0; i < snake.size; i++)  // 遍历贪吃蛇的每个身体部位
	{
		coord.X = snake.body[i].X;          // 获取当前身体部位的 X 坐标
		coord.Y = snake.body[i].Y;          // 获取当前身体部位的 Y 坐标
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);  // 将光标移动到当前身体部位所在的位置

		if (i == 0)                         // 如果当前身体部位是蛇头
			putchar('@');                   // 打印出蛇头
		else
			putchar('*');                   // 否则打印出蛇身
	}

	// 去除蛇尾
	coord.X = lastX;                        // 获取蛇尾的 X 坐标
	coord.Y = lastY;                        // 获取蛇尾的 Y 坐标
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);  // 将光标移动到蛇尾所在的位置
	putchar(' ');                           // 打印一个空格,相当于去除了蛇尾

	// 画食物
	coord.X = food.X;                       // 获取食物的 X 坐标
	coord.Y = food.Y;                       // 获取食物的 Y 坐标
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);  // 将光标移动到食物所在的位置
	putchar('#');                           // 打印出食物
}


// 食物的初始化函数
void initFood(void)
{
	food.X = rand() % WIDE;  // 0-59
	food.Y = rand() % HIGH;  // 0-59
	return;
}


 

二、运行结果截图

简单的C语言贪吃蛇_第1张图片

 

你可能感兴趣的:(c语言,开发语言)