zoukankan      html  css  js  c++  java
  • 我罗斯方块最终篇

    作业描述 详情
    作业属于 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仓库链接 - > 在这里

  • 相关阅读:
    (转载)Centos7 install Openstack Juno (RDO)
    (转载)vmware esxi 6.0 开启嵌套虚拟化
    Delphi XE5 android toast
    delphi中Message消息的使用方法
    delphi中Time消息的使用方法
    Delphi中Interface接口的使用方法
    SystemParametersinfo 用法
    Delphi XE5 android openurl(转)
    Delphi XE5开发Android程序使用自定义字体文件.
    获取 TUniConnection.SpecificOptions默认值和下拉框列表值
  • 原文地址:https://www.cnblogs.com/miaohengming/p/13107420.html
Copyright © 2011-2022 走看看