Liunx下基于ncurses下编写的贪吃蛇小游戏

主要使用的到链表的知识和C语言还有ncurses的部分函数
加深对C语言的使用与链表的使用

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

#define UP     1
#define DOWN  -1
#define LEFT   2
#define RIGHT -2


struct snake//创建贪吃蛇的链表
{
  int hang;
  int lie;
  struct snake *next;
};

struct snake *head = NULL;
struct snake *tail = NULL;
struct snake food;
int key;
int dir;

void initFood()//初始化食物的函数
{
   int  x =rand()%20;//rand()表示随机出现食物的地点,%20 是由于地图大小的限制
   int y = rand()%20;
   
   food.hang = x;
   food.lie  = y;
  
}

int hasFood(int i, int j)
{

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


void initncurses()
{
   initscr();
   keypad(stdscr,1);// 使用方向键必须掉用该函数
                    // 表示从 stdscr 中调取需要的东西,  1 表示必须调用
   noecho();

}

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 gamePic()//设计贪吃蛇游戏的地图
{
   move(0,0);//使地图的起点不会改变,包含在curses头文件中

   int hang;
   int lie;
   for(hang=0;hang<20;hang++)
   {
        if(hang==0)
        {
           for(lie=0;lie<20;lie++)
           {
             printw("--");
           }
          printw("\n");
        }
        if(hang>=0 && hang<=19)
        {
            for(lie=0;lie<=20;lie++)
            {
             if(lie==0 || lie==20 )
              {
                printw("|");
              }
             else if(hasSnakeNode(hang,lie))
              {
                 printw("[]");
              }
             else if(hasFood(hang,lie))
              {
                 printw("##");
              }
             else
              {
               printw("  ");
              }
            }   
          printw("\n");
        }
        if(hang==19)
        {
          for(lie=0;lie<20;lie++)
           {
             printw("--");
           }
          printw("\n");
          printw("by chen xin bo\nkey =%d\nfood.hang=%d  food.lie=%d\n",key,food.hang,food.lie);
        }         
   }
}

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

  new->next = NULL;
  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;


   } 
  
  tail->next = new;
  tail = new;
}

void initSnake()
{
   dir = RIGHT;
 
   struct snake *p;
   while (head != NULL)
    {
      p = head;
      head = head->next;
      free(p);
    }
    
    initFood();

   head = (struct snake *)malloc(sizeof(struct snake));
   head->hang = 1;
   head->lie = 1;
   head->next = NULL;

   tail = head;
   
   addNode();
   addNode();
   addNode();
   addNode();
}

void deleNode()
{
  struct snake *p;
  p = head;
  head =head->next;
  free(p);
}

int ifSnakeDie()
{
  struct snake *p;
  p = head;
  if(tail->hang < 0 || tail->lie == 0 || tail->hang == 20 || tail->lie == 20 )
   {
    return 1;
   }
  
   while(p->next != NULL)
    {
      if(p->hang==tail->hang && p->lie == tail->lie)
       {
         return 1;
       }
      p=p->next;
    }
}


void moveSnake()
{
  addNode();
  if(hasFood(tail->hang,tail->lie))
  {
   initFood();
  }
  else
  {
    deleNode();
  }
  if(ifSnakeDie())
   {
     initSnake();
   }
}

void refreshJieMian()
{
 while(1)
    {
          moveSnake();
          gamePic();
          refresh();//shua xin jie mian 
          usleep(100000);//yan chi shi jian

    }
}


void turn(int direction)
{
     if(abs(dir) != abs(direction))
     {
        dir =direction;
     }
 
}

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;

   initncurses();
   initSnake();
   gamePic();

   pthread_create(&t1, NULL, refreshJieMian, NULL);
   pthread_create(&t2, NULL, changeDir, NULL);

   
   while(1);
  
   getch();   
   endwin();

   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值