贪吃蛇self1

这是我以前写的贪吃蛇游戏,会有三个版本,从简陋到还算可以吧。是我分别花了三个晚上的时间逐步完善的。

第一个版本要试玩的话记得全屏。

这一个版本很简陋,就是刷屏,然后不停输出。

想法我都写在注释里了。

/*
	我们先要生成一条蛇,那就用一个类来存,这个类应该包括蛇头,
	蛇的身子的各个点的坐标,蛇的移动方向,那现在的问题是要在蛇
	尾处增加一段如何处理,(现在想到用一个大的数组储存蛇身就行)
	除了蛇就是随机生成肉,只要按照位置显示到屏幕上就行。
	动态的东西就是如果蛇碰到了肉,就长度加一,碰到墙就游戏结束,
	再来四个键控制移动方向就行。
*/
/*
	所需要的还是显示,时间,随机数生成,即如何受到键盘传过来的信息
*/
/*
	显示现在可以用清屏函数加上printf直接完成
	用GetTickCount返回(retrieve)从操作系统启动所经过(elapsed)的毫秒数
	用srand(time(NULL))和rand()获取随机数
	用kbhit()和getch()检测键盘闯过来的数据
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>

int map[20][167];		//用于显示
int hx[80],hy[80];		//记录蛇身
int x,y;				//肉的位置
int die;
int length;

void setfood()
{
	x=rand()%20;
	y=rand()%167;
	map[x][y]=2;
}

void init()
{
	int i,j,k;
	length=3;
	memset(map,0,sizeof(map));
	for(i=0;i<length;i++)
	{
		hx[i]=0;
		hy[i]=i+2;
		map[0][i+2]=1;
	}
	setfood();
}

void move(char key)
{
	int i,j,k;
	int lx=hx[length-1],ly=hy[length-1];
	if(key=='a')
	{
		hx[length-1]=hx[length-1];
		hy[length-1]=hy[length-1]-1;
		if((map[hx[length-1]][hy[length-1]]==1)||(hx[length-1]==-1||hy[length-1]==-1||hx[length-1]==20||hy[length-1]==167))
		{die=1;return;}
		else
		map[hx[length-1]][hy[length-1]]=1;
	}
	else if(key=='d')
	{
		hx[length-1]=hx[length-1];
		hy[length-1]=hy[length-1]+1;
		if((map[hx[length-1]][hy[length-1]]==1)||(hx[length-1]==-1||hy[length-1]==-1||hx[length-1]==20||hy[length-1]==167))
		{die=1;return;}
		else
		map[hx[length-1]][hy[length-1]]=1;
	}
	else if(key=='w')
	{
		hx[length-1]=hx[length-1]-1;
		hy[length-1]=hy[length-1];
		if((map[hx[length-1]][hy[length-1]]==1)||(hx[length-1]==-1||hy[length-1]==-1||hx[length-1]==20||hy[length-1]==167))
		{die=1;return;}
		else
		map[hx[length-1]][hy[length-1]]=1;
	}
	else if(key=='s')
	{
		hx[length-1]=hx[length-1]+1;
		hy[length-1]=hy[length-1];
		if((map[hx[length-1]][hy[length-1]]==1)||(hx[length-1]==-1||hy[length-1]==-1||hx[length-1]==20||hy[length-1]==167))
		{die=1;return;}
		else
		map[hx[length-1]][hy[length-1]]=1;
	}
	if(hx[length-1]==x&&hy[length-1]==y)
	{
		hx[length]=x;
		hy[length]=y;
		hx[length-1]=lx;
		hy[length-1]=ly;
		map[x][y]=1;
		length++;
		setfood();
	}
	else
	{
		map[hx[0]][hy[0]]=0;
		for(i=0;i<length-2;i++)
		{
			hx[i]=hx[i+1];
			hy[i]=hy[i+1];
		}
		hx[length-2]=lx;
		hy[length-2]=ly;
	}
}

void show()
{
	int i,j;
	system( "cls" );
	for(i=0;i<=20;i++)
		for(j=0;j<=167;j++)
		{
			if(map[i][j]==0)
				printf(" ");
			if(map[i][j]==1)
				printf("*");
			if(map[i][j]==2)
				printf("$");
		}
}

char judge(char key,char lastkey)
{
	if(key=='a'&&lastkey=='d')
		return lastkey;
	else if(key=='d'&&lastkey=='a')
		return lastkey;
	else if(key=='w'&&lastkey=='s')
		return lastkey;
	else if(key=='s'&&lastkey=='w')
		return lastkey;
	else
		return key;
}

int main()
{
	int time=GetTickCount();
	int lasttime=time;
	srand( (unsigned int)GetTickCount() );
	char key='d';
	char lastkey=key;
	init();
	die=0;
	while(1)
	{
		if(kbhit())
		{
			key=getch();
			if(key=='a'||key=='s'||key=='d'||key=='w')
			{
				key=judge(key,lastkey);
				lastkey=key;
				move(key);
				show();
				if(die)
				{
					printf("YOU lose\n");
					break;
				}
			}
		}
		else
		{
			if(GetTickCount()-lasttime<500)
				Sleep(1);
			lasttime=GetTickCount();
			move(lastkey);
			show();
			if(die)
			{
				printf("You lose\n");
				break;
			}
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值