Files

238 lines
3.5 KiB
C
Raw Permalink Normal View History

2025-06-27 00:32:57 +08:00
#include "snake.h"
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
snak_struct *snake_creat(void)
{
snak_struct *s=mymalloc(sizeof(snak_struct));
snake_init(s);
return s;
}
2025-07-05 19:47:28 +08:00
//<2F><>ʼ<EFBFBD><CABC>
2025-06-27 00:32:57 +08:00
void snake_init(snak_struct *s)
{
mymemset(s,0,sizeof(snak_struct));
for(int i=0;i<MAP_X_SIZE*MAP_Y_SIZE;i++)
{
cell_struct *cell=&s->map[i];
cell->next_x=0xff;
cell->next_y=0xff;
}
2025-07-05 19:47:28 +08:00
//̰<><CCB0><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD>Ͻdz<CFBD><C7B3><EFBFBD>
2025-06-27 00:32:57 +08:00
cell_struct *cell=&s->map[0];
cell->next_x=0;cell->next_y=0;cell->type=CELL_TYPE_BODY;
cell=&s->map[1];
cell->next_x=0;cell->next_y=0;cell->type=CELL_TYPE_HEAD;
s->head_x=1;s->head_y=0;
s->tail_x=0;s->tail_y=0;
s->dir=DIR_RIGHT;
snake_food(s);
}
2025-07-05 19:47:28 +08:00
//ɾ<><C9BE>һ<EFBFBD><D2BB>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
void snake_delete(snak_struct *s)
{
if(s)
{
myfree(s);
}
}
2025-07-05 19:47:28 +08:00
//<2F>ҵ<EFBFBD><D2B5>µ<EFBFBD>β<EFBFBD><CEB2>,<2C><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>0<EFBFBD><30>ʧ<EFBFBD><CAA7>
2025-06-27 00:32:57 +08:00
int snake_find_tail_new(snak_struct *s)
{
u8 x=s->tail_x;
u8 y=s->tail_y;
cell_struct *tail=&s->map[y*MAP_X_SIZE+x];
tail->type=CELL_TYPE_AIR;
tail->next_x=0xff;
tail->next_y=0xff;
cell_struct *cell=0;
if(y<MAP_Y_SIZE-1)
{
cell=&s->map[(y+1)*MAP_X_SIZE+x];
if(cell->next_x==x&&cell->next_y==y)
{
s->tail_x=x;
s->tail_y=y+1;
return 1;
}
}
if(y>0)
{
cell=&s->map[(y-1)*MAP_X_SIZE+x];
if(cell->next_x==x&&cell->next_y==y)
{
s->tail_x=x;
s->tail_y=y-1;
return 1;
}
}
if(x>0)
{
cell=&s->map[y*MAP_X_SIZE+(x-1)];
if(cell->next_x==x&&cell->next_y==y)
{
s->tail_x=x-1;
s->tail_y=y;
return 1;
}
}
if(x<MAP_X_SIZE-1)
{
cell=&s->map[y*MAP_X_SIZE+(x+1)];
if(cell->next_x==x&&cell->next_y==y)
{
s->tail_x=x+1;
s->tail_y=y;
return 1;
}
}
return 0;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD>ʳ<EFBFBD><EFBFBD><EFA3AC><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ɹ<EFBFBD>
2025-06-27 00:32:57 +08:00
int snake_grow(snak_struct *s)
{
u8 x=s->tail_x;
u8 y=s->tail_y;
cell_struct *tail=&s->map[y*MAP_X_SIZE+x];
x=tail->next_x;
y=tail->next_y;
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><E2B2BB><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
if(x>=MAP_X_SIZE||y>=MAP_Y_SIZE) return 0;
tail=&s->map[y*MAP_X_SIZE+x];
tail->type=CELL_TYPE_BODY;
s->tail_x=x;
s->tail_y=y;
return 1;
}
2025-07-05 19:47:28 +08:00
//̰<><CCB0><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>һ<EFBFBD><D2BB>,1,<2C>ɹ<EFBFBD><C9B9><EFBFBD>0<EFBFBD><30>ʧ<EFBFBD><CAA7>
2025-06-27 00:32:57 +08:00
int snake_forward(snak_struct *s)
{
u8 x=s->head_x;
u8 y=s->head_y;
cell_struct *cell=&s->map[y*MAP_X_SIZE+x];
2025-07-05 19:47:28 +08:00
//<2F>ѵ<EFBFBD>ǰͷ<C7B0><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
cell->type=CELL_TYPE_BODY;
2025-07-05 19:47:28 +08:00
//û<>ҵ<EFBFBD><D2B5>µ<EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
if(snake_find_tail_new(s)==0) return 0;
2025-07-05 19:47:28 +08:00
//ͷ<><CDB7><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
2025-06-27 00:32:57 +08:00
u8 x_old=x;
u8 y_old=y;
if(s->dir==DIR_RIGHT) x++;
else if(s->dir==DIR_LEFT) x--;
else if(s->dir==DIR_UP) y--;
else if(s->dir==DIR_DOWN) y++;
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD>
2025-06-27 00:32:57 +08:00
if(x>=MAP_X_SIZE||y>=MAP_Y_SIZE)
return 0;
cell_struct *head=&s->map[y*MAP_X_SIZE+x];
if(head->type!=CELL_TYPE_AIR)
{
2025-07-05 19:47:28 +08:00
//ͷ<><CDB7>ײ<EFBFBD><D7B2><EFBFBD>˶<EFBFBD><CBB6><EFBFBD>
2025-06-27 00:32:57 +08:00
if(head->type==CELL_TYPE_FOOD)
{
s->mark++;
head->type=CELL_TYPE_HEAD;
head->next_x=x_old;
head->next_y=y_old;
snake_grow(s);
snake_food(s);
}
else
{
2025-07-05 19:47:28 +08:00
//ײ<><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸʧ<CFB7><CAA7>
2025-06-27 00:32:57 +08:00
return 0;
}
}
else
{
head->type=CELL_TYPE_HEAD;
head->next_x=x_old;
head->next_y=y_old;
}
s->head_x=x;
s->head_y=y;
return 1;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ʳ<EFBFBD><CAB3>,<2C><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʳ<EFBFBD>0<EFA3AC><30><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD>ʳ<EFBFBD><CAB3><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
int snake_food(snak_struct *s)
{
if(s->mark>(MAP_X_SIZE*MAP_Y_SIZE-s->wall_num-10))
return 0;
2025-07-05 19:47:28 +08:00
//ʹ<><CAB9>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
do{
u8 x=((u32)rand())%MAP_X_SIZE;
u8 y=((u32)rand())%MAP_Y_SIZE;
cell_struct *cell=&s->map[y*MAP_X_SIZE+x];
if(cell->type==CELL_TYPE_AIR)
{
cell->type=CELL_TYPE_FOOD;
return 1;
}
} while(1);
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
int snake_run(snak_struct *s)
{
if(snake_forward(s)==0) return 0;
return 1;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
int snake_set_dir(snak_struct *s,int dir)
{
if(s==0) return 0;
if(dir>=1&&dir<=4)
{
s->dir=dir;
return 1;
}
return 0;
}