我罗斯方块最终篇
作业描述 | 详情 |
作业属于 | 2020面向对象程序设计 |
作业要求 |
|
作业目标 |
|
作业正文 | |
小组成员 |
031902614缪恒铭 031902620夏豪杰 |
1.运行截图/运行视频
2.代码要点
窗口设计
1 void initialWindow(HANDLE hOut) 2 { 3 SetConsoleTitle("我罗斯"); 4 COORD size = { 84, 25 }; 5 SetConsoleScreenBufferSize(hOut, size); 6 SMALL_RECT rc = { 0, 0, 83, 24 }; 7 SetConsoleWindowInfo(hOut, true, &rc); 8 CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; 9 SetConsoleCursorInfo(hOut, &cursor_info); 10 }
界面设计
1 void gotoXY(HANDLE hOut, int x, int y) 2 { 3 COORD pos; 4 pos.X = x; 5 pos.Y = y; 6 SetConsoleCursorPosition(hOut, pos); 7 }
利用gotoXY函数,将光标移动到相应的位置
利用<wincon.h>头文件中的SetConsoleTextAttribute函数,改变打印的颜色
最终的界面设计写进函数initialPrint,在main函数开始时调用它
方块设计
int blockbase[19][4][4]= { { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 11,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 } }, { { 12,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 1,0,0,0 } }, { { 13,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 } }, { { 14,0,0,0 },{ 0,0,0,0 },{ 0,0,1,0 },{ 1,1,1,0 } }, { { 15,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 } }, { { 16,0,0,0 },{ 0,0,0,0 },{ 0,1,0,0 },{ 1,1,1,0 } }, { { 17,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 1,0,0,0 } }, { { 18,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,1,0,0 } }, { { 19,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } }, { { 20,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 0,1,1,0 } }, { { 21,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 1,0,0,0 } }, { { 22,0,0,0 },{ 0,0,0,0 },{ 0,1,1,0 },{ 1,1,0,0 } }, { { 23,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } }, { { 24,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,0,1,0 } }, { { 25,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 } }, { { 26,0,0,0 },{ 0,0,0,0 },{ 1,0,0,0 },{ 1,1,1,0 } }, { { 27,0,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 1,0,0,0 } }, { { 28,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 1,1,0,0 } } };
鉴于方块不多,干脆不写旋转函数,直接设计19种基本方块
每种方块本身是二维数组
将方块放入三维数组便于后续函数的调用
玩家操作
void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y,int user);//左移 void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y,int user);//右移 void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int y,int user);//顺时针旋转90度 int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y,int user);//加速下落 void myStop(HANDLE hOut, int block[4][4]);//游戏暂停 void gameOver(HANDLE hOut, int block[4][4], int map[21][12],int user);//游戏结束
玩家1使用 w a s d
玩家2使用 ↑ ← ↓ →
空格:暂停
Esc:结束游戏
系统判定
void roundBlock(HANDLE hOut, int block[4][4],int user);//随机生成方块并打印到 “下一个方块” 位置 bool collisionDetection(int block[4][4], int map[21][12], int x, int y,int user);//检测碰撞(若将要产生碰撞,不能进行平移等操作) void printBlock(HANDLE hOut, int block[4][4], int x, int y,int user);//打印方块 void clearBlock(HANDLE hOut, int block[4][4], int x, int y,int user);//消除方块 int eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint,int user);//判断是否能消行并更新分值
键盘读入
1 if (_kbhit())//读入按键 2 { 3 key = _getch(); 4 switch (key)//对按键进行判定,执行对应的函数 5 { 6 case 119:myUp (hOut,blockB ,map ,positionX ,positionY ,1);break; 7 case 72 :myUp (hOut,blockB1,map1,positionX1,positionY1,2);break; 8 case 97 :myLeft (hOut,blockB ,map ,positionX ,positionY ,1);break; 9 case 75 :myLeft (hOut,blockB1,map1,positionX1,positionY1,2);break; 10 case 100:myRight(hOut,blockB ,map ,positionX ,positionY ,1);break; 11 case 77 :myRight(hOut,blockB1,map1,positionX1,positionY1,2);break; 12 case 115: 13 switch (myDown(hOut, blockB, map, positionX, positionY,1)) 14 { 15 case 0:check = false;break; 16 case 1:check = true;break; 17 case 2:gameOver(hOut, blockB, map,1);goto initial; 18 default:break; 19 } 20 break; 21 case 80: 22 switch (myDown(hOut, blockB1, map1, positionX1, positionY1,2)) 23 { 24 case 0:check1 = false;break; 25 case 1:check1 = true;break; 26 case 2:gameOver(hOut, blockB1, map1,2);goto initial; 27 default:break; 28 } 29 break; 30 case 32:myStop(hOut, blockA);break; 31 case 27:exit(0); 32 default:break; 33 } 34 } 35 Sleep(20);
增行部分
void mhm(HANDLE hOut,int map[21][12],int user);
{
.......
.......
.......
int k=rand()%100;//得到一个100以内的随机数k
//对底部的每一格取随机数进行判断
if(k>40)// 3/5的概率打印方块
{
map[i][j]=1;
cout << "■";
}
else// 2/5的概率不打印方块
{
map[i][j]=0;
cout << " ";
}
}
利用随机数,得到增加方块的情况
3.依然存在的问题
还未解决的问题>_<
画面不美观
方块在两侧时,由于会产生碰撞,可能无法旋转
尚未解决两玩家按键兼容的问题,例如s键和↓同时按住不放,只有一方会快速下落
4.收获与心得
自己写一个小游戏才意识到,需要考虑的事情非常多;有时一个小错误没有注意到,等到发现了却需要将大半篇的代码进行修改,相当烦心;
也不能像平常刷题一样,边敲边想,当代码量可能达到上百行时,应该在编程前先设计好大体的布局思路,然后写出框架,
编程时按着框架一步一步完善,调试代码;在确保每个零件都正确的情况下,再将它们整合到一起。
git仓库链接 - > 在这里