手把手教你写linux系统下贪吃蛇(一)
转载请注明出处这一部分打出的贪吃蛇是不会动的,下一节继续补充讲完代码先下好curses库(详情点击)第一部分写好以下几个函数1)基本的curses函数写在一个函数中;2)方向初始化函数;3)蛇身初始化函数;4)食物初始化函数;5)检查是否有蛇身的函数;6)打印游戏界面函数;7)增加蛇身长度的函数;8)主函数。预备工作: ...
转载请注明出处
这一部分打出的贪吃蛇是不会动的,下一节继续补充讲完代码
先下好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;
}
更多推荐
所有评论(0)