我罗斯开发日记

概要

​ ​ 这一段时间我主要负责interface类设计与测试

​ ​ 这篇文章主要是按照时间顺序叙述开发过程及过程中遇到的问题

​ ​ 详细代码见github项目地址

开发日记

1.实现控制台窗口初始化

​ ​ 参考资料:C++ 控制台基本操作控制台字体颜色

​ ​ 首先是查找了一些有关于windows.h和控制台基本操作相关的函数,对于如何初始化界面有了初步了解,然后运用其中合适的函数进行界面的初始化

​ ​ 这里主要涉及到:

    COORD size = {100, 30};//坐标结构体(标定缓冲区大小)
    SetConsoleScreenBufferSize(hOut, size);//更改指定缓冲区大小
    SMALL_RECT rect = {0, 0, 99, 29};
    SetConsoleWindowInfo(hOut, true, &rect);//设置控制台窗口信息
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};//设置光标参数信息(0代表光标不可见)
    SetConsoleCursorInfo(hOut, &cursor_info);//设置光标不可见
    SetConsoleTitle("我罗斯");//设置控制台窗口标题

​ ​ 值得注意的是这些有关控制台的函数都需要先获得句柄才能操作

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄

2.用gotoXY函数实现光标的移动

​​ ​ 这里需要运用到SetConsoleCursorPosition()对于光标信息进行设置

3.实现两种模式静态界面的绘制(单人与双人模式)

​​ ​ 有了以上函数作为基础,再运用SetConsoleTextAttribute()设定输出字符的颜色,就可以完成对于界面的设计。编写静态界面绘制函数时需要注意光标的位置,要考虑换行时需不需要再次调用gotoXY()

实现效果如下:

单人模式

双人模式

​ ​ (这是初版测试的时候的截图,图中的等级应该改为分数)

4.实现玩家姓名输出和分数输出

​​ ​ 姓名和分数这两个信息都需要从外部传参获得,这个几个函数实现起来比较简单,值得注意的是在每次打印玩家分数之前需要在原位置打印空格来把原分数消去

5.设计胜利标志

​ ​ ​由于在c++控制台上的字体大小不可设置,如果直接输出类似于“胜利”的字体来代表某方胜利不够直观,所以我就自己设计了一个标志在游戏池下方显示来表示胜利,如下图:

​ ​ 出现在界面的位置如下:

6.实现方块的打印与消去

​ ​ 这里方块的打印主要是指下一个方块游戏池中正在下落方块的打印,这两种需要区分开来用不同的方式编写,由于游戏池中正在下落方块在消去过程中有可能会将本来已经在map中的方块消去,所以要注意只能对数组中为1的位置操作,类似如下:

for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            if(block[i][j]==1){ 
            gotoXY(hOut,2*(y+j)+22,x+i);
            cout << "  ";
            }
        }
    }

​ ​ 而下一个方块可直接如下操作:

for(int i=0;i<4;i++){
        gotoXY(hOut,2,6+i);
        for(int j=0;j<4;j++){
            cout<<"  ";
        }
    }

​ ​ ​打印方块是消去方块的逆过程,只需要对输出的部分进行修改即可

7.测试效果图

存在问题

​​ ​ 1.由于双人模式中两个玩家在界面的位置不同,所以我在处理时把一种效果用两个不同的函数来区分两个玩家,但是其实这两个函数的内容其实是相似的,所以我就在考虑是否可以将两个类似的函数合并成一个两个玩家均可调用的函数,这样可以减少代码量。
​ ​ 2.由于随机产生一行的功能还存在疑问,所以在Interface中还缺少与满行消去和在下方随机打印一行相关的功能,这会在接下来的阶段解决。

原文地址:https://www.cnblogs.com/beyondzones/p/12936002.html