Discuz! Board

 找回密码
 立即注册
查看: 402|回复: 2

1.13 贪吃蛇

[复制链接]

54

主题

66

帖子

574

积分

高级会员

Rank: 4

积分
574
发表于 2023-1-13 19:05:12 | 显示全部楼层 |阅读模式
[C++] 纯文本查看 复制代码
#include <graphics.h>
#include <time.h>
int block[40][30]={0};
int height=600,width=800;
struct snake_min
{
	int x,y,color;
};
struct snake_1
{
    char direct;
	int len;
    double v;
    snake_min min[100];
}snake;
float rnx(int min,int max)
{
    float t;
    t=rand()%(max-min)+min;
    return t;
}
void start()
{
	snake.v=20;
	snake.direct='d';
	snake.len=4;
	for(int i=0;i<snake.len;i++)
	{
		snake.min[i].x=20-i;
		snake.min[i].y=15;
	}
    initgraph(width, height);
    setcolor(BLACK);
    setbkcolor(WHITE);
    setfillcolor(RED);
    srand(time(0));
}
void draw()
{
	for(int i=0;i<40;i++)
	for(int j=0;j<30;j++)
	{
    	setfillcolor(WHITE);
		bar(i*20,j*20,(i+1)*20,(j+1)*20);
	}
	for(int i=0;i<snake.len;i++)
	{
		setfillcolor(hsv2rgb(10*i%360, 1, 1));
        bar(snake.min[i].x*20,snake.min[i].y*20,(snake.min[i].x+1)*20,(snake.min[i].y+1)*20);
	}
	Sleep(10);
	cleardevice();
}
void snake_move()
{
	for(int i=snake.len;i>0;i--)
	{
		snake.min[i].x=snake.min[i-1].x;
		snake.min[i].y=snake.min[i-1].y;
	}
	switch(snake.direct)
	{
		case 'w':
			snake.min[0].y=snake.min[1].y-1;
			snake.min[0].x=snake.min[1].x;
			break;
		case 's':
			snake.min[0].y=snake.min[1].y+1;
			snake.min[0].x=snake.min[1].x;
			break;
		case 'a':
			snake.min[0].x=snake.min[1].x-1;
			snake.min[0].y=snake.min[1].y;
			break;
		case 'd':
			snake.min[0].x=snake.min[1].x+1;
			snake.min[0].y=snake.min[1].y;
			break;
	}
}
void update()
{
	if(kbhit())
    {
        snake.direct=getch();
		snake_move();
    }
	
}
int main()
{
	start();
	while(1)
	{
		draw();
		update();
	}
	getch();
	return 0;
}
回复

使用道具 举报

54

主题

66

帖子

574

积分

高级会员

Rank: 4

积分
574
 楼主| 发表于 2023-1-13 19:05:32 | 显示全部楼层
[C++] 纯文本查看 复制代码
#include <graphics.h>
#include <time.h>

#define Block_szie 20
#define Width 40 
#define Height 30 

int Blocks[Height][Width]={0};//记录所有游戏数据
char direct;//方向 
int snake_len,snake_v;
int food_x,food_y;
int gameover;
int wait;

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

void startup()//启动 
{
	snake_len =4;	
	for(int i=0;i<snake_len;i++)
	{
		Snake[i].x=Width/2-i;
		Snake[i].y=Height/2;
	}
	direct = 'd';
 	snake_v = 20;
 	
 	srand(time(0));//随机种子函数 
	initgraph(Width*Block_szie, Height*Block_szie, INIT_RENDERMANUAL);				//初始化图形界面
	setcolor(BLACK);	//设置画图线为红色 
	setbkcolor(WHITE);//设置背景颜色为白色
	setfillcolor(LIGHTGRAY);//设置填充颜色为浅灰色 
	
	setfont(20,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
	setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
}
 
void show()//显示 
{
	int i,j;
	cleardevice();
	//背景 
	for(i=0;i<Width;i++)
	for(j=0;j<Height;j++)
	{
		//setcolor(WHITE);	//设置画图线为白色
		setfillcolor(WHITE);//设置填充颜色为浅灰色 
		bar(i*Block_szie,j*Block_szie,(i+1)*Block_szie,(j+1)*Block_szie);
	}
	//蛇 
	for(i=0;i<snake_len;i++)
	{
		setfillcolor(hsv2rgb(10*i%360, 1, 1));//设置填充颜色  参数(颜色,饱和度,明亮度) 
		bar(Snake[i].x*Block_szie,Snake[i].y*Block_szie,(Snake[i].x+1)*Block_szie,(Snake[i].y+1)*Block_szie);
	}
	//食物 
	setfillcolor(GREEN);//设置填充颜色 
	bar(food_x*Block_szie,food_y*Block_szie,(food_x+1)*Block_szie,(food_y+1)*Block_szie);
	
	xyprintf(20,20,"得分:%d",snake_len-4);//格式化输出文字
	xyprintf(20,40,"速度:%d",21-snake_v);//格式化输出文字
	Sleep(10);
}

void update()//数据更新 
{
	wait++;
	snake_v = 20-(snake_len-4)/5; 
	if(wait == snake_v)
	{
		moveSnake();
		wait = 1;
	}
	
	if(kbhit())
	{
		direct = getch();
		moveSnake();
	}
} 

void food_set()
{
	int flag;
	while(1)
	{
		flag = 0;//食物坐标有效 
		//将食物的横纵坐标的大小限定在窗口大小内 
        food_x=rand()%(Width-2)+1;
        food_y=rand()%(Height-2)+1;
        
        //如果食物出现在蛇上,重新产生食物 
        for(int i=0;i<snake_len;i++)
		{
            if((food_x==Snake[i].x)&&(food_y==Snake[i].y))
            {
            	flag = 1; 
            	break;
			}     
        }
        //食物不在蛇上,打印食物,结束循环 
        if(flag == 0)
		{
            break;  
        }
	}
}

void eat_food()
{
	if((Snake[0].x==food_x)&&(Snake[0].y==food_y))
	{
		snake_len++;
		food_set();
	}
}

bool game_over()//1结束
{
	if((Snake[0].x>=Width)|| (Snake[0].x<0) ||
		(Snake[0].y>=Height)|| (Snake[0].y<0))
	{
		return true;
	}
	for(int i=1;i<snake_len;i++)
	{
		if((Snake[i].x==Snake[0].x)&&(Snake[i].y==Snake[0].y))
		return true;
	}
	return false;
	
} 


int main()
{
	startup();
	food_set();
	getch();
	while(1)
	{
		show();
		update();
		eat_food();
		if(game_over()) break;
	}
	
	getch();
	return 0;
} 


回复

使用道具 举报

54

主题

66

帖子

574

积分

高级会员

Rank: 4

积分
574
 楼主| 发表于 2023-1-13 19:07:20 | 显示全部楼层
[C++] 纯文本查看 复制代码
#include <graphics.h>
#include <time.h>

#define Block_szie 20
#define Width 40 
#define Height 30 

int Blocks[Height][Width]={0};//记录所有游戏数据
char direct;//方向 
int snake_len,snake_v;
int food_x,food_y;
int gameover;
int wait;

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

void startup()//启动 
{
	snake_len =4;	
	for(int i=0;i<snake_len;i++)
	{
		Snake[i].x=Width/2-i;
		Snake[i].y=Height/2;
	}
	direct = 'd';
 	snake_v = 20;
 	
 	srand(time(0));//随机种子函数 
	initgraph(Width*Block_szie, Height*Block_szie, INIT_RENDERMANUAL);				//初始化图形界面
	setcolor(BLACK);	//设置画图线为红色 
	setbkcolor(WHITE);//设置背景颜色为白色
	setfillcolor(LIGHTGRAY);//设置填充颜色为浅灰色 
	
	setfont(20,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
	setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
}
 
void show()//显示 
{
	int i,j;
	cleardevice();
	//背景 
	for(i=0;i<Width;i++)
	for(j=0;j<Height;j++)
	{
		//setcolor(WHITE);	//设置画图线为白色
		setfillcolor(WHITE);//设置填充颜色为浅灰色 
		bar(i*Block_szie,j*Block_szie,(i+1)*Block_szie,(j+1)*Block_szie);
	}
	//蛇 
	for(i=0;i<snake_len;i++)
	{
		setfillcolor(hsv2rgb(10*i%360, 1, 1));//设置填充颜色  参数(颜色,饱和度,明亮度) 
		bar(Snake[i].x*Block_szie,Snake[i].y*Block_szie,(Snake[i].x+1)*Block_szie,(Snake[i].y+1)*Block_szie);
	}
	//食物 
	setfillcolor(GREEN);//设置填充颜色 
	bar(food_x*Block_szie,food_y*Block_szie,(food_x+1)*Block_szie,(food_y+1)*Block_szie);
	
	xyprintf(20,20,"得分:%d",snake_len-4);//格式化输出文字
	xyprintf(20,40,"速度:%d",21-snake_v);//格式化输出文字
	Sleep(10);
}

void update()//数据更新 
{
	wait++;
	snake_v = 20-(snake_len-4)/5; 
	if(wait == snake_v)
	{
		moveSnake();
		wait = 1;
	}
	
	if(kbhit())
	{
		direct = getch();
		moveSnake();
	}
} 

void food_set()
{
	int flag;
	while(1)
	{
		flag = 0;//食物坐标有效 
		//将食物的横纵坐标的大小限定在窗口大小内 
        food_x=rand()%(Width-2)+1;
        food_y=rand()%(Height-2)+1;
        
        //如果食物出现在蛇上,重新产生食物 
        for(int i=0;i<snake_len;i++)
		{
            if((food_x==Snake[i].x)&&(food_y==Snake[i].y))
            {
            	flag = 1; 
            	break;
			}     
        }
        //食物不在蛇上,打印食物,结束循环 
        if(flag == 0)
		{
            break;  
        }
	}
}

void eat_food()
{
	if((Snake[0].x==food_x)&&(Snake[0].y==food_y))
	{
		snake_len++;
		food_set();
	}
}

bool game_over()//1结束
{
	if((Snake[0].x>=Width)|| (Snake[0].x<0) ||
		(Snake[0].y>=Height)|| (Snake[0].y<0))
	{
		return true;
	}
	return false;
	
} 


int main()
{
	startup();
	food_set();
	getch();
	while(1)
	{
		show();
		update();
		eat_food();
		if(game_over()) break;
	}
	
	getch();
	return 0;
} 


回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-7-18 07:45 , Processed in 0.067212 second(s), 26 queries .

Powered by Discuz! X3.4

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

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