#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 // 向右按键
int kfd = 0;
struct termios cooked, raw;
char dir = KEYCODE_U; // 当前蛇的移动方向
// 获取键盘响应:上、下、左、右键
void* get_dir(void *a)
{
while(1)
{
char c;
tcgetattr(kfd, &cooked); // 得到 termios 结构体保存,然后重新配置终端
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[17][17] = {0}; // 游戏地图
int snake[50] = {133}; // 初始化蛇坐标,游戏开始的时候蛇在(8,5)这个位置
int food = 67; // 食物的坐标,游戏开始的时候在(4,3)这个位置
int len = 1; // 保存蛇的当前长度
// 将 数字 转化为坐标系
void num_to_xy(int num, int *x, int *y)
{
//char *p1=x;
//char *p2=y;
*x = num / 17 ;
*y = num % 17 ;
}
// 更新地图数据
void update_map()
{
int i=0,j;
int xfood,yfood;
num_to_xy(food, &xfood ,&yfood);
int xsnake,ysnake;
int k;
for(i = 0; i < 17; i++ )
{
for(j = 1; j < 17; j++ )
{
if(i == 0 || i == 16 || j == 0 || j == 16)
map[i][j] = '#' ;
else if(i == xfood && j == yfood)
{
map[i][j] = '!'
}
else
map[i][j] = ' ';
}
}
for(k = 0; k < len ; k++)
num_to_xy(snake[k], &xsnake,&ysnake);
for(i = 0; i < 17; i++ )
{
for(j = 1; j < 17; j++ )
{
if(i == x && j == y)
map[i][j] = '*';
}
)
}
// 打印地图
void print_map()
{
//usleep(len / 3 + 1);//睡眠时间
//system("clear");
int i=0,j;
for(i = 0; i < 17; i++ )
{
for(j = 1; j < 17; j++ )
{
if(i == 0 || i == 16 || j == 0 || j == 16)
map[i][j] = '#' ;
}
}
//地图边框
}
// 生成食物
void generate_food(char* food)
{
int x,y;
int k;
srand(time(NULL));
food = rand()%289;
num_to_xy(food ,&x , &y);
while(i == 0 || i == 16 || j == 0 || j == 16)
{
food = rand()%289;
num_to_xy(food ,&x , &y);
}
for(k = 0; k < len ; k++)
{
num_to_xy(snake[0], &xsnake,&ysnake);
if(snake[0] == food)
{
food = rand()%289;
k = 0;
num_to_xy(food,&x,&y)
}
}
}
// 移动蛇
void move_snake()
{
int x,y; // 坐标
num_to_xy(snake[0], &x, &y); // 获取蛇头的坐标
int i, end;
// 判断移动方向
switch (dir)
{
case KEYCODE_U: // 向上移动
x--;
break;
case KEYCODE_D: // 向下移动
x++;
break;
case KEYCODE_L: // 向左移动
y--;
break;
case KEYCODE_R: // 向右移动
y++;
break;
}
end = snake[len - 1];
for(i = len - 1; i > 0; i --)
{
snake[i] = snake[i-1];
}
snake[0] = x*17+y;
if(snake[0] == food)
{
len ++;
snake[len - 1]=len;
}
}
// 判断蛇是否应该存活,如果返回值是1代表应该存活,0代表不应该存活
int isalive()
{
int temp = 1;
int x,y;
int i;
num_to_xy(snake[0], &x, &y);
if(i == 0 || i == 16 || j == 0 || j == 16)
temp = 0;
//查重
for(i = 1; i < len ; i++)
{
if(snake[0]==snake[i])
temp = 0 ;
}
}
int main()
{
// 开启一个线程用于获取键盘的上下左右键响应
pthread_t tid1;
pthread_create(&tid1, NULL, get_dir, NULL);
while(1)
{
// 更新地图数据
update_map();
// 打印地图
system("clear");
print_map();
usleep(500000(len / 3 + 1));//睡眠时间
// 移动蛇
move_snake();
// if (isalive() == 1)
// {
// break;
// }
// }
tcsetattr(kfd, TCSANOW, &cooked);//在程序结束时在恢复原来的配置
printf ("Game Over!\n");
return 0;
}
C语言编写贪吃蛇
猜你喜欢
转载自blog.csdn.net/weixin_43665091/article/details/84592154
今日推荐
周排行