大一学习C语言的时候就想要用Turbo C编写一个视频小游戏出来,种种原因后面搁浅了,现在借着学习Linux系统编程的劲头,编写了一个终端下可以运行的贪吃蛇游戏,其中此视频游戏用到的一些知识和操作系统运行时候的一些简单功能有点类似,引用《Unix/Linux 编程实践教程》(Bruce Molay著)【下载见 http://www.linuxidc.com/Linux/2011-08/41374.htm 】里面所介绍的视频游戏一般的编写以及同操作系统的关系的原文如下: 一、视频游戏如何做 (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
-
- typedef struct node /* Snake_node structure */
- {
- int x_pos;
- int y_pos;
- struct node *prev;
- struct node *next;
- } Snake_Node;
-
- struct position /* food position structure */
- {
- int x_pos;
- int y_pos;
- } ;
- void Init_Disp(); /* init and display the interface */
- void Food_Disp(); /* display the food position */
- void Wrap_Up(); /* turn off the curses */
- void Key_Ctrl(); /* using keyboard to control snake */
- int set_ticker(int n_msecs);/* ticker */
-
- void DLL_Snake_Create(); /* create double linked list*/
- void DLL_Snake_Insert(int x, int y); /* insert node */
- void DLL_Snake_Delete_Node(); /* delete a node */
- void DLL_Snake_Delete(); /* delete all the linked list */
-
- void Snake_Move(); /* control the snake move and judge */
- void gameover(int n); /* different n means different state */