嵌入式Linux编程--贪吃蛇

习得:

1.ncurse库:
    使用ncurse是因为案件响应灵敏,不用回车;头文件#include<curses.h>
   创建.c文件,同时gcc编译也需要添加 -lcurses
   主函数中:

             initscr();//ncurse界面初始化函数
             printw();//ncurse模式下的print
             getch();//等待用户输入,如果没这句话程序就退出了,看不到运行结果
             endwin();//程序退出,调用改函数来恢复shell终端显示,如果没这句话,shell终端字乱码坏掉

2.Linux线程

       程序都是从上到下运行,要想2个同时运行,需要线程;一个程序有多个线程,互不影响
        线程头文件#include<pthread.h>,gcc编译的时候需要添加-lpthread
        运用 :

                pthread_t th1;
               pthread_create(&th1,NULL,func1,null);//func1
为创建的函数,null为函数中的参数
                 //void *func1(),定义的该函数返回值是void*型

3.食物随机,不出边界

rand()函数随机数

不出边界(20x20)rand%20(对随机数取余数)
    

 

4.制作贪吃蛇方向按键
    vi /usr/include/curses.h 查看相应按键编码
    方向头文件,include<curses.h>
    KEY_DOWN ==0402;
    KEY_UP   ==0403;
    KEY_LEFT ==0404;
    KEY_RIGHT==0405;
    :cq退出
 

代码:

#include <stdio.h>
#include <curses.h>
#include <stdlib.h>

#include <pthread.h>

#define UP      1
#define DOWN    -1
#define LEFT    2
#define RIGHT   -2 // jue dui zhi fangxiang bug


struct Snake{
	int hang;
	int lie;
	struct Snake *next;

};

int dir;
int key;
struct Snake *head=NULL;
struct Snake *tail=NULL;

struct Snake food;

void initFood()
{
	int x = rand()%20;
	int y = rand()%20;
	food.hang = x;
	food.lie  = y;


}

void initNcurse(){
	initscr();
	keypad(stdscr,1);
}



void addNode()
{
	struct Snake *new=(struct Snake *)malloc(sizeof(struct Snake));

	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;

	}



	new->next = NULL;
	tail->next = new;
	tail = new;






}




void initSnake()
{
	struct Snake* p;

	dir = RIGHT;

	while(head!=NULL)
	{

		p=head;
		head=head->next;
		free(head);
	}

	initFood();

	head=(struct Snake *)malloc(sizeof(struct Snake));
	head->hang=2;
	head->lie=2;
	head->next=NULL;
	tail=head;

	addNode();//add new node
	addNode();

}



int  hasFood(int i,int j)
{
	if(food.hang==i && food.lie==j){
		return 1;
	}

	return 0;
}







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 GameMap()
{
	int hang;
	int lie;
	move(0,0);//move cursor position
	for(hang=0;hang<20;hang++){

		if(hang==0){
			for(lie=0;lie<=19;lie++){
				printw("--");

			}
			printw("\n");

		}
		for(lie=0;lie<=20;lie++){
			if(lie==0||lie==20){
				printw("|");
			}else if(hasSnakeNode(hang,lie)==1){
				printw("[]");

			}else if(hasFood(hang,lie)==1)
			{
				printw("##");
			}	
			else {
				printw("  ");
			}


		}



		if(hang==19){
			printw("\n");
			for(lie=0;lie<=19;lie++){
				printw("--");

			}
		}
		printw("\n");
	}

	printw("\n");
	printw("by zhou");

}


void deleNode()
{
	head = head->next;

}


int ifSnakeDie()
{
	struct Snake *p;
	p=head;

	if(tail->hang<0||tail->hang==20||tail->lie==0||tail->lie==20)

	{
		return 1;
	}

	while(p->next!= NULL)
	{
		if(p->hang == tail->hang && p->lie == tail->lie ){
			return 1;		
		} 
		p=p->next;

	}
	return 0;
}



void moveSnake()
{
	addNode();

	if(hasFood(tail->hang,tail->lie)){
		initFood();
	}else{	deleNode();
	}


	if(ifSnakeDie()==1)

	{
		initSnake();
	}
}



void* refreshjiemian()//duoxiancheng
{
	while(1){

		moveSnake();
		GameMap();//refresh(shuaxin) the map
		refresh();//shua xin jie mian
		usleep(100000);//wei miao
		//            sleep(1);//refresh every second
	}

}




void turn(int direction)
{
	if(abs(direction)!=abs(dir)){//abs(a)==|a|,if 1!=2,the direction changes
		dir=direction;//jue duizhi != change dir
	}
}
void *changedir()
{
	while(1){
		key=getch();
		switch(key){
			case KEY_DOWN:
				turn(DOWN);
				break;
			case KEY_UP:
				turn(UP);
				break;
			case KEY_LEFT:
				turn(LEFT);
				break;
			case KEY_RIGHT:
				turn(RIGHT);
				break;

		}
	}

}



int main()
{

	pthread_t t1;
	pthread_t t2;

	initNcurse();
	initSnake();
	GameMap();

	pthread_create(&t1,NULL,refreshjiemian,NULL);
	pthread_create(&t2,NULL,changedir,NULL);
	while(1);//keep main xiancheng run

	endwin();

	getch();
	return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值