C语言实现简易贪吃蛇_c语言 贪吃蛇 多个食物_离·i殇的博客-程序员宅基地

技术标签: c语言  学习笔记  

创建一个二维数组,当其中的值为-1时,输出#作为游戏边界,当其中的值为1时,输出@作为蛇头,当其中的值>1时,输出*作为蛇身,当其中的值为-2时,输出F作为食物。   

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define High  20
#define Width 30
int food_x, food_y;												    //食物位置
int canvas[High][Width] = { 0 };								    //游戏区域的大小			
int movedirection;  									            //小蛇的移动方向,1向上,2向下,3向左,4向右
void menu()                                                         //游戏菜单
{
	printf("************************\n");
	printf("*****  1.开始游戏  *****\n");
	printf("*****  0.退出游戏  *****\n");
	printf("************************\n");

}




void gotoxy(int x, int y)										    //将光标移动到(x,y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}


void startup()													    //数据初始化
{
	int i = 0, j = 0;                                               //将数组初始化,以循环进行游戏 
	for (i = 0; i < High; i++)
	{
		for (j = 0; j < Width; j++)
		{
			canvas[i][j] = 0;
		}

	}

	for (i = 0; i < High; i++)                                       //设置边框
	{
		canvas[i][0] = -1;
		canvas[i][Width - 1] = -1;
	}
	for (i = 0; i < Width; i++)                                      //设置边框
	{
		canvas[0][i] = -1;
		canvas[High - 1][i] = -1;
	}
	canvas[High / 2][Width / 2] = 1;                                 //设置蛇头
	for (i = 1; i < 5; i++)                                          //设置蛇身
	{
		canvas[High / 2][Width / 2 - i] = i + 1;
	}    
	movedirection = 1;                                               //初始蛇向上走
	food_x = rand() % (High - 5) + 2;                                //设置食物
	food_y = rand() % (Width - 5) + 2;
	canvas[food_x][food_y] = -2;

}
void show()													    	 //显示画面
{
	gotoxy(0, 0);											         //光标移动到原点,以下重画清屏
	int i = 0, j = 0;
	for (i = 0; i < High; i++)                                   
	{	for (j = 0; j < Width; j++)
		{
			if (canvas[i][j] == 0)
				printf(" ");
			else if (canvas[i][j] == -1)    
				printf("#");                                          //输出边框 
			else if (canvas[i][j] == 1)
				printf("@");                                          //输出蛇头  
			else if (canvas[i][j] > 1)
				printf("*");                                          //输出蛇身  
			else if (canvas[i][j] == -2)
				printf("F");                                          //输出食物
		}
		printf("\n");
	}
	Sleep(100);
}

void game()
{
	void updatewithoutinput();
	void updatewithinput();
	while (1)
	{
		show();												         //显示画面
		updatewithoutinput();								         //与用户输入无关的更新
		updatewithinput();									         //与用户输入有关的更新
	}
}
void movesnake()												     //蛇的移动
{
	int i = 0, j = 0;
	for (i = 1; i < High - 1; i++)
		for (j = 1; j < Width - 1; j++)
			if (canvas[i][j] > 0)
				canvas[i][j]++;


	int oldT_i, oldT_j, oldH_i, oldH_j;
	int max = 0;

	for (i = 1; i < High - 1; i++)
		for (j = 1; j < Width - 1; j++)
			if (canvas[i][j] > 0)
			{
				if (max < canvas[i][j])
				{
					max = canvas[i][j];
					oldT_i = i;
					oldT_j = j;
				}
				if (canvas[i][j] == 2)
				{
					oldH_i = i;
					oldH_j = j;
				}
			}


	int newH_i = 0, newH_j = 0;
	if (movedirection == 1)                                          //蛇向上移  
	{
		newH_i = oldH_i - 1;
		newH_j = oldH_j;
	}    
	if (movedirection == 2)                                          //蛇向下移
	{    
		newH_i = oldH_i + 1;
		newH_j = oldH_j;
	}            
	if (movedirection == 3)                                          //蛇向左移
	{
		newH_i = oldH_i;
		newH_j = oldH_j - 1;
	}
	if (movedirection == 4)                                          //蛇向右移
	{
		newH_i = oldH_i;
		newH_j = oldH_j + 1;
	}
	if (canvas[newH_i][newH_j] == -2)                                //重置食物
	{
		canvas[food_x][food_y] = 0;
		food_x = rand() % (High - 5) + 2;
		food_y = rand() % (Width - 5) + 2;
		canvas[food_x][food_y] = -2;
	}
	else                                                            
		canvas[oldT_i][oldT_j] = 0;

	if (canvas[newH_i][newH_j] > 0 || canvas[newH_i][newH_j] == -1)  //判断游戏是否结束
	{
		printf("游戏结束!\n");
		Sleep(1000);

		int a = 0;
		do														     //选择是否继续游戏
		{
			menu();												     //游戏菜单
			printf("请选择");
			scanf("%d", &a);
			switch (a)
			{
			case 1:
				system("cls");									     //清空屏幕		
				startup();										     //数据初始化
				game();
				break;
			case 0:
				printf("退出游戏");
				break;
			default:
				printf("选择错误,请重新选择");
				break;
			}
		} while (a);
		exit(0);
	}
	else
		canvas[newH_i][newH_j] = 1;

}



void updatewithoutinput()									         //与用户输入无关的更新
{
	movesnake();
}

void updatewithinput()										         //与用户输入有关的更新
{
	char input;

	if (_kbhit())
	{
		input = _getch();
		if (input == 'a')                                           //蛇向左移 
		{
			movedirection = 3;
			movesnake();
		}
		else if (input == 'd')                                      //蛇向右移
		{
			movedirection = 4;
			movesnake();
		}
		else if (input == 'w')                                      //蛇向上移
		{
			movedirection = 1;
			movesnake();
		}
		else if (input == 's')                                      //蛇向下移
		{
			movedirection = 2;
			movesnake();
		}
	}
}

int main()
{
	int a = 0;
	do
	{
		menu();												         //游戏菜单
		printf("请选择");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			startup();										         //数据初始化
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择");
			break;
		}
	} while (a);

	return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_64609927/article/details/123602618

智能推荐

10 个小技巧:快速用 Python 进行数据分析_anaconda 分位数用什么方法表示-程序员宅基地

一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可以节省时间,还可能挽救“生命”。一个小小的快捷方式或附加组件有时真是天赐之物,并且可以成为真正的生产力助推器。所以,这里有一些小提示和小技巧,有些可能是新的,但我相信在下一个数据分析项目中会让你非常方便。Pandas中数据框数据的Profiling过程Profiling(分析器)是一个帮助我们理解数据的过程,..._anaconda 分位数用什么方法表示

【攻防世界】十二、功夫再高也怕菜刀_我是大肥鼠的博客-程序员宅基地

步骤打开所给附件,发现是一个.pcapng结尾的文件,遇事不决直接winhex:发现了wireshark,好家伙直接用wireshark打开,果然是数据包:数据流太多,直接搜索flag关键字(查找分组)发现有的数据包里传输了这几个文件,追踪数据流发现只有php代码啥的,结合题目菜刀,我还以为是往web方向发展了?结果还是我太年轻了。折腾了大半天(说多了都是泪),最后查了师傅们的文章(才知道自己想法错的有多离谱),发现第1150个包有问题,多了一个图片继续追踪tcp流发现图片(jpg.

未能加载文件或程序集“HelperSQL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”-程序员宅基地

在进行2进制保存文档的时候如图1,提示如 图2未能加载文件或程序集“HelperSQL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。举报| 2015-08-20 16:16#行家高质畅答赛火热开赛 !超级豪礼等你来~#

2020年G2电站锅炉司炉作业模拟考试及G2电站锅炉司炉在线考试_工作压力为>5.9mpa的锅炉,两只安全阀中较低的整定压力为()工作-程序员宅基地

题库来源:安全生产模拟考试一点通公众号小程序2020年G2电站锅炉司炉作业模拟考试及G2电站锅炉司炉在线考试,包含G2电站锅炉司炉作业模拟考试答案和解析及G2电站锅炉司炉在线考试练习。由安全生产模拟考试一点通公众号结合国家G2电站锅炉司炉考试最新大纲及G2电站锅炉司炉考试真题汇总,有助于G2电站锅炉司炉怎么考考前练习。1、【判断题】锅炉排污分为:定期排污和表面排污。()(√)2、【判断题】锅炉热损失中,排烟热损失是最大的热损失。()(√)3、【判断题】特种设备作业人员在作..._工作压力为>5.9mpa的锅炉,两只安全阀中较低的整定压力为()工作

echarts饼图属性-程序员宅基地

1、标题移动到右边原本legend: { data:['同龄普通孩子','已具备技能','已泛化技能','已掌握技能','学习中']},改legend: { data:['同龄普通孩子','已具备技能','已泛化技能','已掌握技能','学习中'], orient: 'vertical', //垂直显示 y: 'center', //延Y轴居中 x: 'righ_echarts饼图属性

随便推点

Google Picasa 3网络照片管理新功能-程序员宅基地

根据Google官方博客报道,除了发布Google Chrome浏览器之外,Google最新还同时发布了新版图片管理软件Picasa 3英文版(中文版还依旧是2.7),经过一番试用,我发现Picasa 3有不少值得称赞的亮点。  图片预览功能  Windows XP自带了一个很简陋的图片预览功能,安装最新版本的Picasa3,会替换默认的Windows图片预览,而使用Picasa的图片预

极虎病毒创造四个“之最”-程序员宅基地

极虎病毒是目前为止,集成了各种病毒、***、***下载器、蠕虫特征的超强恶意软件。差不多是若干知名病毒的混合体:传播方式超越熊猫烧香;对杀毒软件的破坏力相当于AV终结者、磁碟机;对系统的破坏力更是始无前例;***者的目标极度贪婪,会下载各种盗号***、流氓软件,偷帐号,弹广告,刷流量,可谓无恶不作。来分析一下极虎病毒创造的四个“之最”:1.传播方式“最”多样:(1)网页挂马传...

ALPHA_8, ARGB_4444, ARGB_8888, RGB_565-程序员宅基地

FROM: http://lovewf.blog.51cto.com/1723922/674236最近学习Api文档,打开Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(int width, int height, Bitmap.Config config)方法里会用到,打开个这个类一看枚举

计算机专业可以考天文学研究生吗,报考南京大学天文系有什么要求?-程序员宅基地

【南京大学考研网 nandakaoyan.com 天文与空间科学学院】 报考南京大学天文系有什么要求?唯一权威的南京大学考研网站为大家提供:报考南京大学天文系有什么要求?,本站由南京大学研究生创办,更多南大考研资讯请关注我们网站的更新!敬请收藏本站。下面是关于报考南京大学天文系要求基本情况:打算报考天文专业的学生应当了解什么是天文学,什么样的学生适合攻读天文专业,在南京大学天文系的学生将学些什么,..._什么专业可以考天文学研究生

UDDI技术概述-程序员宅基地

导读:  UDDI技术概述  UDDI(Universal Description, Discovery and Integration)--统一描述、发现与集成协议标准是一个非常重要的创新。它是第一个由平台提供者、软件开发者、交易市场运营者、电子商务企业和全球商务领头羊为解决B2B 电子商务的发展的局限性而一起提出的跨行业的解决方案, 是一套基于Web的、分布式的、为Web服务提供的

肝了一整天,关于Java数组,你想知道的都在这里!-程序员宅基地

关于Java数组你知道多少?1. 什么是数组数组是一种线性结构的数据结构。线性结构在内存中是连续的,是用来储存同一类型的数据的集合数组特点 :连续 ,每个元素都有下标 ,可以快速查找 ,但是从中间添加,删除就比较麻烦数组本身是引用数据类型,即对象。但是数组可以存储基本数据类型,也可以存储引用数据类型。2.数组的声明在声明数组变量时 , 需要给定数组类型(数组中存储的数据类型必须和数组的类型相同)和数组变量的名字 。//第一种声明方式 //数组类型[] 数组变量名字;int[] a;//第

推荐文章

热门文章

相关标签