习得:
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;
}