# Flappy Bird **Repository Path**: bupt_xyg/flappy-bird ## Basic Information - **Project Name**: Flappy Bird - **Description**: 玩鸟 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 0 - **Created**: 2021-05-06 - **Last Updated**: 2025-08-15 ## Categories & Tags **Categories**: games **Tags**: None ## README # Flappy Bird 这是来自北京邮电大学大二学生xyg和yy和zh的c++期末大作业Flappy Bird ## 类 以下的类是完全解耦的,相互不依赖的,只需要将`hpp文件`引入自己的代码中即可。如果有同学想要使用以下的功能可以直接通过`#include "foo.hpp"`将这些文件引入自己的项目。 例如引入`Bird类`和`Controller类` `#include "flappy_bird/Bird.hpp"`即可 ### Bird `Bird`类的实例都拥有一个唯一的`id`,且`id`不可更改。 #### construct ```c++ Bird bird; Bird bird(0,0,1,1,'%'); Bird bird = Bird(0,0,1,1,'%'); // 参数依次为: x,y,w,h,symbol ``` #### interface ##### get_* get_*系列的接口提供了获取`Bird`实例的对应属性的手段。 ###### get_id() ###### get_x() ###### get_y() ###### get_w() ###### get_h() ###### get_symbol() ##### set_* set_*系列的接口提供了设置`Bird`实例的对应属性的手段。 ###### set_x(fbint) ###### set_y(fbint) ###### set_w(fbint) ###### set_h(fbint) ###### set_symbol(fbint) ##### operator operator系列的接口提供了对`Bird`的`_x`和`_y`属性进行运算的手段。 ###### add_x(fbint) ###### add_y(fbint) ```c++ Bird bird; bird.add_y(1); // 下降1格 bird.add_y(-1); // 上升1格 bird.add_x(1); // 前进1格 bird.add_x(-1); // 后退1格 ``` ### Controllor(Class) #### construct ```c++ Controller controller; Controller controller('W','A','S','D'); Controller controller = Controller('W','A','S','D'); ``` #### interface ##### bind(Bird&) 当你希望使用`Controller`类的实例来控制`Bird`类实例时,你需要将`Bird`类的实例通过`Controller.bind`将其绑定在`Controller`实例上。 * 一个`Controller`的实例可以绑定多个`Bird`实例 * 当将一个`Bird`重复绑定在同一个`Controller`实例上时`bind`会返回`false`表示绑定失败 * 同一个`Bird`实例可以被绑定在多个`Controller`实例上 ```c++ #include Controller ctrl1; Controller ctrl2; Bird bird1; Bird bird2; //同一个Controller实例可以绑定多个Bird实例 ctrl1.bind(bird1); ctrl1.bind(bird2); //一个Bird实例可以绑定到多个Controller实例 ctrl1.bind(bird1); ctrl2.bind(bird1); //一个Bird实例不能多次绑定同一个Controller实例 //下例将会输出`绑定失败` if (ctrl1.bind(bird1)) std::cout << "绑定成功" << std::endl; else std::cout << "绑定失败" << std::endl; ``` ##### action_* action_*系列的接口提供了手动触发被绑定`Bird`实例动作的手段。 ###### action_jump() ###### action_down() ###### action_forward() ###### action_backward() ##### trigger() trigger()将会监听`Controller`实例设置的按键是否被按下,并触发相应的动作。 ```c++ #include Bird bird1; Bird bird2; Controller ctrl('W','J','D','A'); if (control1.bind(test1)) std::cout << bird1.get_id() <<":bind success" << std::endl; if (control1.bind(test2)) std::cout << bird2.get_id() <<":bind success" << std::endl; while (1) { control1.trigger(); } ``` ### Map(Class) ### Menu(Class) ### Rank(Class) *`Rank`类是一个容器类,用于存储玩家的分数排名,`Rank`内部总是保持有序(降序)的状态,`Rank`的实例总是**会在被析构时将数据保存回原文件处。*** * `Rank`容器总是在进行具体运算时会先将自己变为有序状态. * `Rank`容器需要具有规定项的json文件来进行实例化. * `Rank`容器会在被析构时将数据保存回`原json文件`处. #### construct `Rank`容器实例化时需要一个`json文件`的路径参数. ```c++ using rank = flappy_bird::Rank; using element = flappy_bird::element; rank data("foo.json"); ``` #### json项 可以用来实例化`Rank`容器的json文件的数据项具有以下特点。 * 必须有项`"data_count" : int`来指明该`Rank`容器具有数据数目. * 有`"1"`到`"$data_count"`的`object`,且每个`object`具有`"name":string`和`"score":int`项。 以下为一个合法的json文件的内容 ```json { "data_count": 7, "1": { "name": "zzy", "score": 190 }, "2": { "name": "xyg", "score": 100 }, "3": { "name": "yy", "score": 90 }, "4": { "name": "xyg", "score": 70 }, "5": { "name": "xyg", "score": 20 }, "6": { "name": "crh", "score": 10 }, "7": { "name": "xyg", "score": 10 } } ``` #### interface ##### append 该方法用于向`Rank`容器中添加数据项,且数据项为`element`类型 ```c++ using rank = flappy_bird::Rank; using element = flappy_bird::element; rank data; //隐式的添加 data.append({10,"xyg"}); data.append({20,"yy"}); //显式的通过element类型添加 data.append(element({100,"wkh"})); //链式的添加 data.append({10,"xyg"}) .append({20,"ycy"}); ``` ##### 序列化方法 ###### dump `dump`方法可以将`Rank`容器按照固定格式进行序列化. * `dump`具有一个可选的参数`int count`用于指定最大的序列化的数据项目条数. * `dump`序列化后的数据总是有序的. ```c++ rank data("foo.json"); cout << data.dump() << endl; cout << data.dump(5) << endl; ``` > * dump(5) > > No.1 zzy: 190 > No.2 xyg: 100 > No.3 yy: 90 > No.4 xyg: 70 > No.5 xyg: 70 > > * dump() > > No.1 zzy: 190 > No.2 xyg: 100 > No.3 yy: 90 > No.4 xyg: 70 > No.5 xyg: 70 > No.6 xyg: 20 > No.7 xyg: 20 > No.8 crh: 10 > No.9 xyg: 10 > No.10 xyg: 10 ##### 数据的存储 `Rank`容器使用`json文件`进行实例化,同时也会在`Rank`容器被析构时将`Rank`容器中的数据重新存储到`json文件`中. * `Rank`容器**只有**在析构时才会完成数据的存储. ```c++ using pd = flappy_bird::Rank; using element = flappy_bird::element; pd data("foo.json"); data.append({10,"xyg"}); data.append({70,"xyg"}); data.append(element({20,"xyg"})); ``` > foo.json 运行前 > > ```json > { > "1": { > "name": "zzy", > "score": 190 > }, > "2": { > "name": "xyg", > "score": 100 > }, > "3": { > "name": "yy", > "score": 90 > }, > "4": { > "name": "xyg", > "score": 20 > }, > "5": { > "name": "crh", > "score": 10 > }, > "data_count": 5 > } > ``` > foo.json 运行后 > > ```json > { > "1": { > "name": "zzy", > "score": 190 > }, > "2": { > "name": "xyg", > "score": 100 > }, > "3": { > "name": "yy", > "score": 90 > }, > "4": { > "name": "xyg", > "score": 70 > }, > "5": { > "name": "xyg", > "score": 20 > }, > "6": { > "name": "crh", > "score": 10 > }, > "7": { > "name": "xyg", > "score": 10 > }, > "data_count": 7 > } > ```