大作业代码思路
首先就需要全局数组再配合全局可变变量控制下速度
#define WIDTH 56
#define HEIGHT 22
int map[HEIGHT][WIDTH] = { 0 };//用于储存全局方块信息的重要数组
int speed = 2;//较为正常的速度
有了全局数组接下来就是实现函数模块化和命名规范化再将这些函数写好就行了。
整体思路
1,游戏正式开始使用方块类实体化两对象获取下落速度打印界面以及初次绘出规定范围内的方块--->2,检测键盘输入信号并获取输入信号--->3,判断方块实体对象状态以及是否应该终止游戏--->4,如果有输入信号,分类输入信号分类后配合一系列检测函数再决定能否进行对象相应值的变化--->5,刷新界面重新绘出变化的方块--->6,判断是否需要执行消行函数及其执行以及判断方块对象是否需要reSet--->2
关于绘图
利用全局数组结合移动光标的函数对全局数组中的每一个值进行分析为0则跳到该处输出空格,为1,2则跳到该处输出实心方块和空心方块,由于方块在控制台会占据两长度因此如果仅是map[0][0]=1而map[0][1]=0会导致打印异常,需要将相邻的数组值均赋值,实现函数为:
void hidden_cursor();//隐藏光标
void gotoxy(int x, int y);//控制光标移动
void printBorder();//打印初始界面
void search();//负责仅将数组值变为0上的清空界面
void searchMap();//负责实际的清空该界面和重新打印方块
void bkForecastPaint(bk& who);//预测下一方块是什么配合检测底部函数使用
这里的函数通过结合光标移动使得可以方块绘制
方块实现以及操作问题
需要一个方块类储存大量信息,而实际运行过程中仅仅需要这个类的两个对象就可以满足程序运行所需,依赖方块类和大量辅助函数(接收信号依赖kbhit函数):
class Block
{
public:
int x;
int y;
int speice;
int player;
int rotater;
int bottom;
int next;
void randomSpecie();
void xyLocation();
void reSet();
Block() = default;
Block(int player);
};
在程序使用类实体化两对象直到游戏结束时,其它辅助函数根据两对象的坐标旋转状态和底部检测值配合绘图函数来实现一系列操作:
void blockChanger(bk& who);//辅助方块分类为实现方块打印做铺垫
int getConstruction(bk& who);//负责将方块的状态告知准备给数组赋值的函数
void LineBlock(bk& who);
void SquareBlock(bk& who);
void ZBlock(bk& who);
void MidStanding(bk& who);
void LeftBlock(bk& who);
这里面的函数根据传入的对象的状态(就是是否到底)获取对应的值配合分类函数将不同种类的方块分派到对应函数中利用各自方块函数的功能去实现对应的区域的值进行赋值。
大致流程一:who--->blockchanger--->getConstruction--->根据方块种类分配函数
bool LeftBorderScanner(bk& who);//游戏左界面检测函数
bool RightBorderScanner(bk& who);//游戏右界面检测函数
bool rotaterScanner(bk& who);//旋转测试函数分派
bool LineRotater(bk& who);
bool ZBlockRotater(bk& who);
bool LeftRotater(bk& who);
bool MidSRotater(bk& who);
这里面的函数以检测为主程序传入对象根据不同玩家进行不同的处理,由主循环获取键盘输入的信号来调用不同的检测函数后返回布尔值再做决定能否实现方块的变化,就像敲击a或者1方块会向左移动就会先调用左界面检测函数判断能否移动后再移动,旋转基于某一确切方块进行状态变化减少工作量。
■ ■
■ ■ ■ ■ ■
□ ■ ■ □ ■ ■ □ □
■
大致流程二:_kbhit()--->判断输入是什么东西--->检测能否完成--->执行--->状态改变--->流程一
消行,此消彼长
大致流程:检查每一行能否消行--->出现消行(可能有多行消除)--->临时数组储存还活着的方块--->将临时数组赋值给map数组--->执行彼长函数
void DeleteMap(bk& who);
bool FriendshipOver(int number);
垃圾方块添加的执行:通过生成随机数获取方块位置然后添加垃圾5个方块,这也看个人运气毕竟随机数是无法控制的如果方块位置在边界处就可以减少垃圾方块,值得一提的是垃圾方块悬空时会一直悬空直到被消除。
□□□□□(垃圾方块)
□□ -->
□ □
□ □□
□□□□□□(消行 □□□□□
如上图所示如果在现有代码上允许垃圾方块下落至下方有已有方块,可能也会使得正常方块收到影响。
题外:倒是利用自身的绘制方块的方法自己整了个模式。