【c语言】贪吃蛇

这篇具有很好参考价值的文章主要介绍了【c语言】贪吃蛇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当我们不想学习新知识的时候,并且特别无聊,就会突然先看看别人怎么写游戏的,今天给大家分享的是贪吃蛇,所需要的知识有结构体,枚举,以及easy-x图形库的一些基本函数就完全够用了,本来我想插入游戏的音乐,但是没找到贪吃蛇的背景音乐,所以就没加,大家可以参考我之前的博文里面有如何加音乐的教程

包含的头文件

#include <stdio.h>
#include <graphics.h>//图形库头文件
#include <conio.h>//_kbhit()函数头文件
#include <stdlib.h>//srand函数头文件
#include <time.h>//time()函数头文件

初始化界面

int main()
{
	initgraph(640,480);//初始化界面
	while (1);
	
	return 0;

}

初始化长640,宽480的界面,while(1);使得界面一直出现
【c语言】贪吃蛇,c语言,游戏专区,c语言

设置背景颜色

int main()
{
	initgraph(640,480);
	setbkcolor(RGB(31, 29, 66));//设置背景颜色
	cleardevice();//清空绘图设备
	while (1);
	
	return 0;

}

setbkcolor中的RGB(31, 29, 66),打开微信,同时按下Alt键,A,可获取你截图中颜色的RGB;
【c语言】贪吃蛇,c语言,游戏专区,c语言

定义蛇的信息结构体,枚举定义蛇的方向

#define SNAKE_NUM 500// 最大有500节
struct Snake
{
	int size;//蛇的节数
	int dir;//蛇的方向
	int speed;//蛇的速度
	POINT coor[SNAKE_NUM];//蛇的坐标



}snake;
enum DIR  //表示蛇的方向
{
	UP,//向上
	DOWN,//向下
	LEFT,//向左
	RIGHT,//向右
};

数据初始化

void gameinit()
{    
	snake.size = 3;//初始化蛇刚开始为三节
	snake.speed = 8;//初始速度是每按一次方向键改变八个像素的位置
	snake.dir = RIGHT;//初始蛇的方向是向右
	for (int i = 0; i < snake.size; i++)
	{
		snake.coor[i].x = 40 - 10 * i;
		snake.coor[i].y = 10;


	}




}

在for循环内定义好每一节的圆心坐标,记snake.coor[0].x为蛇头的圆心坐标的横坐标,记snake.coor[0].y为蛇头的圆心坐标的纵坐标,初始化三节,for循环定义这三节的坐标,头的圆心坐标为(40,10)中间为(30,10),最后为(20,10);初始化蛇应该是横着的。

整合函数

函数写的太乱,我们可以将相同的功能放在一个函数里面,比如说将initgraph(640, 480);放在gameinit()里面,将画的都放在gamedraw()函数里面。

//数据初始化
void gameinit()
{
	initgraph(640, 480);
	snake.size = 3;
	snake.speed = 8;
	snake.dir = RIGHT;
	for (int i = 0; i < snake.size; i++)
	{
		snake.coor[i].x = 40 - 10 * i;
		snake.coor[i].y = 10;


	}




}
void gamedraw()
{
	BeginBatchDraw();//双缓冲消除闪屏
	setbkcolor(RGB(31, 29, 66));//设置背景颜色

	cleardevice();//清空绘图设备


	
	//绘制蛇
	setfillcolor(RED);//设置蛇的颜色
	for (int i = 0; i < snake.size; i++)
	{
	solidcircle(snake.coor[i].x, snake.coor[i].y, 5);//循环绘制蛇的三节身体

	}
	EndBatchDraw();//双缓冲消除闪屏


}
int main()
{
	
	gameinit();
	gamedraw();

	while (1);
	
	return 0;

}

在绘制蛇那里setfillcolor(RED);//设置蛇的颜色,在设置蛇的颜色下面的循环中是画初始化好的三节蛇的身体,solidcircle(snake.coor[i].x, snake.coor[i].y, 5);这个是画实心圆的函数,前两个参数为圆的横纵坐标,第三个参数是圆的半径
【c语言】贪吃蛇,c语言,游戏专区,c语言

键盘控制移动方向

void keycontrol()
{
	//72 80 75 77
	
	if (_kbhit())
	{
		switch (_getch())
		{
		case 'w':
		case 'W':
		case 72:
			if (snake.dir != DOWN)
			{
				snake.dir = UP;
			}
			break;
		case 's':
		case 'S':
		case 80:
			if (snake.dir != UP)
			{
				snake.dir = DOWN;
			}
			break;
		case 'a':
		case 'A':
		case 75:
			if (snake.dir != RIGHT)
			{
				snake.dir = LEFT;
			}
			break;
		case 'd':
		case 'D':
		case 77:
			if (snake.dir != LEFT)
			{
				snake.dir = RIGHT;
			}
			break;
		case ' ':
			while (1)
			{
				if (_getch() == ' ')
					return;
			}
			break;











		}
	}




}

_kbhit()是一个C和C++函数,用于非阻塞地响应键盘输入事件,即键盘敲击。它检查当前是否有键盘输入,如果有则返回一个非0值,否则返回0。
w,s,a,d对应的虚拟键值为72,80,75,77.当_kbhit()返回不为0,则有键按下,_getch 是 C 语言中常用的一个函数,它可以获取用户在控制台输入的一个字符,并且不需要回车。当按下方向键后,_getch()读取按下的字符,将蛇的方向改变成对应的方向键。为什么这里有条件判断语句if,是因为蛇在向一个方向走的时候不能直接往相反的方向走.比如说按下w,往上走,除了向下走外,向左走,和向右走的时候按向上走就可以向上走。由于游戏暂停函数有些问题,我们可以把游戏暂停放在这里,当_kbhit()获取到空格的时候,进行while(1)循环,不进行其他操作,所以蛇会暂停,当条件判断
if (_getch() == ’ ')再次读到空格,return退出循环游戏继续。

蛇的移动

void snakemove()
{
	for (int i = snake.size-1; i>0; i--)//身体跟着头移动
	{
		snake.coor[i] = snake.coor[i - 1];
		
	}
	switch (snake.dir)//头移动
	{
	case RIGHT:
		snake.coor[0].x+=snake.speed;
		if (snake.coor[0].x > 640)
		{
			snake.coor[0].x = 0;
		}
		break;
	case UP:
		snake.coor[0].y-= snake.speed;
		if (snake.coor[0].y < 0)
		{
			snake.coor[0].y = 480;
		}
		break;
	case DOWN:
		snake.coor[0].y+=snake.speed;
		if (snake.coor[0].y > 480)
		{
			snake.coor[0].y = 0;


		}
		break;
	case LEFT:
		snake.coor[0].x-=snake.speed;
		if (snake.coor[0].x < 0)
		{
			snake.coor[0].x = 640;
		}
		break;







	}
	


}

每次调用snakemove函数,让后面每一节等于前面那一节的坐标,就能实现尾巴身体跟着头动,switch中是此时头移动的方向,向哪个方向移动,对应方向上的x坐标或者y坐标就+或者-snake.speed;比如说向左就是对应x-snake.speed,向右就是x+snake.speed;向上就是y-snake.speed;向下就是y+snake.speed;这里为什么有判断语句if,这里是因为当蛇头到达边界位置的话,就可以从相反的边界出来,界面的大小是640*480;比如说蛇向左走,遇到左边界,就把蛇头的x坐标置为640.

主函数变化

int main()
{
	
	gameinit();
	gamedraw();

	while (1)
	{
		gamedraw();
		keycontrol();
		snakemove();
		Sleep(20);
	
	}
	
	return 0;

}

将键盘控制函数和蛇的移动的函数放在while循环里面,因为要无时无刻地获取从键盘上读来地值和蛇的移动,当不加Sleep函数时,蛇跑的特别快,让程序休眠20ms
视频演示

20230921_173904

食物信息结构体定义

struct food
{
	int x;//食物的横坐标
	int y;//食物的纵坐标
	bool flag;//食物是否被吃
	int r;//食物半径
	DWORD color;//食物颜色



}food;

食物信息初始化(修改数据初始化函数)

//数据初始化
void gameinit()
{    //设置随机数种子
	srand((unsigned int)time(NULL));//时间不断变化,
	initgraph(640, 480);//初始化界面
	snake.size = 3;
	snake.speed = 8;
	snake.dir=RIGHT;
	for (int i = 0;i<snake.size;i++)
	{
		snake.coor[i].x = 40-10*i;
		snake.coor[i].y = 10;


	}
	//随机初始化食物的横纵坐标
	food.x = rand() % 640;
	food.y = rand() % 480;
	food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
	food.r = rand() % 10 + 5;
	food.flag = true;
	


}

因为食物的位置,颜色,以及食物的半径要随机生成,必须用到rand函数生成随机数,但rand生成的随机数是不变的,所以要通过srand函数生成随机数种子,食物必须在界面内,所以food.x=rand()%640的话,food.x的范围为0-639,同理food.y,以及RGB的三个参数都是0-255的,所以对256取余数,半径是在0-9之间,在加上5,食物半径就在5-14之间,food.flag 定义的是食物是否被吃掉,没被吃掉就为true,吃掉后food.flag变为false.

蛇吃食物

void eatfood()
{
	if (food.flag&&snake.coor[0].x>=food.x-food.r&&snake.coor[0].x<=food.x+food.r  && snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y + food.r)
	{
		food.flag = false;
		snake.size++;


	}
	if (!food.flag)//食物消失重新生成一个
	{
		food.x = rand() % 640;
		food.y = rand() % 480;
		food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
		food.r = rand() % 10 + 5;
		food.flag = true;



	}




}

如果要吃掉食物用蛇头圆心的坐标等于食物圆心的坐标的话,是不容易吃到食物的,所以只要蛇头的圆心坐标落入以食物圆心做出的外切正方形的范围内的话,就算吃到,对应食物正方形的边界坐标为food.x-food.r(左边界),
food.x+food.r(右边界),food.y+food.r(上边界),food.y-food.r(下边界),只要蛇头圆心落入该范围内就算吃到,吃到的话,food.flag=false;表示食物被吃掉,并且蛇的长度snake.size++;当食物被吃掉后,food.flag=0,此时!food.flag=1;立即生成下一个食物坐标,如果这里判断蛇头是否落在食物范围内时,如果不加&&food.flag的话,蛇吃第一个食物,会由三节直接变成五节【c语言】贪吃蛇,c语言,游戏专区,c语言

绘制食物(修改绘制函数)

void gamedraw()
{
	BeginBatchDraw();
	setbkcolor(RGB(31, 29, 66));//设置背景颜色

	cleardevice();//清空绘图设备


	
	//绘制蛇
	setfillcolor(RED);//设置蛇的颜色
	for (int i = 0; i < snake.size; i++)
	{
		solidcircle(snake.coor[i].x, snake.coor[i].y, 5);


	}
	//绘制食物
	if (food.flag)//如果food.flag==1的话就绘制食物
	{
		solidcircle(food.x, food.y, food.r);
	}

	EndBatchDraw();


}

主函数修改

int main()
{
	
	gameinit();
	gamedraw();

	while (1)
	{
		gamedraw();
		keycontrol();
		snakemove();
		eatfood();//增加的
		Sleep(20);
	
	}
	
	return 0;

}

修改主函数

int main()
{
	
	gameinit();
	gamedraw();

	while (1)
	{
		
		gamedraw();
		keycontrol();
		
		snakemove();
		eatfood();
		Sleep(20);
	
	}
	
	return 0;

}

程序源码

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#define SNAKE_NUM 500
enum DIR  //表示蛇的方向
{
	UP,
	DOWN,
	LEFT,
	RIGHT,
};
struct Snake//蛇结构体
{
	int size;//蛇的节数
	int dir;//蛇的方向
	int speed;//蛇的速度
	POINT coor[SNAKE_NUM];//节数



}snake;
struct food//食物结构体
{
	int x;
	int y;
	bool flag;//食物是否被吃
	int r;//食物半径
	DWORD color;//食物颜色



}food;
//数据初始化
void gameinit()
{
	initgraph(640, 480);
	snake.size = 3;
	snake.speed = 8;
	snake.dir = RIGHT;
	for (int i = 0; i < snake.size; i++)
	{
		snake.coor[i].x = 40 - 10 * i;
		snake.coor[i].y = 10;


	}




}
void gamestop()//空格,游戏暂停
{
	if (_kbhit())
	{
		if (_getch() == ' ')
		{
			while (_getch() != ' ');
		}



	}



}
void gamedraw()//画函数
{
	BeginBatchDraw();
	setbkcolor(RGB(31, 29, 66));//设置背景颜色

	cleardevice();//清空绘图设备


	
	//绘制蛇
	setfillcolor(RED);//设置蛇的颜色
	for (int i = 0; i < snake.size; i++)
	{
		solidcircle(snake.coor[i].x, snake.coor[i].y, 5);


	}
	//绘制食物
	if (food.flag)
	{
		solidcircle(food.x, food.y, food.r);
	}

	EndBatchDraw();


}
void keycontrol()//键盘控制方向
{
	//72 80 75 77

	if (_kbhit())
	{
		switch (_getch())
		{
		case 'w':
		case 'W':
		case 72:
			if (snake.dir != DOWN)
			{
				snake.dir = UP;
			}
			break;
		case 's':
		case 'S':
		case 80:
			if (snake.dir != UP)
			{
				snake.dir = DOWN;
			}
			break;
		case 'a':
		case 'A':
		case 75:
			if (snake.dir != RIGHT)
			{
				snake.dir = LEFT;
			}
			break;
		case 'd':
		case 'D':
		case 77:
			if (snake.dir != LEFT)
			{
				snake.dir = RIGHT;
			}
			break;
		case ' ':
			while (1)
			{
				if (_getch() == ' ')
					return;
			}
			break;











		}
	}




}
void snakemove()//蛇的移动
{
	for (int i = snake.size - 1; i > 0; i--)//身体跟着头移动
	{
		snake.coor[i] = snake.coor[i - 1];

	}
	switch (snake.dir)//头移动
	{
	case RIGHT:
		snake.coor[0].x += snake.speed;
		if (snake.coor[0].x > 640)
		{
			snake.coor[0].x = 0;
		}
		break;
	case UP:
		snake.coor[0].y -= snake.speed;
		if (snake.coor[0].y < 0)
		{
			snake.coor[0].y = 480;
		}
		break;
	case DOWN:
		snake.coor[0].y += snake.speed;
		if (snake.coor[0].y > 480)
		{
			snake.coor[0].y = 0;


		}
		break;
	case LEFT:
		snake.coor[0].x -= snake.speed;
		if (snake.coor[0].x < 0)
		{
			snake.coor[0].x = 640;
		}
		break;
	







	}



}
void eatfood()//吃食物
{
	if (food.flag && snake.coor[0].x >= food.x - food.r && snake.coor[0].x <= food.x + food.r && snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y + food.r)
	{
		food.flag = false;
		snake.size++;


	}
	if (!food.flag)//食物消失重新生成一个
	{
		food.x = rand() % 640;
		food.y = rand() % 480;
		food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
		food.r = rand() % 10 + 5;
		food.flag = true;



	}




}
int main()
{
	
	gameinit();
	gamedraw();

	while (1)
	{
		
		gamedraw();
		keycontrol();
		
		snakemove();
		eatfood();
		Sleep(20);
	
	}
	
	return 0;

}

程序演示

20230921_184525文章来源地址https://www.toymoban.com/news/detail-717150.html

到了这里,关于【c语言】贪吃蛇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言项目实战——贪吃蛇游戏,附源码

    目录          一、在Visual Studio2010上创建C项目 二、对于新建项目的测试 三、贪吃蛇游戏        1.游戏准备         2.游戏界面大小及背景颜色确定         3. 画出食物          4.画蛇且使蛇移动          5.通过按键控制蛇的移动          6.蛇吃食物的问题  

    2024年01月20日
    浏览(37)
  • 用C语言实现经典游戏——贪吃蛇

    目录 1.游戏实现思想 (1)定义蛇对象 (2)食物对象 (3)分数:  (4)初始化蛇 (5)初始化食物 (6)修改控制台光标位置 (7)画出蛇和食物 (8)蛇的移动控制 (9)开始游戏  (10)蛇移动 (11)画墙 (12)去除蛇尾 (13)去除光标 (14)显示分数 (15)加速 2.游戏实

    2024年02月11日
    浏览(40)
  • C语言实战项目-贪吃蛇小游戏

    1.定义蛇对象、食物对象 2.初始化蛇、初始化食物 3.控制流程: ( 1)蛇头和墙壁的碰撞 (2)蛇头和蛇身体碰撞 (3)蛇头和食物碰撞 (4)移动速度增大 4.游戏效果: ( 1)蛇身增长 (2)食物消失 -- 新食物产生 (3)分数累加 (4)移动速度增大 (5)蛇的移动 (6)显示分

    2024年02月19日
    浏览(38)
  • C语言之实现贪吃蛇小游戏篇(2)

    目录 🎇测试游戏test.c 🎇游戏头文件包含函数声明snake.h 🎇游戏实现snake.c 屏幕录制 2023-12-02 204515   ✔✔✔✔✔最后感谢大家的阅读,若有错误和不足,欢迎指正!乖乖敲代码哦!  代码---------→【唐棣棣 (TSQXG) - Gitee.com】 联系---------→【邮箱:2784139418@qq.com】

    2024年02月05日
    浏览(56)
  • C语言从零实现贪吃蛇小游戏

    制作不易,点赞关注一下呗!!! 文章目录 前言 一.  技术要点 二、 WIN32API介绍 三、 贪吃蛇游戏设计与分析         1.游戏开始前的初始化         2.游戏运行的逻辑  总结 当我们掌握链表这样的数据结构之后,我们就可以用它来做一些小项目,比如童年小游戏贪吃蛇

    2024年02月20日
    浏览(37)
  • C语言小项目——小游戏贪吃蛇的实现

    我们可以使用 mode命令来设置控制台的大小,使用title命令来设置控制台标题。 在C语言中调用库函数 system来使用这些作用于控制台的命令 。使用代码如下: 采用该命令后控制台界面大概如下:   控制台坐标系以控制台左上角为原点从上往下y轴坐标增大,从左往右x轴坐标增

    2024年04月27日
    浏览(34)
  • 小游戏贪吃蛇的实现之C语言版

    找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:C语言 目录 游戏前期准备: 设置控制台相关的信息  GetStdHandle GetConsoleCursorInfo  SetConsoleCursorInfo SetConsoleCursorPosition GetAsyncKeyState 贪吃蛇游戏设计与分析  本地化 地图,食物

    2024年04月23日
    浏览(36)
  • 小游戏:人生中写的第一个小游戏——贪吃蛇(C语言)

            小编开了一个关于游戏的专栏,主要是运用easyx图形库进行的。        第一章:人生中写的第一个小游戏——贪吃蛇(C语言)         这个游戏的代码我在gitee上发布了,大家如果不嫌弃,可以进入这个网址进行查看和复制:https://gitee.com/rising-sun-1。      

    2024年02月09日
    浏览(51)
  • c语言及数据结构实现简单贪吃蛇小游戏

    目录 一·贪吃蛇简单介绍: 二·贪吃蛇的实现的开始准备: 2.1:欢迎界面的实现: 2.2地图的绘制: 2.3.1初始化蛇: 2.3.2初始化食物:  三·贪吃蛇的运行操作: 3.1辅助信息的打印: 3.2蛇的下一步移动操作: 3.2.1判断玩家按键情况: 3.2.2下一步遇到食物: 3.2.3下一步不是食物:

    2024年04月27日
    浏览(49)
  • 贪吃蛇游戏C语言破解:成为编程高手的必修课!

    ​                                                                                 个人主页:秋风起,再归来~                                                                                 文章专栏:C语言实战项

    2024年04月25日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包