本文介绍在linux下实现一个字符小游戏贪吃蛇的过程,游戏纯C++编写,服务器使用chrono定时器做帧同步,支持所有类unix系统的select函数做非阻塞IO,采用TCP socket通信,协议部分采用protobuf二进制流;客户端使用curses字符界面库。
服务器
服务器实现所有逻辑,服务器只接受客户端的操作(包括上下左右四个方向),服务器的几个主要类为server,snake,zone,time分别用于表示一个房间,蛇,战场,计时器。每一局游戏开始,会实例化一个server,监听一个端口,创建一个游戏房间等待玩家接入,这里使用阻塞IOaccept()
,需要等加入的玩家达到人数才开始游戏。
就绪后,初始化战场,一个房间对应一局比赛,一个战场。zone类给n个接入的玩家随机分配初始位置。一个战场中包含n个snake信息,snake中存了蛇的长度,以链表结构存储蛇的节点便于头尾的增删。snake中保存蛇的移动方向,当每次用户改变蛇的方向时都会改变方向变量,即使接下来不输入也会继续运动。snake中封装了各种移动方法和判定方法,实现吃事物,死亡,复活等操作。