用C语言写贪吃蛇

需要的C语言图形库以在

https://easyx.cn/ 中下载  

 头文件

#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>  // 引入图形库头文件
#include<conio.h>
#include<time.h>

HWND hwnd = NULL; // 窗口句柄
enum move {right=77,left=75,down=80,up=72}; // 定义方向的枚举类型

 构建代码框架和函数

void init_Snake(); // 初始化蛇
void draw_Snake(); // 绘制蛇
void move_Snake(); // 移动蛇
void keydown(); // 处理键盘按键事件
void init_food(); // 初始化食物
void drawfood(); // 绘制食物
void eatfood(); // 判断是否吃到食物
int  snake_die(); // 判断蛇是否死亡
void showGrade(); // 显示分数
void pauseMoment(); // 暂停一段时间

用结构体的构建属性

typedef struct pointX
{
	int x;
	int y;

}position; // 坐标结构体

struct Snake
{
	int num;
	position xy[100]; // 蛇的坐标数组
	char fangxiang; // 蛇的运动方向
}snake;

struct Food
{
	position foodxy; // 食物的坐标
	int foodgrade; // 食物的分数
	int flag; // 是否被吃掉的标志
}food;

 主函数

int main()
{
	srand((unsigned int)time(NULL)); // 随机函数种子,以时间作为种子
	hwnd = initgraph(640, 480); // 创建图形窗口,设置窗口大小为 640x480 像素
	setbkcolor(WHITE); // 设置背景颜色为白色
	init_Snake(); // 初始化蛇的位置和状态
	settextcolor(LIGHTBLUE); // 设置文字颜色为浅蓝色
	cleardevice(); // 清空窗口绘图区域
	outtextxy(200, 200, "CYG的项目———贪吃蛇"); // 在指定位置绘制文字
	outtextxy(200,301,"请按电源键开始......");
	getch(); // 等待用户按下任意键
	draw_Snake(); // 绘制蛇
	init_food(); // 初始化食物的位置和状态

	while (1)
	{	 
		 BeginBatchDraw(); // 开始批量绘图
		 if (food.flag == 0)
		 {
			 init_food(); // 食物被吃掉后重新生成食物
		 }
		while(kbhit()) // 判断键盘是否有按键按下
		{
			
			keydown(); // 处理键盘按键事件
		};
		move_Snake(); // 移动蛇的位置
		
		showGrade(); // 显示当前分数
		draw_Snake(); // 绘制蛇
		eatfood(); // 判断是否吃到食物
		drawfood(); // 绘制食物
		EndBatchDraw(); // 结束批量绘图
		Sleep(50); // 程序休眠一段时间,控制蛇的运动速度
		if (snake_die()) // 判断蛇是否死亡
		{
			break; // 如果蛇死亡,则退出循环
		}
		cleardevice(); // 清空窗口绘图区域,准备下一次绘制
	}
	return 0;
}

模块一  初始化蛇

void init_Snake()
{
	snake.xy[2].x = 0;//xy[2]已经是一个结构数组,.x包含在xy[2]中
	snake.xy[2].y = 50;

	snake.xy[1].x = 10;
	snake.xy[1].y = 50;

	snake.xy[0].x = 20;
	snake.xy[0].y = 50;

	snake.num = 3;
	snake.fangxiang = right;
	food.foodgrade = 0;
}

 模块二 

void draw_Snake()
{
	for (int i = 0; i < snake.num; i++)
	{
		setlinecolor(BLACK); // 设置线条颜色为黑色,即矩形边框的颜色
		setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255)); // 设置填充颜色为随机颜色
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10); // 绘制蛇的矩形身体
	}
}

模块三

void move_Snake()
{
	for (int i = snake.num - 1; i > 0; i--)
	{
		snake.xy[i].x = snake.xy[i - 1].x; // 蛇身体的每一段位置更新为上一段的位置
		snake.xy[i].y = snake.xy[i - 1].y;
	}
	switch (snake.fangxiang)
	{
	case right:
		snake.xy[0].x += 10; // 蛇头向右移动,x坐标增加
		break;
	case left:
		snake.xy[0].x -= 10; // 蛇头向左移动,x坐标减少
		break;
	case up:
		snake.xy[0].y -= 10; // 蛇头向上移动,y坐标减少
		break;
	case down:
		snake.xy[0].y += 10; // 蛇头向下移动,y坐标增加
		break;
	default:
		break;
	}
}

模块四

void keydown()
{
	char userkey = 0;
	userkey = getch(); // 获取用户按下的键盘字符
	switch (userkey)
	{
	case right:
		if (snake.fangxiang != left) // 如果当前蛇的方向不是向左,则可以改变方向为向右
			snake.fangxiang = right;
		break;
	case left:
		if (snake.fangxiang != right) // 如果当前蛇的方向不是向右,则可以改变方向为向左
			snake.fangxiang = left;
		break;
	case down:
		if (snake.fangxiang != up) // 如果当前蛇的方向不是向上,则可以改变方向为向下
			snake.fangxiang = down;
		break;
	case up:
		if (snake.fangxiang != down) // 如果当前蛇的方向不是向下,则可以改变方向为向上
			snake.fangxiang = up;
		break;
	}
}

其余模块

void init_food()
{
	food.foodxy.x = rand() % 65 * 10; // 随机生成食物的x坐标,范围为0到640
	food.foodxy.y = rand() % 48 * 10; // 随机生成食物的y坐标,范围为0到480
	food.flag = 1; // 食物被初始化为存在的状态
}

void drawfood()
{
	setlinecolor(BLACK); // 设置线条颜色为黑色,即矩形边框的颜色
	setfillcolor(GREEN); // 设置填充颜色为绿色
	fillrectangle(food.foodxy.x, food.foodxy.y, food.foodxy.x + 10, food.foodxy.y + 10); // 绘制食物的矩形
}

void eatfood()
{
	if (snake.xy[0].x == food.foodxy.x && snake.xy[0].y == food.foodxy.y) // 判断蛇是否吃到了食物
	{
		snake.num++; // 蛇的长度增加
		food.foodgrade += 10; // 食物的分数增加
		food.flag = 0; // 食物被吃掉的标志设为0,表示已被吃掉
	}
}

int snake_die()
{
	if (snake.xy[0].x > 640 || snake.xy[0].x < 0 || snake.xy[0].y > 480 || snake.xy[0].y < 0) // 判断蛇头是否撞墙
	{
		outtextxy(200, 200, "傻逼!!你撞墙了");
		MessageBox(hwnd, "GameOver!\n哈哈,这都能撞墙", "撞墙警告",MB_OK); // 显示消息框提示游戏结束
		return 1; // 返回1表示蛇已经死亡
	}

	for (int i = 1;i < snake.num;i++)
		if (snake.xy[0].x == snake.xy[i].x && snake.xy[0].y == snake.xy[i].y) // 判断蛇头是否撞到自己的身体
		{
			outtextxy(200, 200, "哈哈哈哈 自残行为");
			MessageBox(hwnd, "寄了","自残警告",MB_OK); // 显示消息框提示游戏结束
			return 1; // 返回1表示蛇已经死亡
		}
	return 0; // 返回0表示蛇仍然存活
}

void showGrade()
{
	char grade[100] = "0";
	sprintf(grade, "%d", food.foodgrade); // 将分数转换为字符串形式
	setbkmode(TRANSPARENT); // 设置文字的背景模式为透明
	settextcolor(BACKUP_DATA); // 设置文字的颜色
	outtextxy(560, 20, "GEADE:  "); // 显示分数的文本
	outtextxy(560 + 50, 20, grade); // 显示实际分数
}

void pauseMoment()
{
	if (getch() == 32) // 如果用户按下空格键
	{
		while (getch() != 32); // 循环等待用户再次按下空格键
	}
}

完整代码

#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>  // 引入图形库头文件
#include<conio.h>
#include<time.h>

HWND hwnd = NULL; // 窗口句柄
enum move {right=77,left=75,down=80,up=72}; // 定义方向的枚举类型

void init_Snake(); // 初始化蛇
void draw_Snake(); // 绘制蛇
void move_Snake(); // 移动蛇
void keydown(); // 处理键盘按键事件
void init_food(); // 初始化食物
void drawfood(); // 绘制食物
void eatfood(); // 判断是否吃到食物
int  snake_die(); // 判断蛇是否死亡
void showGrade(); // 显示分数
void pauseMoment(); // 暂停一段时间

typedef struct pointX
{
	int x;
	int y;

}position; // 坐标结构体

struct Snake
{
	int num;
	position xy[100]; // 蛇的坐标数组
	char fangxiang; // 蛇的运动方向
}snake;

struct Food
{
	position foodxy; // 食物的坐标
	int foodgrade; // 食物的分数
	int flag; // 是否被吃掉的标志
}food;

int main()
{
	srand((unsigned int)time(NULL)); // 随机函数种子,以时间作为种子
	hwnd = initgraph(640, 480); // 创建图形窗口,设置窗口大小为 640x480 像素
	setbkcolor(WHITE); // 设置背景颜色为白色
	init_Snake(); // 初始化蛇的位置和状态
	settextcolor(LIGHTBLUE); // 设置文字颜色为浅蓝色
	cleardevice(); // 清空窗口绘图区域
	outtextxy(200, 200, "CYG的项目———贪吃蛇"); // 在指定位置绘制文字
	outtextxy(200,301,"请按电源键开始......");
	getch(); // 等待用户按下任意键
	draw_Snake(); // 绘制蛇
	init_food(); // 初始化食物的位置和状态

	while (1)
	{	 
		 BeginBatchDraw(); // 开始批量绘图
		 if (food.flag == 0)
		 {
			 init_food(); // 食物被吃掉后重新生成食物
		 }
		while(kbhit()) // 判断键盘是否有按键按下
		{
			
			keydown(); // 处理键盘按键事件
		};
		move_Snake(); // 移动蛇的位置
		
		showGrade(); // 显示当前分数
		draw_Snake(); // 绘制蛇
		eatfood(); // 判断是否吃到食物
		drawfood(); // 绘制食物
		EndBatchDraw(); // 结束批量绘图
		Sleep(50); // 程序休眠一段时间,控制蛇的运动速度
		if (snake_die()) // 判断蛇是否死亡
		{
			break; // 如果蛇死亡,则退出循环
		}
		cleardevice(); // 清空窗口绘图区域,准备下一次绘制
	}
	return 0;
}

void init_Snake()
{
	snake.xy[2].x = 0; // 初始化蛇头的x坐标
	snake.xy[2].y = 50; // 初始化蛇头的y坐标

	snake.xy[1].x = 10; // 初始化蛇身体的第一个坐标的x坐标
	snake.xy[1].y = 50; // 初始化蛇身体的第一个坐标的y坐标

	snake.xy[0].x = 20; // 初始化蛇身体的第二个坐标的x坐标
	snake.xy[0].y = 50; // 初始化蛇身体的第二个坐标的y坐标

	snake.num = 3; // 初始化蛇的长度
	snake.fangxiang = right; // 初始化蛇的运动方向为向右
	food.foodgrade = 0; // 初始化食物的分数为0
}

void draw_Snake()
{
	for (int i = 0; i < snake.num; i++)
	{
		setlinecolor(BLACK); // 设置线条颜色为黑色,即矩形边框的颜色
		setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255)); // 设置填充颜色为随机颜色
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10); // 绘制蛇的矩形身体
	}
}

void move_Snake()
{
	for (int i = snake.num - 1; i > 0; i--)
	{
		snake.xy[i].x = snake.xy[i - 1].x; // 蛇身体的每一段位置更新为上一段的位置
		snake.xy[i].y = snake.xy[i - 1].y;
	}
	switch (snake.fangxiang)
	{
	case right:
		snake.xy[0].x += 10; // 蛇头向右移动,x坐标增加
		break;
	case left:
		snake.xy[0].x -= 10; // 蛇头向左移动,x坐标减少
		break;
	case up:
		snake.xy[0].y -= 10; // 蛇头向上移动,y坐标减少
		break;
	case down:
		snake.xy[0].y += 10; // 蛇头向下移动,y坐标增加
		break;
	default:
		break;
	}
}

void keydown()
{
	char userkey = 0;
	userkey = getch(); // 获取用户按下的键盘字符
	switch (userkey)
	{
	case right:
		if (snake.fangxiang != left) // 如果当前蛇的方向不是向左,则可以改变方向为向右
			snake.fangxiang = right;
		break;
	case left:
		if (snake.fangxiang != right) // 如果当前蛇的方向不是向右,则可以改变方向为向左
			snake.fangxiang = left;
		break;
	case down:
		if (snake.fangxiang != up) // 如果当前蛇的方向不是向上,则可以改变方向为向下
			snake.fangxiang = down;
		break;
	case up:
		if (snake.fangxiang != down) // 如果当前蛇的方向不是向下,则可以改变方向为向上
			snake.fangxiang = up;
		break;
	}
}

void init_food()
{
	food.foodxy.x = rand() % 65 * 10; // 随机生成食物的x坐标,范围为0到640
	food.foodxy.y = rand() % 48 * 10; // 随机生成食物的y坐标,范围为0到480
	food.flag = 1; // 食物被初始化为存在的状态
}

void drawfood()
{
	setlinecolor(BLACK); // 设置线条颜色为黑色,即矩形边框的颜色
	setfillcolor(GREEN); // 设置填充颜色为绿色
	fillrectangle(food.foodxy.x, food.foodxy.y, food.foodxy.x + 10, food.foodxy.y + 10); // 绘制食物的矩形
}

void eatfood()
{
	if (snake.xy[0].x == food.foodxy.x && snake.xy[0].y == food.foodxy.y) // 判断蛇是否吃到了食物
	{
		snake.num++; // 蛇的长度增加
		food.foodgrade += 10; // 食物的分数增加
		food.flag = 0; // 食物被吃掉的标志设为0,表示已被吃掉
	}
}

int snake_die()
{
	if (snake.xy[0].x > 640 || snake.xy[0].x < 0 || snake.xy[0].y > 480 || snake.xy[0].y < 0) // 判断蛇头是否撞墙
	{
		outtextxy(200, 200, "傻逼!!你撞墙了");
		MessageBox(hwnd, "GameOver!\n哈哈,这都能撞墙", "撞墙警告",MB_OK); // 显示消息框提示游戏结束
		return 1; // 返回1表示蛇已经死亡
	}

	for (int i = 1;i < snake.num;i++)
		if (snake.xy[0].x == snake.xy[i].x && snake.xy[0].y == snake.xy[i].y) // 判断蛇头是否撞到自己的身体
		{
			outtextxy(200, 200, "哈哈哈哈 自残行为");
			MessageBox(hwnd, "寄了","自残警告",MB_OK); // 显示消息框提示游戏结束
			return 1; // 返回1表示蛇已经死亡
		}
	return 0; // 返回0表示蛇仍然存活
}

void showGrade()
{
	char grade[100] = "0";
	sprintf(grade, "%d", food.foodgrade); // 将分数转换为字符串形式
	setbkmode(TRANSPARENT); // 设置文字的背景模式为透明
	settextcolor(BACKUP_DATA); // 设置文字的颜色
	outtextxy(560, 20, "GEADE:  "); // 显示分数的文本
	outtextxy(560 + 50, 20, grade); // 显示实际分数
}

void pauseMoment()
{
	if (getch() == 32) // 如果用户按下空格键
	{
		while (getch() != 32); // 循环等待用户再次按下空格键
	}
}

运行结果

 

 在黑色窗口,输入方向键

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 贪吃蛇游戏需要掌握一些基本的图形绘制和控制语句,以及记录蛇的位置和方向。这里给出一个简单的示例代码: ``` #include <stdio.h> #include <conio.h> #include <Windows.h> #define HEIGHT 20 #define WIDTH 40 #define SNAKE_LENGTH 5 void gotoxy(int x, int y) { COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } void hidecursor() { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } int main() { int x[100], y[100]; int foodx, foody; int i, j, direction = 3; int flag = 1; char key; //初始化蛇的位置 for (i = 0; i < SNAKE_LENGTH; i++) { x[i] = WIDTH / 2 + i; y[i] = HEIGHT / 2; } //随机生成食物位置 foodx = rand() % WIDTH; foody = rand() % HEIGHT; while (flag) { //清屏 system("cls"); //画边框 for (i = 0; i <= WIDTH + 1; i++) { gotoxy(i, 0); printf("-"); gotoxy(i, HEIGHT + 1); printf("-"); } for (i = 1; i <= HEIGHT; i++) { gotoxy(0, i); printf("|"); gotoxy(WIDTH + 1, i); printf("|"); } //画食物 gotoxy(foodx + 1, foody + 1); printf("o"); //画蛇 for (i = SNAKE_LENGTH - 1; i >= 1; i--) { x[i] = x[i - 1]; y[i] = y[i - 1]; } switch (direction) { case 0: y[0]--; break; case 1: x[0]++; break; case 2: y[0]++; break; case 3: x[0]--; break; } //判断是 ### 回答2: 贪吃蛇是一款经典的游戏,它可以通过C语言。在C语言中,我们可以使用图形库(如graphics.h)来创建游戏界面。 首先,我们需要创建一个窗口来显示游戏界面。我们可以使用graphics.h中的一些函数来创建窗口,并设置它的大小和标题。 接下来,我们需要定义贪吃蛇的结构体,包括它的位置、长度、蛇身的形状和颜色等信息。我们还需要定义食物的坐标和颜色。 然后,我们需要使用循环来不断更新游戏界面。在每次循环中,我们需要检测玩家的输入,包括上、下、左、右四个方向的移动以及退出游戏。根据玩家的输入,我们可以更新贪吃蛇的位置和长度。 当贪吃蛇吃到食物时,它的长度会增加一个单位,并且食物会在随机的位置重新生成。我们可以使用随机数生成器来实现这一功能。 在每次循环中,我们还需要检测贪吃蛇是否撞到墙壁或自己的身体。如果撞到墙壁或自己的身体,游戏就会结束,我们可以在屏幕上显示游戏结束的提示信息。 最后,当玩家退出游戏时,我们需要清理并关闭窗口。 通过以上步骤,我们就可以使用C语言一个简单贪吃蛇游戏。当然,还可以进一步优化游戏界面的设计,添加计分系统和难度调整功能等,使游戏更加有趣和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值