C语言实现贪吃蛇游戏代码

 更新时间:2022年02月07日 09:52:18   作者:鸿蒙之始  
大家好,本篇文章主要讲的是C语言实现贪吃蛇游戏代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

一、实现效果

键位:使用wasd四个键位来控制方向,按q键退出(注意在终用英文输入法实现键控)

规则:蛇每吃一个豆会得10分,同时身体边长、移速加快

当蛇碰到墙壁或咬到自身时游戏结束,同时会输出游戏得分

二、部分代码解释

(1)用结构体定义蛇和豆

typedef struct Snakes
{
	int x;
	int y;
	struct Snakes *next;
}snake;
 
snake *head,*tail;
 
struct Food
{
	int x;
	int y;
}food;

(2)打印墙壁

void creatgraph()             
{
	int i;
	for (i = 0; i<58; i += 2)//打印上下边框
	{
		gotoprint(i, 0);
		gotoprint(i, 26);
	}
	for (i = 1; i < 26; i++)
	{
		gotoprint(0, i);
		gotoprint(56, i);
	}
	head = (snake*)malloc(sizeof(snake));
	head->x = 16;
	head->y = 15;
	//gotoprint(head->x, head->y);
	tail = (snake*)malloc(sizeof(snake));
	snake *p = (snake*)malloc(sizeof(snake));
	snake *q = (snake*)malloc(sizeof(snake));
	p->x = 16;
	p->y = 16;
	q->x = 16;
	q->y = 17;
	head->next = p;
	p->next = q;
	q->next = tail;
	//gotoprint(p->x, p->y);
	//gotoprint(q->x, q->y);
	tail->next = NULL;
	tail->x = 4;
	tail->y = 2;	
}
 
void gotoxy(int x, int y)
{
	COORD pos;
	HANDLE hOutput;
	pos.X = x;
	pos.Y = y;
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOutput, pos);
}
 
void gotoprint(int x, int y)
{
	gotoxy(x, y);
	printf("■");
}
 
void gotodelete(int x, int y)
{
	gotoxy(x, y);
	printf("  ");
}

(3)生成豆

void creatfood()
{
	srand((int)time(NULL));
	lable:
	food.y = rand() % (25 - 1 + 1) + 1;
	food.x = rand() % (54 - 2 + 1) + 2;
	if (food.x % 2 != 0)
	{
		food.x = food.x+1;
	}
	snake *judge = head;
	while (1)  
	{
		if (judge->next == NULL) break;
		if (food.x == judge->x&&food.y == judge->y)
		{
			goto lable;
		}
		judge = judge->next;
	}
	gotoxy(food.x, food.y);
	printf("⊙");
}

(4)点击控制函数

int ClickControl()
{
	char c;
	while (1)
	{
		if (Judge()==0) return 0;
		if (_kbhit())
		{
			click = _getch();
		}
		MovingBody();
		Eating();
	}
	return 1;
}

(5)移动控制

void MovingBody()
{
	int count = 0;
	int a = head->x, b = head->y;
	snake *p = head;
	while (1)
	{
		if (p->next == NULL) break;
		gotodelete(p->x, p->y);
		count++;
		p = p->next;
	}
	switch (click)
	{
		case up:
			head->y -= 1;
			ChangeBody(a,b);
			break;
		case down:
			head->y += 1;
			ChangeBody(a,b);
			break;
		case left:
			head->x -= 2;
			ChangeBody(a,b);
			break;
		case right:
			head->x += 2;
			ChangeBody(a,b);
			break;
		case stop:
			_getch();
			break;
	}
	p = head;
	while (1)
	{
		if (p->next == NULL) break;
		gotoprint(p->x, p->y);
		p = p->next;
	}
	p = head;
	gotoxy(0, 28);
	if (count <= 10) speed = 150;
	else if (count > 10 && count <= 20) speed = 100;
	else if (count > 20 && count <= 40) speed = 50;
	else speed = 10;
	Sleep(speed);
}

(6)更改蛇身

void ChangeBody(int a,int b)
{
	snake *p = head->next;
	int mid1, mid2,_mid1,_mid2;
	mid1 = p->x;
	mid2 = p->y;
	while (1)
	{
		if (p->next->next == NULL) break;
		
		_mid1 = p->next->x;
		_mid2 = p->next->y;
		p->next->x = mid1;
		p->next->y = mid2;
		mid1 = _mid1;
		mid2 = _mid2; 
		p = p->next;
	}
	p = head->next;
	{
		p->x = a;
		p->y = b;
	}
}

总结

到此这篇关于C语言实现贪吃蛇游戏代码的文章就介绍到这了,更多相关C语言贪吃蛇游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++填坑的重写,重载和隐藏的详解

    C++填坑的重写,重载和隐藏的详解

    这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • c++与c中的数组初始化默认值如何为0

    c++与c中的数组初始化默认值如何为0

    这篇文章主要介绍了c++与c中的数组初始化默认值如何为0问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言循环链表的原理与使用操作

    C语言循环链表的原理与使用操作

    无论是静态链表还是动态链表,有时在解决具体问题时,需要我们对其结构进行稍微地调整。比如,可以把链表的两头连接,使其成为了一个环状链表,通常称为循环链表
    2022-05-05
  • C++获取内存使用情况小结

    C++获取内存使用情况小结

    在程序编程过程中,为了防止出现内存泄漏情况出现,需要持续关注内存程序内存占用情况,本文主要介绍了C++获取内存使用情况小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小(最新推荐)

    使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小(最新推荐)

    这篇文章主要介绍了使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • C++ Boost Tokenizer使用详细讲解

    C++ Boost Tokenizer使用详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • 详解C++编程中的虚函数

    详解C++编程中的虚函数

    这篇文章主要介绍了详解C++编程中的虚函数,包括在什么情况下应当声明虚函数的相关讲解,需要的朋友可以参考下
    2015-09-09
  • C语言实现删除某一个数组值的方法

    C语言实现删除某一个数组值的方法

    这篇文章主要给大家分享C语言数组中删除数组中某个值的方法,既然要学习删除数组中的元素,我们就必须得先知道数组中有哪些元素。同时还要定义一个变量,并将需要删除的元素赋值给那个变量。下面来看看文章的详细内容吧
    2021-11-11
  • C语言中求和、计算平均值、方差和标准差的实例

    C语言中求和、计算平均值、方差和标准差的实例

    这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 利用Debug调试代码解决0xC0000005: 读取位置 0x0000000000000000 时发生访问冲突问题

    利用Debug调试代码解决0xC0000005: 读取位置 0x0000000000000000 时发生访问冲突问

    这篇文章主要介绍了利用Debug调试代码解决0xC0000005: 读取位置 0x0000000000000000 时发生访问冲突,本文给大家分享完美解决方案,需要的朋友可以参考下
    2023-03-03

最新评论