C语言实现贪吃蛇demo12贪吃蛇的食物位置和位置随机.c

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值