贪吃蛇游戏

学习C语言也差不多学完了想做一个游戏,而贪吃蛇和俄罗斯方块都是非常经典的游戏,在网上也找到了许多相关的参考资料,便动手做了,这个游戏室控制台版的

游戏流程图

函数模块


函数名


函数功能


CursorPosition


光标定位函数


CreateSnake


蛇初始化函数


ShowWall


显示墙体


UpdateSnake


更新界面上的蛇体、分数、等级、食物


CollisionDetection


判断蛇是否咬到自己


RandFood


随机产生食物


Move


控制方向

程序代码

#include <stdio.h>
#include<windows.h>
#include<conio.h>
#include<time.h>

#define CWALL   printf("■")//代替墙体符号
#define CSNAKE1 printf("●")//代替蛇头符号
#define CSNAKE  printf("○")//代替蛇身符号
#define CFOOD   printf("◇")//代替食物符号

//蛇结构
struct Snake
{
	int x,y;//坐标
	Snake *next;//蛇身体(结点)
};

//全局变量
int Food;
int Food_x;//食物坐标X
int Food_y;//食物坐标Y

int Direction;//方向变量(1:上  2:左  3:下  4:右)

int Grade;//等级(速度)

int Score;//得分

//蛇头节点
Snake* snake1 =(Snake*)malloc(sizeof(Snake));

//光标坐标定位函数
void CursorPosition(int x,int y)
{
	COORD pos;//坐标结构

	pos.X = x-1;//x坐标
	pos.Y = y-1;//y坐标

	//得到控制台的输出句柄
	HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);

	//将坐标设置成光标的坐标
	SetConsoleCursorPosition(Out,pos);
}

//蛇初始化创建函数
void CreatSnake()
{
	//蛇身体结点
	Snake* snake2= (Snake*)malloc(sizeof(Snake));

	//蛇头的坐标
	snake1->x=13;
	snake1->y=5;

	//蛇身体的坐标
	snake2->x=11;
	snake2->y=5;

	//将蛇身体接到蛇头后
	snake1->next=snake2;

	//清空蛇身体的指针域
	snake2->next=NULL;
}

//显示墙体
void ShowWall()
{
	int i;

	//列墙体
	for(i=2;i<=24;++i)
	{
		CursorPosition(1,i);
		CWALL;

		CursorPosition(61,i);
		CWALL;

		CursorPosition(79,i);
		CWALL;
	}

	//行墙体
	for(i=1;i<=80;i+=2)
	{
		CursorPosition(i,1);
		CWALL;

		CursorPosition(i,24);
		CWALL;
	}

}

//更新界面上的蛇体、分数、等级、食物
void UpdateSneak()
{
	Snake *p;

	p=snake1;

	CursorPosition(p->x,p->y);//将光标移到蛇头上
	CSNAKE1;//打印蛇头

	p=p->next;

	while(p!=NULL)
	{
		CursorPosition(p->x,p->y);//将光标移到蛇身体的位置上
		CSNAKE;//显示蛇身体

		p=p->next;
	}

	CursorPosition(Food_x,Food_y);//将光标移到食物的位置上
	CFOOD;//显示食物

	CursorPosition(67,16);//将光标移到显示分数的位置上
	printf("得分: %d\n",Score);//显示分数

	CursorPosition(67,19);//将光标移到显示游戏等级的位置上
	printf("等级: %d\n",Grade);//显示游戏等级
}

//判断蛇是否碰到墙或者咬到自己
int CollisionDetection()
{
	Snake *p;

	p=snake1->next;

	//通过蛇头的横坐标和纵坐标判断蛇是否碰到墙
	if(snake1->x==1||snake1->x==61||snake1->y==1 || snake1->y==24)
	{
		return 1;
	}

	//通过蛇头的坐标和蛇身体的坐标判断蛇是否咬到自己
	while(!(p->x == snake1->x && p->y == snake1->y))
	{
		if(p->next==NULL)
		{
			return 0;
		}

		p=p->next;
	}

	return 1;
}

//随即产生食物
void RandFood()
{
	if(Food==0)
	{
		//随机种子(用于生成变化的随机数)
		srand((int)time(0));

		//通过食物的横坐标使得食物在游戏区域内
		Food_y = rand() % 20 + 3;

		//通过食物的纵坐标使得食物在游戏区域内
		int temp = rand() % 56 + 3;

		if(temp % 2 == 0)//当食物的纵坐标为0时
		{
			Food_x = temp + 1;//纵坐标加1
		}
		else
		{
			Food_x = temp;
		}

		Food=1;
	}
}

//移动控制
void Move();

//游戏流程
void Game()
{
	while(1)
	{
		//当蛇咬到自己或者撞到墙
		if(1 == CollisionDetection())
		{
			return;//退出循环
		}

		//当按键盘上的上时
		if(GetAsyncKeyState(VK_UP) && Direction!=3)
		{
			Direction=1;
			goto start;
		}

		//当按键盘上的左时
		if(GetAsyncKeyState(VK_LEFT) && Direction!=4)
		{
			Direction=2;
			goto start;
		}

		//当按键盘上的下时
		if(GetAsyncKeyState(VK_DOWN) && Direction!=1)
		{
			Direction=3;
			goto start;
		}

		//当按键盘上的右时
		if(GetAsyncKeyState(VK_RIGHT) && Direction!=2)
		{
			Direction=4;
			goto start;
		}

start:
		RandFood();//随机生成食物

		Move();//移动贪吃蛇

		UpdateSneak();//更新游戏中的数据

		Sleep(330-Grade*30);//控制贪吃蛇移到的速度
	}
}
//----------------------------------------------------------------------------
void main()
{
	while(1)
	{
		Score=0;

		Grade=0;

		Direction=4;

		system("cls");

		CursorPosition(30,12);
		printf("输入游戏等级:[1-10]\n");

		CursorPosition(38,14);
		printf("__\b\b");

		scanf("%d",&Grade);

		while(Grade<1 || Grade>10)
		{
			system("cls");

			CursorPosition(30,12);
			printf("输入游戏等级:[1-10]\n");

			CursorPosition(38,14);
			printf("__\b\b");

			scanf("%d",&Grade);
		}

		system("cls");

		ShowWall();//显示墙体

		CreatSnake();//创建一条贪吃蛇

		UpdateSneak();//更新游戏中的数据

		Game();

		system("cls");

		CursorPosition(29,12);
		printf("你输了!  得 %d 分\n",Score);

		CursorPosition(29,14);
		printf("按任意键继续/退出(q)\n");

		if(getch()=='q')
		{
			exit(1);
		}
		else
		{
			continue;
		}
	}
}

//-----------------------------------------------------------------------------
void Move()
{
	Snake* q;

	//定义一个临时结点
	Snake* temp = (Snake*)malloc(sizeof(Snake));

	if(1 == Direction)//向上移动
	{
		//当蛇头碰倒食物时
		if((snake1->x == Food_x) && (snake1->y ==Food_y+1))
		{
			//将临时结点的坐标变为食物坐标
			temp->x=Food_x;
			temp->y=Food_y;

			//将蛇头挂到临时结点的后面
			temp->next=snake1;

			//临时结点变成头结点(临时结点变成蛇头)
			snake1=temp;

			Food=0;//标志位,标志食物被蛇吃了

			//计算分数,分数分数的增加数为游戏的等级数
			Score+=(1*Grade);
		}
		else
		{
			//要移动的方向向上(Windows中的坐标左上角为坐标原点,没有负数)
			temp->x = snake1->x;
			temp->y = snake1->y-1;

			//将蛇头接到新蛇头后面
			temp->next=snake1;

			//body1表示蛇头
			snake1=temp;

			//遍历结点到蛇尾
			q=snake1;
			while((q->next)->next !=NULL)
			{
				q=q->next;
			}

			//将光标移到蛇尾
			CursorPosition((q->next)->x,(q->next)->y);
			printf(" ");

			//去掉蛇尾,并且释放蛇尾结点的内存
			free(q->next);
			q->next=NULL;
		}
	}

	if(Direction==2)//向左移动
	{
		//当蛇头碰倒食物时
		if((snake1->x == Food_x+2) && (snake1->y == Food_y))
		{
	      //将临时结点的坐标变为食物坐标
			temp->x=Food_x;
			temp->y=Food_y;

	       //将蛇头挂到临时结点的后面
			temp->next=snake1;

	       //临时结点变成头结点(临时结点变成蛇头)
			snake1=temp;

			Food=0;//标志位,标志食物被蛇吃了

	        //计算分数,分数分数的增加数为游戏的等级数
			Score+=(1*Grade);
		}
		else
		{
			temp->x=snake1->x-2;
			temp->y=snake1->y;
			temp->next=snake1;
			snake1=temp;

			//遍历结点到尾结点
			q=snake1;
			while((q->next)->next!=NULL)
			{
				q=q->next;
			}

			//将光标移到蛇尾
			CursorPosition((q->next)->x,(q->next)->y);
			printf(" ");

			//去掉蛇尾,并且释放蛇尾结点的内存
			free(q->next);
			q->next=NULL;
		}

	}

	if(Direction==3)//向下移动
	{
		//当蛇头碰倒食物时
		if((snake1->x == Food_x) && (snake1->y == Food_y-1))
		{
			//将临时结点的坐标变为食物坐标
			temp->x=Food_x;
			temp->y=Food_y;

			//将蛇头挂到临时结点的后面
			temp->next=snake1;

			//临时结点变成头结点(临时结点变成蛇头)
			snake1=temp;

			Food=0;//标志位,标志食物被蛇吃了

			//计算分数,分数分数的增加数为游戏的等级数
			Score+=(1*Grade);
		}
		else
		{
			//要移动的方向向下(Windows中的坐标左上角为坐标原点,没有负数)
			temp->x=snake1->x;
			temp->y=snake1->y+1;

			//将蛇头接到新蛇头后面
			temp->next=snake1;

			//body1表示蛇头
			snake1=temp;

			//遍历结点到尾结点
			q=snake1;
			while((q->next)->next!=NULL)
			{
				q=q->next;
			}

			//将光标移到蛇尾
			CursorPosition((q->next)->x,(q->next)->y);
			printf(" ");

			//去掉蛇尾,并且释放蛇尾结点的内存
			free(q->next);
			q->next=NULL;
		}
	}

	if(Direction==4)//向右移动
	{
		//当蛇头碰倒食物时
		if((snake1->x == Food_x-2) && (snake1->y == Food_y))
		{
			//将临时结点的坐标变为食物坐标
			temp->x=Food_x;
			temp->y=Food_y;

			//将蛇头挂到临时结点的后面
			temp->next=snake1;

			//临时结点变成头结点(临时结点变成蛇头)
			snake1=temp;

			Food=0;//标志位,标志食物被蛇吃了

			//计算分数,分数分数的增加数为游戏的等级数
			Score+=(1*Grade);
		}
		else
		{
			temp->x=snake1->x+2;
			temp->y=snake1->y;
			temp->next=snake1;
			snake1=temp;

			//遍历结点到蛇尾
			q=snake1;
			while((q->next)->next!=NULL)
			{
				q=q->next;
			}

			//将光标移到蛇尾
			CursorPosition((q->next)->x,(q->next)->y);
			printf(" ");

			//去掉蛇尾,并且释放蛇尾结点的内存
			free(q->next);
			q->next=NULL;
		}
   }
}

执行结果:

单击此处下载贪吃蛇



贪吃蛇游戏,布布扣,bubuko.com

时间: 2024-12-10 09:25:10

贪吃蛇游戏的相关文章

JS贪吃蛇游戏

<!DOCTYPE html><html> <head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <title>JS贪吃蛇游戏</title>    <style>    * {        margin: 0;    

用Java开发贪吃蛇游戏

贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始提示:按空格键开始游戏 让蛇动起来:监听Timer事件,平移数据 实现游戏暂停 实现转向功能 Part 3: 添加食物 吃掉食物 添加死亡条件 实现“重新开始”功能 添加分数和长度 游戏图纸如下: 蛇及游戏框的素材如下:                              Snake主类: 1

Qt版贪吃蛇游戏

Qt版贪吃蛇游戏 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 最近在学习Qt,用了一个多月的时间掌握了Qt中最基本的知识,也完成了<Qt版音乐播放器>.<Qt版贪吃蛇游戏>.<Qt版双人俄罗斯方块>以及<Qt版科学计算器>等,之前在VC下写过这些程序,所以在Qt下只是改变了显示等语句,我写过<C++版贪吃蛇游戏>.<VC版贪吃蛇游戏>,当时将与显示等无关的东西封装起来,在Qt下直接用,只

【141030】VC++贪吃蛇游戏源码(Win32+API)

不错的贪吃蛇游戏,运用了Win32的API.完整源代码,在VS2005下编译通过.内附有编程要点,很好的学习范例. 游戏源码下载地址:点击下载

结对-开发贪吃蛇游戏-开发环境搭建过程

项目:贪吃蛇游戏开发 环境搭建: Mac下: 1)官网下载jkd1.8版本. 2)下载IDE--eclipse或Myeclipse win下: 1)官网下载JDK,找到符合自己电脑的版本,下载的本地 2)下载IDE--eclipse或Myeclipse 3)配置环境变量: i.计算机->属性->高级系统设置 ii.单击高级系统设置->环境变量在系统变量里面分别设置JAVA_HOME.CLASSPATH和Path iii.在系统变量里找变量名JAVA_HOME,如果没有就点击新建.输入变量

WebGL实现HTML5的3D贪吃蛇游戏

js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围. 自己写不出来,站在巨人肩膀总是有机会吧,想起<基于HTML5的电信网管3D机房监控应用>这篇提到的threejs,babylonjs和Hightopo的几种基于WebGL的3D引擎,突然想挑战下自己实现个100行JS的3D小

贪吃蛇 游戏

结队作业  结队人 郑丁鹏(负责 (二)流程图和(四)游戏测试 ) 我负责 (二)游戏需求分析 与(三)游戏代码 贪吃蛇游戏程序设计 一.基本内容描述 运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块.移动时必须从蛇头开始,也就是蛇尾不能改作蛇头.当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体.图形的实现是从蛇头的新位置开始画出蛇.用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单! 可以实现如下功能: 贪吃蛇游

基于控制台实现贪吃蛇游戏

1).引言 学习编程,我个人觉得最好的办法就是根据自己的水平不断的给自己设定一个小目标.而这个小目标就是一个有意思的项目,通过完成这个项目,对自己的成果(也包括失败的)进行分析总结,从中提炼出对应的技术并分享出来,不断的往复,如此,为的就是让我们永远保持编写程序的兴趣和热情,完了,还提高我们的技术.而本文就是总结自己的一个小目标(基于控制台实现的贪吃蛇游戏而写的总结) 2).技术实现 大家小时候一定玩过贪吃蛇的游戏.贪吃蛇游戏的控制过程其实也不复杂.简单的可以概括为以下4个部分. 1.1  .组

做一个简单的贪吃蛇游戏

这是一个贪吃蛇游戏,你可以忽略他的外表,好了,先上html代码 <style type="text/css"> * {margin: 0;padding: 0;} #container {width: 1000px;height: 550px;border: 1px solid #000;margin: 0 auto;} #container #ground {width: 1000px;height: 500px;background-color:#eeeeee;posi