这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 我罗斯方块汇报(1) |
这个作业的目标 | 1.汇报自己这个阶段的开发进度。(完成了哪几个模块) |
2.讲述自己遇到的问题和尝试解决的方法和最后的结果(解决与否) | |
3.制作一篇开发日记,例子如此,描述自己开发某一个模块的过程。 | |
成员 | 031902335方静怡 |
031902343张妍 | |
项目地址 | github地址 |
其他参考文献 | 1. c/c++ console(控制台)编程详解 |
2. system | |
3.新手向C++俄罗斯方块教程 |
一、开发进度
开发中涉及到的四个类:渲染类、游戏类、方块类、玩家类
初步完成部分:渲染类(进入界面的绘制,游戏界面的绘制,美化界面)
方块类中的生成、方块的移动
二、开发日记
2020.5.9
小组讨论并确认该阶段准备完成哪个部分。
2020.5.10
针对该阶段要完成的游戏开始界面及游戏主界面,开始查找相关的资料,了解并学习要用到的相关函数。
2020.5.13
设计游戏开始界面草图,形成大致构架。
2020.5.16
着手设计游戏开始界面。
2020.5.17
设计游戏主界面草图,形成大致框架。
2020.5.18
着手设计游戏主界面。
2020.5.21
对设计好的游戏开始界面及游戏主界面进行美化。
首先想到的是对界面的绘制,界面分成两个部分,一个是进入界面,一个是游戏界面
绘制界面时首先要用到光标的移动
//gotoxy(x,y)将光标移动到指定行y和列x。
void gotoxy(int x, int y){
COORD pos = {x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);//两个参数分别是指定哪个窗体,具体位置
}
渲染类的函数成员
void Welcome();//进入界面
void SetFrame();//游戏界面
void setcolor(int color);
进入界面
通过光标的移动来绘制边框和封面文字
void Teris::Welcome(){
system("cls");//清屏
system("color f3");
for(int i=1;i<=46;i+=2)
{
Sleep(20);
gotoxy(i,1);cout<<"■ ";
gotoxy(i,26);cout<<"■ ";
}
for(int i=2;i<=25;i++)
{
Sleep(10);
gotoxy(1,i);cout<<"■";
for(int j=2;j<=43;j++)
cout<<' ';
cout<<"■";
}
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
WORD wr1 = 0xf9;
SetConsoleTextAttribute(hOut, wr1);
gotoxy(20,6);cout<<"我罗斯方块";
Sleep(100);
gotoxy(18,8);cout<<"W e l c o m e "<<endl;
WORD wr2 = 0xf3;
SetConsoleTextAttribute(hOut, wr2);
Sleep(100);
gotoxy(21,10);cout<<"操作方法"<<endl;
//Player1
Sleep(100);
gotoxy(15,12);cout<<"Player1";
gotoxy(15,14);cout<<"w 旋转";
Sleep(100);
gotoxy(15,16);cout<<"s 加速下降"<<endl;
Sleep(100);
gotoxy(15,18);cout<<"a 左移";
Sleep(100);
gotoxy(15,20);cout<<"d 右移"<<endl;
//Player2
Sleep(100);
gotoxy(27,12);cout<<"Player2";
gotoxy(27,14);cout<<"↑ 旋转";
Sleep(100);
gotoxy(27,16);cout<<"↓ 加速下降"<<endl;
Sleep(100);
gotoxy(27,18);cout<<"← 左移";
Sleep(100);
gotoxy(27,20);cout<<"→ 右移"<<endl;
Sleep(100);
WORD wr3 = 0xf1;
SetConsoleTextAttribute(hOut, wr3);
gotoxy(21,22);cout<<"开始游戏";
gotoxy(1,31);
}
游戏界面
首先在纸上绘制出大概的界面,并定好格子数,接着就是实现了
以下代码展现的其中一个玩家
void Teris::SetFrame(){
system("cls");
system("color f9");
gotoxy(48,1);cout<<"我 罗 斯 方 块";
//Player1方块界面
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
WORD wr1 = 0xf5,wr2 = 0xf2,wr3 = 0xfb,wr4=0xf3,wr5=0xf1;
SetConsoleTextAttribute(hOut, wr1);
gotoxy(2,3);cout<<"╔";
gotoxy(36,3);cout<<"╗";
gotoxy(2,29);cout<<"╚";
gotoxy(36,29);cout<<"╝";
for(int i=3;i<=35;i++)
{
//Sleep(20);
gotoxy(i,3);
cout<<"═";
gotoxy(i,29);
cout<<"═";
}
for(int i=4;i<=28;i++)
{
//Sleep(20);
gotoxy(2,i);
cout<<"║ ";
for(int j=3;j<=34;j++)
cout<<' ';
cout<<"║";
}
//Player1玩家界面
SetConsoleTextAttribute(hOut, wr2);
Sleep(20);
gotoxy(41,4);cout<<"下一个方块";
Sleep(20);
gotoxy(38,5);cout<<"╔";
gotoxy(52,5);cout<<"╗";
gotoxy(38,12);cout<<"╚";
gotoxy(52,12);cout<<"╝";
for(int i=39;i<=51;i++)
{
Sleep(20);
gotoxy(i,5);cout<<"═";
gotoxy(i,12);cout<<"═";
}
for(int i=6;i<=11;i++)
{
Sleep(20);
gotoxy(38,i);cout<<"║ ";
for(int j=39;j<=50;j++)
cout<<' ';
cout<<"║";
}
Sleep(20);
SetConsoleTextAttribute(hOut, wr5);
gotoxy(42,14);cout<<"Player1";
Sleep(20);
gotoxy(43,18);cout<<"Score";
Sleep(20);
SetConsoleTextAttribute(hOut, wr4);
gotoxy(42,22);cout<<"w 旋转";
gotoxy(42,24);cout<<"s 加速下降"<<endl;
gotoxy(42,26);cout<<"a 左移";
gotoxy(42,28);cout<<"d 右移"<<endl;
//中间过渡
SetConsoleTextAttribute(hOut, wr3);
for(int i=3;i<=29;i++)
{
Sleep(20);
gotoxy(54,i);cout<<"★";
}
}
三、开发问题
1.背景色和前景色的设置
最开始使用的根据资料改写的setcolor函数,发现对于没有设计区域的背景色没有任何修改效果。第二次选用使用C++库自带的修改背景色和前景色的函数来解决,但是发现该函数每次调用都会改变之前的已经出现的文本颜色和背景颜色,即全局的背景色和前景色都被重置了一次,达不到预期的效果。最后将C++库自带函数和设置文本属性函数相结合的方式,得到了预期效果。
2.方块的实现
每个方块的数据也是一个二维数组,根据方块的形状可知,用4✖4的数组即可放下所有形状的所有方向数据。空格用0表示,否则用1表示。
方块可以旋转,因此每个方块需要1~4个不同的4✖4数组来存放不同方向的数据
#define WIDTH 4
#define Height 4
//用4*4数组表示一个方向的方块数据
struct MatrixData{
int data[Height][WIDTH];
};
//一个方块所有方向
struct Block{
int directioncnt;//方向数
MatrixData matrixdata[4];//最多四个方向
};
Block blo[7];
// ■■■■
blo[1].matrixdata[0]={
0,0,0,0,
0,0,0,0,
0,0,0,0,
1,1,1,1,
}
blo[1].matrixdata[1]={
0,1,0,0,
0,1,0,0,
0,1,0,0,
0,1,0,0,
}
blo[1].directioncnt=2;