#include <curses.h>
#include <stdlib.h>
#include <pthread.h>
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
struct Snake
{
int hang;
int lie;
struct Snake *next;
};
struct Snake *head = NULL;//头和尾巴 全局变量
struct Snake *tail = NULL;
int key;
int dir;
struct Snake food;
void initNcurse()
{
initscr();
keypad(stdscr,1);
}
int hasSnakeNode(int i, int j)//打印蛇身子
{
struct Snake *p;
p = head;
while(p !=NULL){
if(p->hang==i && p->lie==j){
return 1;
}
p = p->next;
}
return 0;
}
void gamePic()//创建贪吃蛇地图
{
int hang;
int lei;
move(0,0);
for(hang=0;hang<20;hang++){
if(hang==0){//打印0行0列至0行19列为"--"
for(lei=0;lei<20;lei++){
printw("--");
}
printw("\n");//打印完换行
}
if(hang>=0 && hang<19){//打印0行-18行的0列和20列为"|"
for(lei=0;lei<=20;lei++){
if(lei==0 || lei==20){
printw("|");
}else if(hasSnakeNode(hang,lei)){
printw("[]");
}else if(hasFood(hang,lie)){
printw("##");
}else{
printw(" ");
}
}
printw("\n");
}
if(hang==19){//打印19行0列至0行19列为"--"
for(lei=0;lei<20;lei++){
printw("--");
}
printw("\n");
printw("Bylonghaiyang,key=%d\n",key);
}
}
}
void addNode()//增加蛇的身子(节点)
{
struct Snake *new =(struct Snake *)malloc(sizeof(struct Snake));
new->next = NULL;
switch(dir){
case UP:
new->hang = tail->hang-1;
new->lie = tail->lie;
break;
case DOWN:
new->hang = tail->hang+1;
new->lie = tail->lie;
break;
case LEFT:
new->hang = tail->hang;
new->lie = tail->lie-1;
break;
case RIGHT:
new->hang = tail->hang;
new->lie = tail->lie+1;
break;
}
tail->next =new;
tail = new;
}
void initSnake()//初始化蛇的身子 2,2
{
struct Snake *p=NULL;
dir = RIGHT;
while(head!=NULL){ //如果贪吃蛇撞墙了释放掉贪吃蛇的内存重新初始化贪吃蛇位置
p = head;
head = head->next;
free(p);
}
head = (struct Snake *)malloc(sizeof(struct Snake));
head->hang =2;
head->lie =2;
head->next = NULL;
tail = head;//先初始化一个节点行列为2 这个节点既是头又是尾
addNode();//增加蛇的身子(节点)
addNode();
addNode();
}
void deleNode()
{
struct Snake *p;
p = head;
head = head -> next;
free(p);
}
void moveSnake()//移动蛇先在原节点增加一个节点,在删除一个节点
{
addNode();
if(hasFood(tail->hang,tail->lie)){
initFood();
}else{
deleNode();
}
if (tail->hang==0 || tail->lie==0 || tail->hang==20 || tail->lie==20){ //判断贪吃蛇是>否撞墙
initSnake();
}
}
void* refreshJieMian()
{
while(1){
moveSnake();
gamePic();
refresh();
usleep(100000);
}
}
void* changeDir()
{
while(1){
key = getch();
switch(key){
case KEY_DOWN:
dir = DOWN;
break;
case KEY_UP:
dir = UP;
break;
case KEY_LEFT:
dir = LEFT;
break;
case KEY_RIGHT:
dir = RIGHT;
break;
}
}
}
void initfood()
{
int x=4;
int y=5;
food.hang = x;
food.lie = y;
x+=2;
y+=2;
}
int hasFood(int i,int j)//打印食物
{
if(food.hang == i && food.lie == j){
return 1;
}
return 0;
}
int main()
{
pthread_t th1; // 创建线程1的标识符
pthread_t th2; // 创建线程2的标识符
initNcurse();
initSnake();
gamePic();
pthread_create(&th1, NULL, refreshJieMian, NULL); // 创建线程1,将其与func1函数关联
pthread_create(&th2, NULL, changeDir, NULL); // 创建线程2,将其与func2函数关联
while(1);
getch();
endwin();
return 0;
}
C语言实现贪吃蛇demo12贪吃蛇的食物位置和位置随机.c
最新推荐文章于 2025-07-23 09:00:03 发布