习得:
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 bugstruct 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 nodeaddNode();}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 positionfor(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 maprefresh();//shua xin jie mianusleep(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 changesdir=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 runendwin();getch();return 0;
}