Discuz! Board

 找回密码
 立即注册
查看: 614|回复: 0

2023/3/11贪吃蛇

[复制链接]

15

主题

15

帖子

209

积分

中级会员

Rank: 3Rank: 3

积分
209
发表于 2023-3-11 12:03:03 | 显示全部楼层 |阅读模式
[C++] 纯文本查看 复制代码
# include<bits/stdc++.h>
#include <graphics.h> 
#include <math.h>
#include<time.h> //包含随机数,时间函数                 //包含EGE的头文件
using namespace std;

int wait;
int foodx;
int foody;
int score=0;//分数 
int pass=200;//通道宽度 
int wall_width=50; //宽度 
char ch;
int width =800;
int height =600;
int num;	
int count1,time_count=0;
struct body
{ 
   int x;
   int y;  
};
struct snake
{ 
    int len;//蛇的长度 
    int v;//蛇的速度 
    char direct;//蛇的方向 
    body a[1000];
}s;

struct wallon
{
	float xl,yl;//左上角的坐标 
	float xr,yr;//右下角的坐标 
	float vx;//速度 	
}wall;

float ranx(int min,int max)//随机数产生min到max之间的随机数 
{
	return min+rand()%(max-min);
}

void start()//初始化 
{
    srand(time(0));//随机种子函数
	s.v=20;//x向速度
	s.len=4;//长度 
	s.direct='d';//方向 
	for(int i=0;i<4;i++)
	{
		s.a[i].x=20-i;
		s.a[i].y=15;
	}
	
	
    initgraph(width, height);        //初始化图形界面
    setcolor(RED);  //设置画图线为红色
    setbkcolor(WHITE);//设置背景颜色为白色
    setfillcolor(RED);//设置填充颜色为红色
    setfont(25,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
	setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)	
}

void foodset()
{
	int flag;
	while(1)
	{
	    flag=0;
		foodx=rand()%39;
		foody=rand()%30;
		for(int i=0;i<s.len;i++)	//判断食物和蛇未重叠
		{
			if ((s.a[i].x==foodx)&&(s.a[i].y==foody))
			{
				flag=1;
				break;
			}
		}
		if(flag==0)//如果未重叠 
		{
			break;
		}
		
	}
	
	 
}
void foodeat()
{
		if((s.a[0].x==foodx)&&(s.a[0].y==foody)) 
		{
			s.len++;
			foodset();
			
		}
}

void moveSnake()//移动蛇 
{
	int i;
	for(i=s.len;i>0;i--)
	{
		s.a[i].x = s.a[i-1].x;
		s.a[i].y = s.a[i-1].y;
	}
	
	switch(s.direct)
	{
		case 'w':
		case 'W':
			s.a[0].y--;
			break;
		case 'a':
		case 'A':
			s.a[0].x--;
			
			break;
		case 's':
		case 'S':
			s.a[0].y++;
			
			break;
		case 'd':
		case 'D':
			s.a[0].x++;
			break;
	}	
}


void update()//数据更新 
{
	s.v = 20-(s.len-4)/5; 
	wait++;
	if(wait==s.v)
	{
		wait=0;
		moveSnake();
	}
	
	if(kbhit())
    {
        s.direct=getch();
        moveSnake();
    }
   	
}

void draw()
{
	for(int i=0;i<s.len;i++)
	{
		setfillcolor(hsv2rgb(10*i%360, 1, 1));
		bar(s.a[i].x*20,s.a[i].y*20,s.a[i].x*20+20,s.a[i].y*20+20); 
    }
	setfillcolor(GREEN);
    bar(foodx*20,foody*20,foodx*20+20,foody*20+20); 
    
    xyprintf(20,20,"得分:%d",s.len-4);//格式化输出文字
    //xyprintf(20,40,"得分:%d  %d",foodx,foody);//格式化输出文字
	Sleep(10);
	cleardevice();
	
}
bool gameover()
{
	if(s.a[0].x>=40||s.a[0].x<0||s.a[0].y>=30||s.a[0].y<0)
	{
		return true;
	}
	for(int i=1;i<s.len;i++)
	{
			if((s.a[i].x==s.a[0].x)&&(s.a[i].y==s.a[0].y)) 
			{
				return true;
			}
	}
	return false;
	
}
int main()
{
	start();
	foodset ();
	
	while(1)
    {
		update();
		foodeat();
		draw(); 
		if(gameover())
		{
			break;
		}	
    }
    setfont(100,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
 	xyprintf(200,100,"gameover");//格式化输出文字
     getch();
    return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-5-30 12:32 , Processed in 0.069822 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表