Discuz! Board

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

2.19 贪吃蛇

[复制链接]

54

主题

66

帖子

574

积分

高级会员

Rank: 4

积分
574
发表于 2023-2-19 17:04:31 | 显示全部楼层 |阅读模式
[C++] 纯文本查看 复制代码
#include <graphics.h>
#include <time.h>
int block[40][30]={0};
int height=600,width=800;
int food_x,food_y;
int wait;
char a[4]={'w','a','s','d'};
struct snake_min
{
    int x,y,color;
};
struct snake_1
{
    char direct;
    int len;
    double v;
    snake_min min[100];
}snake,snake2;
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;
    snake2.v=20;
    snake2.direct='a';
    snake2.len=4;
    for(int i=0;i<snake.len;i++)
    {
        snake.min[i].x=20-i;
        snake.min[i].y=15;
    }
    for(int i=0;i<snake2.len;i++)
    {
        snake2.min[i].x=20+i;
        snake2.min[i].y=10;
    }
    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);
    }
    for(int i=0;i<snake2.len;i++)
    {
        setfillcolor(hsv2rgb(50+10*i%360, 1, 1));
        bar(snake2.min[i].x*20,snake2.min[i].y*20,(snake2.min[i].x+1)*20,(snake2.min[i].y+1)*20);
    }
    setfillcolor(GREEN);
    bar(food_x*20,food_y*20,(food_x+1)*20,(food_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;
    }
    for(int i=snake2.len;i>0;i--)
    {
        snake2.min[i].x=snake2.min[i-1].x;
        snake2.min[i].y=snake2.min[i-1].y;
    }
    int i=rnx(0,3);
    if(i==1||i==3)
    {
    	if(snake2.min[0].x>=38||snake2.min[0].x<=2) i=i+2;
	}
    else if(i==0||i==2)
    {
    	if(snake2.min[0].y>=28||snake2.min[0].y<=2) i=i+2;
	}
    snake2.direct=a[i];
    switch(snake2.direct)
    {
        case 'w':
            snake2.min[0].y=snake2.min[1].y-1;
            snake2.min[0].x=snake2.min[1].x;
            break;
        case 's':
            snake2.min[0].y=snake2.min[1].y+1;
            snake2.min[0].x=snake2.min[1].x;
            break;
        case 'a':
            snake2.min[0].x=snake2.min[1].x-1;
            snake2.min[0].y=snake2.min[1].y;
            break;
        case 'd':
            snake2.min[0].x=snake2.min[1].x+1;
            snake2.min[0].y=snake2.min[1].y;
            break;
    }
}
void update()
{
    wait++;
    snake.v=20-(snake.len-4)/5;
    if(wait==snake.v)
    {
        snake_move();
        wait=1;
    }
    if(kbhit())
    {
        snake.direct=getch();
        snake_move();
    }
}
bool game_over()
{
	if((snake.min[0].x>=40)|| (snake.min[0].x<0)||
	(snake.min[0].y>=30)|| (snake.min[0].y<0))
    {
        return true;
    }
    return false;
}
void food_set()
{
	int flag;
	while(1)
	{
		flag=0;
		food_x=rnx(2,38);
		food_y=rnx(2,28);
		for(int i=0;i<snake.len;i++)
		{
			if(food_x==snake.min[i].x&&food_y==snake.min[i].y)
			{
				flag=1;
				break;
			}
		}
		if(flag==0)
		{
			break;
		}
	}
}
void food_eat()
{
	if(snake.min[0].x==food_x&&snake.min[0].y==food_y)
	{
		snake.len++;
		food_set();
	}
}
int main()
{
    start();
    food_set();
    while(1)
    {
    	if(game_over()) break;
    	food_eat();
        draw();
        update();
    }
    getch();
    return 0;
}
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-2-13 04:49 , Processed in 0.048277 second(s), 26 queries .

Powered by Discuz! X3.4

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

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