我罗斯方块最终篇

作业描述 详情
作业属于 2020面向对象程序设计
作业要求  
  • 代码的 git 仓库链接 
  • 运行截图/运行视频
  • 代码要点
  • 收获与心得
  • 依然存在的问题
作业目标  
  • 实现我罗斯的正常运行
  • 发表博客
作业正文  

  在这里

小组成员  

  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仓库链接 - > 在这里

 

posted @ 2020-06-12 18:52  Miaohengming  阅读(299)  评论(2编辑  收藏  举报