这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 我罗斯方块汇报(1) |
这个作业的目标 | 1.汇报自己这个阶段的开发进度。(完成了哪几个模块) |
2.讲述自己遇到的问题和尝试解决的方法和最后的结果(解决与否) | |
3.制作一篇开发日记,例子如此,描述自己开发某一个模块的过程。 | |
成员 | 031902534 陈妍羽 |
031902541 许雅萍 | |
仓库地址 | https://github.com/smallgrape14/RussiaBlock/tree/master/r2 |
其他参考文献 | https://blog.csdn.net/cmm0401/article/details/54599083 |
https://blog.csdn.net/viafcccy/article/details/84262393 | |
https://blog.csdn.net/qian_su/article/details/96157395 |
一.汇报这个阶段的开发进度。(完成了哪几个模块)
1. 在玩家类中打印初始页面及边框的函数PrintScreen,已初步完成。
2.在玩家类中随机生成方块的函数randblock,未完全完成。
3. 在方块类中设计方块打印的函数printblock,未完全完成。
4. 完成对七种方块形状及它们各自旋转后的形状的定义。
二.讲述遇到的问题和尝试解决的方法和最后的结果(解决与否)
1. 在存在两个玩家对象的情况下,不太清楚如何同时进行输入,以及打印时光标的移动如何切换。(努力解决中,还未实现)
2.一些函数相互需要调用,且不同类所需的部分有重复,很难分清需要放在哪个类。例如,在随机生成方块时,需要由于两个玩家的速度可能不同,需要由玩家来调用函数,但是同时要将方块的形状、颜色等传给对象。尝试将一个类设为其他的友元,但是未能实现,在返回参数时有时需要传递多个参数,因此又考虑在一个类中增加另一个类的对象。(未解决)
3.由于界面会显示下一个方块的样式,打印下一个方块时需要将前一个打印出的样式删除。尝试用空格将前一个打印出的覆盖后再打印下一个方块。(未解决)
三.我们的开发日记
2020.5.13
今天,讨论了一下分工,各自去了解些相关资料,学习一些很必要的做游戏的知识。制定了下任务的目标,打算先从游戏画面开始做起,首先是了解了一些设计游戏画面的一些必要的函数。
2020.5.14
今天,主要是综合两个人学到的一些知识,收集到的一些资料,交流讨论目前的一些亟待解决的问题。
2020.5.15
今天,鉴于有些难度比较高的问题,还未解决,打算先试试水,用所掌握到的知识,先着手实现游戏界面的设计。
2020.5.16
今天,制定了目前的首要任务,先把window.h库中的有关函数,和目前所收集的参考资料,运用于游戏界面的设计。
2020.5.17
由于,我们的指导方针是先努力实现类中的一系列函数,通过主函数的内容来补充一些必要的数据成员,之后再考虑,类与类之间的 关系,进行各种优化。
所以,今天,是把学习到的windows. h里的一些函数,比如设置方块字体的颜色,移动光标实现起来。
2020.5.18
由于,正常不断的输入,输出,屏幕是会移动的,并不会固定于一个位置,而不发生滑动,所以,查询资料,用了SetConsoleScreenBufferSize();函数(更改指定的控制台屏幕缓冲区的大小的函数),还有基本把两个玩家的界面都设计出来了,并在主函数中把它实现了。
2020.5.19
昨天,虽然把整个我罗斯方块中的最简单的部分完成了,但是因为考虑到一些因素,我们一致决定,想把设计游戏界面的工作,扔到玩家类中,在我们看来,是更好一些的,
虽说,还没实现什么,看过很多的俄罗斯,有好多都没有颜色,灰扑扑的,本来我们还以为,这些给俄罗斯方块上个色很困难,实际上今天,去学习了一番,发现,还挺好实现的,就说说这个函数
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
我们原先还以为,它是可以实现随机的上色,一会蓝的,一会绿的,原来只是我们想多了,它是把两个颜色叠加在一起,原来如此。
2020.5.21
今天,是实现方块的一些函数的一天,方块的形状有七种,用七个4x4的二位数组实现;随机生成方块的函数,用到了掷骰子的函数,实现随机生成哪一种方块,并且要实现打印方块的函数。
2020.5.22
今天,讨论了好多东西,就哪个函数要放在哪个类中,要实现玩家类的对象在游戏时,要随机生成某一方块,之类的问题,又加了一些数据成员,修改了一些函数。
结果:
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); void SetPos(HANDLE hOut,int x, int y);//移动光标 void initialWindow(HANDLE hOut);//初始界面 void SetPos(HANDLE hOut,int x, int y)//移动光标 { COORD pos={x,y}; SetConsoleCursorPosition(hOut,pos); } void initialWindow(HANDLE hOut)//初始界面 { SetConsoleTitle("俄罗斯方块"); COORD size = { 1000, 30 }; SetConsoleScreenBufferSize(hOut, size); SMALL_RECT rc = { 0, 0, 99, 30 }; SetConsoleWindowInfo(hOut, true, &rc); CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; SetConsoleCursorInfo(hOut, &cursor_info); } class Block { private: int positionX[4], positionY[4];//方块的坐标 bool check;//检测方块是否结束进程 int val;//方块下落速度 public: void roundBlock();//随机生成方块 bool collisionDetection();//检测是否碰撞到边框 void myLeft();//左移 void myRight();//右移 void myUp();//顺时针旋转90度 int myDown();//加速下落 };
class Player { private: int x,y,num,score,newblock[4][4],nextblock[4][4]; Block block; public: Player(int n,const int x0,int y0) { num=n; x=x0; y=y0; score=0; } void randBlock(HANDLE hOut); void printBlock(HANDLE hOut, int block[4][4]);//打印 void PrintScreen();//打印窗口 }; void Player::PrintScreen()//打印窗口 { SetPos(hOut, x+8, y+23); cout<<"Player"<<num; SetPos(hOut, x, y); for (int i = 0; i < 20; i++) { SetPos(hOut, x, y+i); cout << "■ ■ ■" << endl; } SetPos(hOut, x+0, y+20); cout << "■■■■■■■■■■■■"; SetPos(hOut, x+24, y); cout << "☆☆☆☆☆☆☆☆☆☆"; SetPos(hOut, x+24, y+20); cout << "☆☆☆☆☆☆☆☆☆☆■"; SetPos(hOut, x+26, y+1); cout << "分 数: "; SetPos(hOut, x+26, y+4); cout << "下一方块:"; } void Player::printBlock(HANDLE hOut, int block[4][4]) { switch (block[0][0]) { case 1: SetConsoleTextAttribute(hOut, FOREGROUND_GREEN); break; case 2: SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 3: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 4: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case 5: SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 6: SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case 7: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); break; default: break; } for (int i = 0; i < 4; ++i) { if (i+x+5>= 0) { for (int j = 0; j < 4; ++j) { if (block[i][j] == 1) { SetPos(hOut, 2*(x/2+15+j), y+5+i); cout << "■"; } } } } }
加上主函数用于测试:
#include <iostream> #include <windows.h> #include<string> #include<ctime> #include<cstdlib> #include<conio.h> #define x1 0 #define y1 0 #define x2 48 #define y2 0 using namespace std; HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); void SetPos(HANDLE hOut,int x, int y);//移动光标 void initialWindow(HANDLE hOut);//初始界面 class Block { private: int positionX[4], positionY[4];//方块的坐标 bool check;//检测方块是否结束进程 int val;//方块下落速度 public: void roundBlock();//随机生成方块 bool collisionDetection();//检测是否碰撞到边框 void myLeft();//左移 void myRight();//右移 void myUp();//顺时针旋转90度 int myDown();//加速下落 }; class Player { private: int x,y,num,score,newblock[4][4],nextblock[4][4]; Block block; public: Player(int n,const int x0,int y0) { num=n; x=x0; y=y0; score=0; } void randBlock(HANDLE hOut); void printBlock(HANDLE hOut, int block[4][4]);//打印 void PrintScreen();//打印窗口 }; int main() { int n0; initialWindow(hOut); // SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); Player player1(1,x1,y1),player2(2,x2,y2); player1.PrintScreen(); player2.PrintScreen(); player1.randBlock(hOut); player2.randBlock(hOut); while(1) { } return 0; }