负责的任务

  1. 游戏过场及界面设计
  2. Interface类的基础实现
  3. 根据队友需求完善Interface类功能
  4. Interface类的本地测试
  5. 辅助队友改良游戏操作

代码要点

  • 我们主要是通过控制台进行界面渲染

  • Interface类的代码采用声明与定义分离的形式分别位于interface.h与interface.cpp文件中。

  • Interface类中的函数大致可以分为三部分:

    • 负责与控制台交互的函数(集成一系列系统函数或者对某一具体功能进行封装)

      //初始化窗口
      void initialWindow();
      //定位光标
      void gotoXY(int x, int y);
      //获得标准输出句柄
      Interface(){
      hOut = GetStdHandle(STD_OUTPUT_HANDLE);
      }

      这里具体运用到了头文件windows.h封装的系统函数以及一些对于控制台进行操作的dos指令

      例如:SetConsoleTextAttribute(HANDLE,COLOR);//选定输出文本的颜色

      ​ SetConsoleCursorPosition(hOut, pos);//设置光标位置

      ​ system("cls");//清屏

      ​ system("title 我罗斯"); //设置控制台窗口标题

    • 静态界面绘制函数(负责绘制整体固定的页面)

      //绘制初始封面
      void initialCovor();
      //模式选择静态部分
      void selectPart();
      //初始化单人游戏界面
      void initialViewOnePlayer();
      //初始化双人游戏界面
      void initialViewTwoPlayer();
      //玩家名输入界面
      void getName();
      //游戏结果(单人type为1/双人type为2)
      void gameResult(string name,int score,int type);

      这里主要是对于设计的静态界面运用所学的基础知识进行绘制

    • 效果及游戏功能渲染函数(参与一些游戏具体效果的实现,如模式选择、方块旋转下落、分数更新等)

      void selectKey1();//键位于单人模式输出
      void selectKey2();//键位于双人模式时输出 //为区分两个玩家输出区域将一种功能用两个函数封装
      void printPointPlayer1(int point);//显示玩家1分数
      void printPointPlayer2(int point);//显示玩家2分数
      void printNamePlayer1(string name);//显示玩家1名字
      void printNamePlayer2(string name);//显示玩家2名字
      void drawNextBlock1(Block t);//画下一个方块
      void drawNextBlock2(Block t);
      void drawNowBlock1(Block t,int x,int y);//画现在游戏池内的方块
      void drawNowBlock2(Block t,int x,int y);
      void deleteBlock1();//将游戏池中已打印方块消除
      void deleteBlock2();
      void refreshBlock1(int x,int y,Block temp);//更新移动前方块信息
      void refreshBlock2(int x,int y,Block temp);
      void clearMap1(int map[20][10]);//将游戏池清空
      void clearMap2(int map[20][10]);
      void printMap1(int map[20][10]);//打印游戏池
      void printMap2(int map[20][10]);
      //void player1Victory();//玩家1胜利效果
      //void player2Victory();//玩家2胜利效果
      //void clearVictory1();//消除玩家1胜利标志
      //void clearVictory2();//消除玩家2胜利标志

      这里由于在界面中输出位置不同,大量函数用1和2加以区分。

      例如为了实现模式选择中选定效果随上下键移动的功能,void selectKey1();void selectKey2();两个函数分别负责输出已经设计好的“单人模式”与“双人模式”字样。

      PS. 具体的函数实现可见github项目地址

      代码的实现效果可以在作品展示截图中一一对应(毕竟都是可以看的见的 )

遇到的问题

(已解决)

  1. 打印效率与具体实现中屏闪问题

    在游戏进行过程中方块和map的打印开始是有两种方案的:一种是在每次方块进行操作后,将map全部清空并分别打印变更后的方块和map;还有一种是在不触及到map的更改的前提下,只对方块进行清除和打印,只有在map变更时才对整体操作。由于第二种方式需要实现的函数较多,所以我们首先尝试了第一种方案,但是发现由于第一种方案高频率地进行方块和map的打印,在操作键盘的过程中,游戏界面会出现类似屏闪的现象,影响玩家游戏体验,所以最后我们采用了第二种方案,减少打印次数,整体游戏效果有了很大提升

  2. 数组越界以及运用系统函数时参数越界的问题

    这个问题是在对单人游戏的初步测试时发现的,是由于我们在进行设计时,map没有为顶部超出游戏池范围、正在下落的方块预留空间,导致初步整合player和interface代码时出现了数组越界和参数越界的问题,具体就表现为单人模式中方块下落的异常。这个问题解决起来其实也很简单,只要对Interface中输出条件加以限制就能够解决问题。

收获与心得

  1. 由于我这次主要负责Interface类的开发,所以在开发的过程中,了解到了一些有关控制台操作的系统函数和dos指令,包括如何在控制台上定位,如何设置标题,如何改变字符颜色等。其实Interface类从代码上来讲并不复杂,在对于控制台的基本操作有了一定了解后,主要的难点在于界面的设计,如何将自己的设计思路以及队友的需求合理地实现,使得玩家有更加良好的游戏体验。
  2. 通过这次远程协同开发,体验到了一个小项目从设计、建立框架、完善内容、改进功能、到测试、试玩的全过程,对运用GitHub进行远程开发也有了更深的了解。通过与队友进行交流合作,排除bug,完善游戏功能,提升游戏体验,也是这次合作开发中不错的体验。
  3. 通过这次开发,对于面向对象的也有了更深刻的认识,例如如何进行面向对象框架的搭建等,通过对于一个小项目的实操,也更能体会到面向过程与面向对象的差别,加深对于理论知识的理解。

依然存在的问题

  • 主要问题可能还是在于代码不够简洁,在运行效率方面还有提升的空间,例如类似功能的函数是否可以进行合并等,这是在未来进一步优化中可能需要考虑的。

我罗斯方块最终篇(Interface类)的更多相关文章

  1. 我罗斯方块最终篇(Player类、Game类)

    我罗斯方块最终篇(Player类.Game类) |--------------------项目GitHub地址--------------------| 目录 我罗斯方块最终篇(Player类.Gam ...

  2. 我罗斯方块最终篇(Block类)

    负责的任务 完善Block类的相关函数及变量: 对Block类中函数进行调整改进,并于其他人负责的类相互配合: 对Block类的函数功能进行调试: github项目地址. 效果图 具体可见总篇,一下仅 ...

  3. 我罗斯方块第二次作业(Block类)

    负责任务 完善Block类的相关函数及变量: 对Block类的函数功能进行调试: github项目地址. 开发日记 2020.5.11 今天和朋友们讨论了如何分工的工作,我负责的部分是Block类的完 ...

  4. 我罗斯方块第二次作业(Player类)

    我罗斯方块第二次作业 我的任务 完成player类的编写 player类的测试 我的计划 类的设计: Player类作为一个玩家类,需要处理和玩家有关的所有信息,以及维护玩家的游戏页面map.关于玩家 ...

  5. #企业项目实战 .Net Core + Vue/Angular 分库分表日志系统六 | 最终篇-通过AOP自动连接数据库-完成日志业务

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  6. 12.5.3 UNIVERSAL:最终的祖先类:

    <pre name="code" class="html">12.5.3 UNIVERSAL:最终的祖先类: 你可以把 UNIVERSAL 看作最终 ...

  7. 杂谈PID控制算法——最终篇:C语言实现51单片机中的PID算法

    真遗憾,第二篇章没能够发表到首页上去.趁热打铁.把最终篇——代码篇给发上来. 代码的设计思想请移步前两篇文章 //pid.h #ifndef __PID__ #define __PID__ /*PID ...

  8. 【Unity|C#】基础篇(3)——类(class)/ 接口(interface)

    [学习资料] <C#图解教程>(第4~7章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu ...

  9. (转载)OC学习篇之---类的延展

    前一篇文章我们介绍了类的类目概念和使用,那么这篇文章我们继续来介绍一下OC中的一个特性:延展. 其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前 ...

随机推荐

  1. Web项目自动打开并且全屏

    前言 在项目当中,有些需要开机自动打开并且还要全屏.通过总结,得到以下结论:大致方法一样(IE.火狐.谷歌支持),个别的只是命令不同,以火狐浏览器为例. 浏览器全屏打开指定网页设置方法 新建浏览器快捷 ...

  2. 数值分析:幂迭代和PageRank算法

    1. 幂迭代算法(简称幂法) (1) 占优特征值和占优特征向量 已知方阵\(\bm{A} \in \R^{n \times n}\), \(\bm{A}\)的占优特征值是量级比\(\bm{A}\)所有 ...

  3. Salesforce 生命周期管理(一)应用生命周期浅谈

    本篇参考: https://trailhead.salesforce.com/en/content/learn/trails/determine-which-application-lifecycle ...

  4. PAT (Basic Level) Practice (中文)1017 A除以B (20分)

    1017 A除以B (20分) 本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立. 输入格式: 输入在一 ...

  5. 更好的 java 重试框架 sisyphus 背后的故事

    sisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活. 今天,让我们一起看一下西西弗斯背后的故事. 情景导入 简单的需求 产品经理:实现一个 ...

  6. 微信小程序的登录流程

    一.背景 传统的web开发实现登陆功能,一般的做法是输入账号密码.或者输入手机号及短信验证码进行登录 服务端校验用户信息通过之后,下发一个代表登录态的 token 给客户端,以便进行后续的交互,每当t ...

  7. 【数据结构与算法Python版学习笔记】图——基本概念及相关术语

    概念 图Graph是比树更为一般的结构, 也是由节点和边构成 实际上树是一种具有特殊性质的图 图可以用来表示现实世界中很多有意思的事物,包括道路系统.城市之间的航班.互联网的连接,甚至是计算机专业的一 ...

  8. HTML中的emment

    emment的优点和使用方法: 优点:Emment是前端开发者必备的工具,使用它可以大大提高前端开发效率. 使用方法:Emment的使用方法非常简单,直接在编辑器上输入HTML和CSS代码的缩写,然后 ...

  9. 2019OO第四单元作业总结&OO课程整体总结

    第四单元作业总结 第四单元的作业主题是UML图的解析,通过对UML图代码的解析,我对UML图的结构以及各种元素之间的关系的理解更加深入了. ------------------------------ ...

  10. Vue el 使用el-checkbox-group复选框进行单选框操作

    el-checkbox-group这个组件与其他复选框不一样,我当初也是半天不知道怎么操作 页面使用v-model绑定 size就是等比例缩小放大,v-ror循环应该看的懂.重要的是@chage到我们 ...