运⾏linux游戏程序设计,详解Linux终端下编写“贪吃蛇”游戏⼀、视频游戏如何做
(1)空间:游戏必须在计算机屏幕的特定位置画影像。程序如何控制视频显⽰?
(2)时间:影像以不同的速度在屏幕上移动。以⼀个特定的时间间隔改变位置。程序是如何获知时间并且在特定的时间安排事情的发⽣?
(3)中断:程序再屏幕上平滑移动的物体,⽤户可以在任何时刻产⽣输⼊。程序是如何响应中断的?
(4)同时做⼏件事:游戏必须在保持⼏个物体移动的同时还要响应中断。程序是如何同时做多件事情⽽不被弄得晕头转向的?
⼆、操作系统⾯临着类似的问题
操作系统同样要⾯对这4个问题。内核将程序载⼊内存空间并维护每个程序在内存中所处的位置。在内核的调度下,程序以时间⽚间隔的⽅式运⾏,同时,内核也在特定的时刻运⾏特定的内部任务。内核必须在很短的时间内响应⽤户和外设在任何时刻的输⼊。同时做⼏件事需要⼀些技巧。内核是如何保证数据的有序和规整的?
上⾯的都是那本书上说的,个⼈觉得讲的很好,看完这本后再看那本Linux圣经《Unix环境⾼级编程》或
许更好些。回归正题吧,主要介绍⼀下设计⼀个终端下的贪吃蛇游戏所实现的功能以及所需要的⼏个条件和⼀些函数。
本贪吃蛇实现的功能是通过吃⾷物来增长⾃⼰的长度,可以利⽤按键 'f' 实现加速和 's' 键实现减速, 'q' 键退出,⽅向键控制⽅向,蛇要是碰到⾃⼰的⾝体或者碰到墙或者吃到⼀定数量,那么游戏就结束。功能还是挺简单的吧,下⾯就介绍下各个步骤的设计:
1.⾸先要使⽤终端图形库curses.h⽂件,由于不是C标准库,⼀般电脑不会⾃带,需要⾃⾏下载安装,Ubuntu下可以这么下载 sudo apt-get install libncurses5-dev 已经替换成ncurses.h 即 new curses.h的意思,完全兼容curses。介绍下此游戏需要⽤到的常见的⼏个curses函数。
基本curse函数
initscr()
初始化curses库和tty
endwin()
关闭curses并重置tty
refresh()
刷新屏幕显⽰
mvaddch(y,x,c)
在坐标(y,x)处显⽰字符c
mvaddstr(y,x,str)
在坐标(y,x)处显⽰字符串str
cbreak()
开启输⼊⽴即响应
noecho()
输⼊不回显到屏幕
curs_set(0)
使光标不可见
attrset()
开启图形显⽰模式
keypad(stdscr, true)
开启⼩键盘⽅向键输⼊捕捉⽀持
2.介绍完ncurses图形库,接下来进⾏屏幕绘图,我初始化屏幕效果图见下图所⽰:先是外围边框,然后是蛇“@”和⾷物“*”。废话不多说,上代码吧。
⾸先是头⽂件 snake.h的代码:由于在纯⽂本模式下编程以及本⼈英语⽔平有限,可能有的注释⽐较别扭。
/* Game: snake version: 1.0 date:2011/08/22
* Author: Dream Fly
* filename: snake.h
*/
#define SNAKE_SYMBOL '@' /* snake body and food symbol */
#define FOOD_SYMBOL '*'
#define MAX_NODE 30 /* maximum snake nodes */
#define DFL_SPEED 50 /* snake default speed */
#define TOP_ROW 5 /* top_row */
#define BOT_ROW LINES - 1
#define LEFT_EDGE 0
#define RIGHT_EDGE COLS - 1
typedefstructnode/* Snake_node structure */
{
linux在线编程intx_pos;
inty_pos;
structnode *prev;
structnode *next;
} Snake_Node;
structposition/* food position structure */
{
intx_pos;
inty_pos;
} ;
voidInit_Disp();/* init and display the interface */
voidFood_Disp();/* display the food position */
voidWrap_Up();/* turn off the curses */
voidKey_Ctrl();/* using keyboard to control snake */
intset_ticker(intn_msecs);/* ticker */
voidDLL_Snake_Create();/* create double linked list*/
voidDLL_Snake_Insert(intx,inty);/* insert node */
voidDLL_Snake_Delete_Node();/* delete a node */
voidDLL_Snake_Delete();/* delete all the linked list */
voidSnake_Move();/* control the snake move and judge */
voidgameover(intn);/* different n means different state */
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论