我罗斯方块最终篇(Interface类)
负责的任务
- 游戏过场及界面设计
- Interface类的基础实现
- 根据队友需求完善Interface类功能
- Interface类的本地测试
- 辅助队友改良游戏操作
代码要点
-
我们主要是通过控制台进行界面渲染
-
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项目地址
代码的实现效果可以在作品展示截图中一一对应(毕竟都是可以看的见的 😂)
-
遇到的问题
(已解决)
-
打印效率与具体实现中屏闪问题
在游戏进行过程中方块和map的打印开始是有两种方案的:一种是在每次方块进行操作后,将map全部清空并分别打印变更后的方块和map;还有一种是在不触及到map的更改的前提下,只对方块进行清除和打印,只有在map变更时才对整体操作。由于第二种方式需要实现的函数较多,所以我们首先尝试了第一种方案,但是发现由于第一种方案高频率地进行方块和map的打印,在操作键盘的过程中,游戏界面会出现类似屏闪的现象,影响玩家游戏体验,所以最后我们采用了第二种方案,减少打印次数,整体游戏效果有了很大提升
-
数组越界以及运用系统函数时参数越界的问题
这个问题是在对单人游戏的初步测试时发现的,是由于我们在进行设计时,map没有为顶部超出游戏池范围、正在下落的方块预留空间,导致初步整合player和interface代码时出现了数组越界和参数越界的问题,具体就表现为单人模式中方块下落的异常。这个问题解决起来其实也很简单,只要对Interface中输出条件加以限制就能够解决问题。
收获与心得
- 由于我这次主要负责Interface类的开发,所以在开发的过程中,了解到了一些有关控制台操作的系统函数和dos指令,包括如何在控制台上定位,如何设置标题,如何改变字符颜色等。其实Interface类从代码上来讲并不复杂,在对于控制台的基本操作有了一定了解后,主要的难点在于界面的设计,如何将自己的设计思路以及队友的需求合理地实现,使得玩家有更加良好的游戏体验。
- 通过这次远程协同开发,体验到了一个小项目从设计、建立框架、完善内容、改进功能、到测试、试玩的全过程,对运用GitHub进行远程开发也有了更深的了解。通过与队友进行交流合作,排除bug,完善游戏功能,提升游戏体验,也是这次合作开发中不错的体验。
- 通过这次开发,对于面向对象的也有了更深刻的认识,例如如何进行面向对象框架的搭建等,通过对于一个小项目的实操,也更能体会到面向过程与面向对象的差别,加深对于理论知识的理解。
依然存在的问题
- 主要问题可能还是在于代码不够简洁,在运行效率方面还有提升的空间,例如类似功能的函数是否可以进行合并等,这是在未来进一步优化中可能需要考虑的。