转载请注明出处
这一部分打出的贪吃蛇是不会动的,下一节继续补充讲完代码
先下好curses库(详情点击)
第一部分写好以下几个函数
1)基本的curses函数写在一个函数中;
2)方向初始化函数;
3)蛇身初始化函数;
4)食物初始化函数;
5)检查是否有蛇身的函数;
6)打印游戏界面函数;
7)增加蛇身长度的函数;
8)主函数。
预备工作:
全局变量
node *head,*tail,*food;
int dir;//表示方向时要用到
写好结构体,用链表实现贪吃蛇
typedef struct snakeBodynode { int x; int y; //x,y是坐标 struct snakeBodynode *next;
}node;
头文件以及声明
#include<curses.h> #include<stdlib.h> #include<time.h> #include<malloc.h> #define BOADSIZE 20//边界为20乘20 #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4//上下左右
一)基本函数
void initCurses() { initscr(); noecho(); keypad(stdscr,TRUE); timeout(1); mvprintw(0,0,""); }//具体解释见上面链接
二)方向初始化函数;
void initdir() { dir=RIGHT;
}
假设一开始不向右;
三)蛇身初始化函数;
void InitSnake() { head=tail=(node *)malloc(sizeof(node)); head->x=1; head->y=1; AddNode(); AddNode(); AddNode();
}//初始化位置(1,1 ), 三个AddNode(),长度加三,初始化蛇身长度为4
四)食物初始化函数;
void CreatFood() { food=(node *)malloc(sizeof(node)); srand(time(NULL)); food->x=rand()%BOADSIZE; food->y=rand()%BOADSIZE;
}
//随机出现食物
五)检查是否有蛇身的函数;
int HasSnakeBody(int x,int y) { node *tmp = head; while(tmp!=NULL){ if(tmp->x==x&&tmp->y==y){ return 1; } tmp = tmp->next; } return 0; }
//遍历链表,若此时打印的地方有蛇身,则返回一,为后面打印界面准备
六)打印游戏界面函数;
void SnakeBody() { int i,j; for(j=0;j<BOADSIZE;j++){ if(j==0){ for(i=0;i<BOADSIZE;i++){ printw("--"); } } else if(j==BOADSIZE-1){ for(i=0;i<BOADSIZE;i++){ printw("--"); } } else{ for(i=0;i<=BOADSIZE;i++){ if(i==0){ printw("|"); }else if(i==BOADSIZE){ printw("|"); } else if(HasSnakeBody(i,j)==1){ printw("[]");//蛇身 }else if(food->x==i&&food->y==j){ printw("**");//此处为食物 } else{ printw(" "); } } } printw("\n"); } refresh();
}//打印界面
七)增加蛇身长度的函数
void AddNode() { node *newNode; node *bak; newNode=(node *)malloc(sizeof(node)); tail->next=newNode; bak=tail; tail=newNode; switch(dir){ case UP: tail->x=bak->x; tail->y=bak->y-1; break; case DOWN: tail->x=bak->x; tail->y=bak->y+1; break; case LEFT: tail->x=bak->x-1; tail->y=bak->y; break; case RIGHT: tail->x=bak->x+1; tail->y=bak->y; break; //注意原点(0,0)在左上角,所以这里上下左右要注意(x,y)如何变化 }
}
八)主函数
int main() { initCurses(); initdir(); CreatFood(); InitSnake(); SnakeBody(); while(1);//为了停留在这个界面 endwin(); return 0;
}
汇总:
#include<curses.h> #include<stdlib.h> #include<time.h> #include<malloc.h> #define BOADSIZE 20 #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 typedef struct snakeBodynode { int x; int y; struct snakeBodynode *next; }node; node *head,*tail,*food; int dir; void initCurses() { initscr(); noecho(); keypad(stdscr,TRUE); timeout(1); mvprintw(0,0,""); // endwin(); } void initdir() { dir=RIGHT; } int HasSnakeBody(int x,int y) { // printw("%d ",y); node *tmp = head; while(tmp!=NULL){ if(tmp->x==x&&tmp->y==y){ return 1; } tmp = tmp->next; } return 0; } void AddNode() { node *newNode; node *bak; newNode=(node *)malloc(sizeof(node)); tail->next=newNode; bak=tail; tail=newNode; switch(dir){ case UP: tail->x=bak->x; tail->y=bak->y-1; break; case DOWN: tail->x=bak->x; tail->y=bak->y+1; break; case LEFT: tail->x=bak->x-1; tail->y=bak->y; break; case RIGHT: tail->x=bak->x+1; tail->y=bak->y; break; } } void InitSnake() { head=tail=(node *)malloc(sizeof(node)); head->x=1; head->y=1; AddNode(); AddNode(); AddNode(); } void CreatFood() { food=(node *)malloc(sizeof(node)); srand(time(NULL)); food->x=rand()%BOADSIZE; food->y=rand()%BOADSIZE; } void SnakeBody() { int i,j; for(j=0;j<BOADSIZE;j++){ if(j==0){ for(i=0;i<BOADSIZE;i++){ printw("--"); } } else if(j==BOADSIZE-1){ for(i=0;i<BOADSIZE;i++){ printw("--"); } } else{ for(i=0;i<=BOADSIZE;i++){ if(i==0){ printw("|"); }else if(i==BOADSIZE){ printw("|"); } else if(HasSnakeBody(i,j)==1){ printw("[]"); }else if(food->x==i&&food->y==j){ printw("**"); } else{ printw(" "); } } } printw("\n"); } refresh(); } int main() { initCurses(); initdir(); CreatFood(); // AddNode(); InitSnake(); SnakeBody(); while(1); endwin(); return 0; }