C实现程序(数组实现)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <signal.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#define KEYCODE_U 0x41
#define KEYCODE_D 0x42
#define KEYCODE_L 0x44
#define KEYCODE_R 0x43
#define LEN 17
int kfd = 0;
struct termios cooked, raw;
char dir = KEYCODE_U;
void* get_dir(void *a)
{
while(1)
{
char c;
tcgetattr(kfd, &cooked);
memcpy(&raw, &cooked, sizeof(struct termios));
raw.c_lflag &=~ (ICANON | ECHO);
raw.c_cc[VEOL] = 1;
raw.c_cc[VEOF] = 2;
tcsetattr(kfd, TCSANOW, &raw);
if(read(kfd, &c, 1) < 0)
{
perror("read():");
exit(-1);
}
tcsetattr(kfd, TCSANOW, &cooked);
dir = c;
}
}
unsigned char map[LEN][LEN] = {0};
unsigned char snake[100] = {133};
unsigned char food = 67;
int len = 1;
unsigned char generate_food();
void num_to_xy(unsigned char num, unsigned char *x, unsigned char *y)
{
*x=num/16;
*y=num%16;
}
void update_map()
{
int i,j;
for(j=0;j<LEN;j++)
{
map[0][j]='#';
map[LEN-1][j]='#';
}
for(i=1;i<LEN;i++)
{
map[i][0]='#';
map[i][LEN-1]='#';
}
for(i=1;i<LEN-1;i++)
{
for(j=1;j<LEN-1;j++)
{
map[i][j]=' ';
}
}
unsigned char x,y;
num_to_xy(snake[0],&x,&y);
map[y][x]='@';
for(i=1;i<50;i++)
{
if(snake[i]>0)
{
num_to_xy(snake[i],&x,&y);
map[y][x]='*';
}
}
unsigned char x_food,y_food;
num_to_xy(food,&x_food,&y_food);
map[y_food][x_food]='$';
}
void print_map()
{
int i;
int j;
for(i=0;i<LEN;i++)
{
for(j=0;j<LEN;j++)
{
printf("%2c",map[i][j]);
}
printf("\n");
}
}
unsigned char generate_food()
{
srand(time(NULL));
food=rand()%256;
int i;
for(i=0;i<100;i++)
{
while(food==snake[i])
food=rand()%256;
}
unsigned char x_food,y_food;
num_to_xy(food,&x_food,&y_food);
while(0==x_food||0==y_food)
food=rand()%256;
return food;
}
void move_snake()
{
unsigned char x,y;
num_to_xy(snake[0], &x, &y);
unsigned char x_food,y_food;
num_to_xy(food, &x_food, &y_food);
switch (dir)
{
case KEYCODE_U:
if()
y--;
if(x==x_food&&y==y_food)
{
len++;
int i;
for(i=1;i<len;i++)
{
snake[len-i]=snake[len-i-1];
}
snake[0]=x*16+y;
generate_food();
}
else
{
int i;
for(i=1;i<len+1;i++)
{
snake[len-i]=snake[len-i-1];
}
snake[0]=x*16+y;
}
break;
case KEYCODE_D:
y++;
if(x==x_food&&y==y_food)
{
len++;
int i;
for(i=1;i<len;i++)
{
snake[len-i]=snake[len-i-1];
}
snake[0]=x*16+y;
generate_food();
}
else
{
int i;
for(i=1;i<len+1;i++)
{
snake[len-i]=snake[len-i-1];
}
snake[0]=x*16+y;
}
break;
case KEYCODE_L:
x--;
if(x==x_food&&y==y_food)
{
len++;
int i;
for(i=1;i<len;i++)
{
snake[len-i]=snake[len-i-1];
}
snake[0]=x*16+y;
generate_food();
}
else
{
int i;
for(i=1;i<len+1;i++)
{
snake[len-i]=snake[len-i-1];
}
snake[0]=x*16+y;
}
break;
case KEYCODE_R:
x++;
if(x==x_food&&y==y_food)
{
len++;
int i;
for(i=1;i<len;i++)
{
snake[len-i]=snake[len-i-1];
}
snake[0]=x*16+y;
generate_food();
}
else
{
int i;
for(i=1;i<len+1;i++)
{
snake[len-i]=snake[len-i-1];
}
snake[0]=x*16+y;
}
break;
}
}
int isalive()
{
unsigned char x,y;
num_to_xy(snake[0], &x, &y);
int i;
for(i=1;i<len;i++)
{
if(snake[0]==snake[i]);
return 1;
}
if(0==x||0==y)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
pthread_t tid1;
pthread_create(&tid1, NULL, get_dir, NULL);
while(1)
{
update_map();
print_map();
move_snake();
if (isalive() == 1)
{
break;
}
if(len<5)
{
usleep(500000);
}
else
{
usleep(500000/(len-4));
}
system("clear");
}
tcsetattr(kfd, TCSANOW, &cooked);
printf ("Game Over!\n");
return 0;
}