Discuz! Board

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

23.1.14贪吃蛇

[复制链接]

15

主题

19

帖子

4118

积分

论坛元老

Rank: 8Rank: 8

积分
4118

墨海马 Lv:15
发表于 2023-1-14 15:39:44 | 显示全部楼层 |阅读模式
[C] 纯文本查看 复制代码
#include <graphics.h>  //包含EGE的头文件
#include<bits/stdc++.h>
using namespace std;
#include<time.h> //包含随机数,时间函数  

int n;   
int width =800;
int height =600;
int wait=0;
float randx(int min,int max);  
int foodx;
int foody;
struct fangkuai
{
	int x,y;//位置
	int color;//颜色 
};           
struct snake
{
	int len;//蛇的长度 
    char fx;//蛇的方向 
    fangkuai fk[1000];//蛇的身体
    int sd;//蛇的速度 
}ball;

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

}
void draw()//绘制 
{
	for(int i=0;i<ball.len;i++)//蛇 
	{
		setfillcolor(hsv2rgb(10*i%360, 1, 1));//设置填充颜色  参数(颜色,饱和度,明亮度)
        bar(ball.fk[i].x*20,ball.fk[i].y*20,(ball.fk[i].x+1)*20,(ball.fk[i].y+1)*20);
	}
	setfillcolor(GREEN);//食物 
	bar(foodx*20,foody*20,(foodx+1)*20,(foody+1)*20);
	xyprintf(20,20,"得分:%d",ball.len-4);//格式化输出文字
	xyprintf(20,40,"速度:%d",ball.sd);//格式化输出文字
}
void makefood()
{
	while(1)
	{
		int flag=0;
		foodx=randx(1,38);
		foody=randx(1,28);
		for(int i=0;i<ball.len;i++)
		{
			if(foodx==ball.fk[i].x&&foody==ball.fk[i].y)
			{
				flag=1;
				break;
			}
		}
		if(flag!=1)
		{
			break;
		}
	}
}
void eatfood()
{
	if(ball.fk[0].x==foodx&&ball.fk[0].y==foody)
	{
		ball.len++;
		makefood();
	}
}
int dead()
{
	if(ball.fk[0].x>=40||ball.fk[0].x<0||ball.fk[0].y>=30||ball.fk[0].y<0)
	{
		return 0;
	}
	for(int i=ball.len-1;i>0;i--)
	{
		if(ball.fk[0].x==ball.fk[i].x&&ball.fk[0].y==ball.fk[i].y)
		{
			return 0;
		}
	}
	return 1;
}
void snakemove()
{
	for(int i=ball.len;i>0;i--)
	{
		ball.fk[i].x=ball.fk[i-1].x;
		ball.fk[i].y=ball.fk[i-1].y;
	}
	switch(ball.fx)
	{
		case'W':
		case'w':ball.fk[0].x=ball.fk[1].x;
		ball.fk[0].y=ball.fk[1].y-1;
		break;
		case'A':
		case'a':ball.fk[0].x=ball.fk[1].x-1;
		ball.fk[0].y=ball.fk[1].y;
		break;
		case'S':
		case's':ball.fk[0].x=ball.fk[1].x;
		ball.fk[0].y=ball.fk[1].y+1;
		break;
		case'D':
		case'd':ball.fk[0].x=ball.fk[1].x+1;
		ball.fk[0].y=ball.fk[1].y;
		break;
		default:;
	}
}
void update()
{
	wait++;
	ball.sd=50-(ball.len-4)/5;
	if(wait==ball.sd)
	{
		snakemove();
		wait=1;
	}
	if(kbhit())
    {
        ball.fx = getch();
        snakemove();
    }
}

float randx(int min,int max)
{
	float s=(((float)rand())/32767)*(max-min)+min;
	return s;
}
int main()
{
	start();
	makefood(); 
    while(1)
    {    
		update();
		eatfood();
		if(dead()==0)
		{
			break;
		}
		draw(); 
		Sleep(10);
        
		cleardevice();
    } 
    setfont(100,0,"幼圆");
    xyprintf(200,300,"GAME OVER");
     getch();
    return 0;
}

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-5-31 12:34 , Processed in 0.059052 second(s), 27 queries .

Powered by Discuz! X3.4

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

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