Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7691979
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: C/C++

2011-08-20 00:40:32

/*

 * 贪吃蛇

 * 使用C++ncurses函数实现贪吃蛇游戏部分功能

 * 使用键盘的方向键控制蛇的走动

 * 蛇自动按上次移动的方向移动

 * Lzy  2011-8-19

 */

 

#include

#include

#include

#include

 

using namespace std;

 

/* 全局变量*/

int length = 1;         // 蛇长

bool food_flag = false; // 标志食物是否被吃掉

int f_x, f_y;           // 食物的坐标          

deque<int> L;           // 保存蛇头走过的坐标

 

/*

 * 产生食物  改变食物标志变量

 * 食物被吃掉才产生下新食物

 */

void prouctfood(void)       //产生食物

{

    if(food_flag == true)   //判断食物是否已有

        return ;

    do

    {

        f_x = rand()%80;    //随机数行-80

        f_y = rand()%24;    //随机数行-24

        if(f_x>0 && f_y>0)  //行列值不能少于

        {

            food_flag = true;

            break;

        }

    }

    while (1); 

}

 

/*

 * 蛇头的坐标保存至容器首

 * 根据蛇长打印点,从容器中取出n个坐标打印

 * 删除容器中超过蛇长的坐标值

 */

void playgame(int beg_y, int beg_x)

{

    L.push_front(beg_x);        //保存蛇头走过的坐标

    L.push_front(beg_y);

 

    int x, y;

    erase();

    mvprintw(f_y,f_x,"*");  //打印食物光标位置 

   

    for(int i=0; i  //根据蛇长打印节点 

    {

        y = L[i];

        x = L[i+1];

        mvprintw(y,x,"*");          //打印光标位置

    }

    move(beg_y, beg_x);             //光标返回至蛇头

    refresh();                      //

 

    /* 删除其它元素*/

    deque<int>::iterator it_beg, it_end;

    it_beg = L.begin()+length*2;        //找到要删除的元素起始位置

    it_end = L.begin()+L.size();        //找到要删除的元素未尾位置

    L.erase(it_beg, it_end);            //删除元素 

}

 

int main(void)

{

    int ch;

    initscr();      /* 初始化并进入curses模式*/

    cbreak();       /* 行缓冲禁止,传递所有控制信息*/

    keypad(stdscr, true);

    refresh();

 

    /* -24 -79 */  

    int x, col;

    int y, row;

    getmaxyx(stdscr,row,col);           //25(y) 80(x)

   

    /* 光标出现在正中间*/

    y = row/2; x = col/2;       //游戏y 1-25 x 0-80

    move(y, x);

    int flag = 1;               //flag标记上次接收到的方向键1 2 3 4

    halfdelay(5);               //设置输入等待时间为.5

    while((ch = getch()) != KEY_F(1))

    {                                      

        switch(ch)

        {

        case KEY_UP:

          --y; flag = 3; break;

        case KEY_DOWN:

          ++y; flag = 4; break;

        case KEY_RIGHT:

            ++x; flag = 1; break;

        case KEY_LEFT:

            --x; flag = 2; break;

        default:                    //根据上次移动的方向,实现自动移动

            if(flag == 1) ++x; 

            if(flag == 2) --x;

            if(flag == 3) --y;

            if(flag == 4) ++y;

          break;       

        }

 

        if(x<1)     //列减到列首(1),行减一,列至列尾(col-1)

        {x=col-1;y--;}

 

        if(x>=col)  //列加到列尾,行加一,列至列首

            {x=1;y++;}

 

        if(y<1)     //行到达行首(1),行返回行尾(row-1)

            {y = row-1;}

 

        if(y>row-1) //行到达尾返回列首

            y=1;

 

        prouctfood();

        if(f_x == x && f_y == y)        //食物被吃

        {

            length++;                   //蛇长加一

            food_flag = false;          //标志食物已吃

        }

       

        playgame(y, x);    

    }

    endwin();

 

    return 0;

}

 

 NCURSES-Programming-HOWTO-CN.pdf   

 

源码: 贪吃蛇.rar   

注意:编译时要加上 -lncurses 选项指定库名

阅读(4592) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~