分类: 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 选项指定库名