C++轮子队-第三周(需求改进原型设计)

需求改进&原型设计

一.需求完善

(一)系统功能(补充)

图形界面(图片如下图所示:)

1484732-20181029001322711-679639110.png

根据需求与组内讨论结果,现归纳图形界面方面需要的设计与相应功能:

数据-图形界面中间类:
  1. 数字方块类 NumBlock
  • 方块数字 num,若为0则表示为空方块,在具体的图形界面中不显示

  • 方块数字查看方法 getBlockNum()

  • 方块数字设置方法 setBlockNum()

  • 该方块在棋盘数组中的下标 location,初步定为存储行号、列号的结构体

  • 该方块相对于程序窗口的位置 position ,可能用QPointF实现

  • 方块类声明

class number_block {public :number_block() {}// 以系统时间为种进行随机, difficulty :1 2 3对应只生成2, 24, 248unsigned int generate_number(int difficulty) {srand((unsigned)time(NULL));return 1 << (rand() % difficulty + 1);}// 初始化number_block(int difficulty, bool canBeMove = true, int x = 1, int y = 1) {is_moving = canBeMove;this -> x = x;this -> y = y;number = generate_number(difficulty);}// 修改相应的属性void modify_x(unsigned int x) {this -> x = x;}void modify_y(unsigned int y) {this -> y = y;}void modify_number(unsigned int number) {this -> number = number;}void modify_is_moving(bool is_moving) {this -> is_moving = is_moving;}// 获取相应属性unsigned int get_x() {return x;}unsigned int get_y() {return y;}unsigned int get_number() {return number;}unsigned int get_is_moving() {return is_moving;}private :// 为了维护数据的安全性,私有类成员只允许通过公有借口进行间接访问bool is_moving; // 移动unsigned int number; // 数字unsigned int x; // 二维横坐标unsigned int y; // 二维纵坐标
};
  1. 5*7棋盘 Board:
  • 二维数组 board[ ][ ] ,以存储哪些方块为空方块、数字方块、下落方块,在具体的代码实现中可能以一级指针的形式声明于类中。

  • 获取二维数组信息的方法 getBoard()

  • 填入二维数组信息的方法 setBoard()

  • 游戏结束条件判断 bool end_judge(number_block* moving_block)

  • 方向键控制方法,参数为按键对应的ascii和指向正在下落块的指针 void control(const unsigned char control_flag, number_block* moving_block)

  • 随时间自动下落 void time_drop(number_block* moving_block)

  1. 游戏图形引擎 2048TetrisEnigine
  • 移动:

    • 左移 moveLeft()
    • 右移 moveRight()
    • 下移 moveDown()
  • “下一个方块”的数据获取 GetNextBlock()

  • 二维数组棋盘的图形映射方法 BoardDisplay()

  • 游戏计时 time

  • 积分记录 score

  • 积分上传方法 scoreUpload() ,将玩家ID与分数一起上传至服务器

  • 获取积分方法 unsigned int return_mark()

界面主窗口与排名界面

窗口分割控件:初定为QSplitter

文字显示: QLabel

按钮控件:QPushButton或QGraphicsItem

游戏界面:

需重写的函数:

  • 按键按一次 keyRelease()
  • 按键长按 keyPress()
  • 图形绘制 paint()

需要的控件:

  • 按钮控件:QPushButton或QGraphicsItem
  • 方块控件:初定为QPixmap或QTransfrom,加载数值方块对应的png,像素尺寸初定为20*20,并根据棋盘类Board的数据定时进行位置更新
  • 退出游戏时的对话框控件:QMessageBox

分数统计

障碍块

难度调整

在线排名

(二)四象限分析法

作用:帮助你清晰定位软件的功能特点和将来要进行研发的创新点,如图所示:

1484732-20181028224027278-1158007719.png

说明:

  • 杀手功能:针对某一应用需求我们的竞争对手和用户已经决定了的必要满足的需求,我们的创新功能也在这一部分。

  • 外围功能:辅助性的功能,比如良好的用户体验界面等。

  • 必要需求:能够准确解决用户主要功能的需求,比如游戏中的控制计分等功能。

  • 辅助需求:非必要需求,比如更改界面风格,增加背景音乐等功能。


解决方法:

  • 维持----以最低成本维持此功能

  • 抵消----快速地达到“足够好”、“和竞争对手差不多”

  • 优化----花大力气做到并保持行业最好

  • 差异化----产生同类产品比不了的功能或优势

  • 不做----砍掉一个功能,有时我们不需要做所有的功能

(三)进度计划(WBS,Work Breakdown Structure)

二.原型改进

三.系统设计

(一)架构设计

framwork_base.h

游戏结束条件判断

 bool end_judge(number_block* moving_block);

方向键控制方法

void control(const unsigned char control_flag, number_block* moving_block);

定义了框架内每个方块的元素类型

struct framework_block_item
{number_block* block;bool is_none;bool is_uncombined;
};

number_block.h

以系统时间为种进行随机生成数字块的数值

number_block() {}
// 以系统时间为种进行随机, difficulty :1 2 3对应只生成2, 24, 248
unsigned int generate_number(int difficulty) {srand((unsigned)time(NULL));return 1 << (rand() % difficulty + 1);
}

初始化数字块

 number_block(int difficulty, bool canBeMove = true, int x = 1, int y = 1) {is_moving = canBeMove;this -> x = x;this -> y = y;number = generate_number(difficulty);
}

修改数字块相应的属性

 void modify_x(unsigned int x) {this -> x = x;
}
void modify_y(unsigned int y) {this -> y = y;
}
void modify_number(unsigned int number) {this -> number = number;
}
void modify_is_moving(bool is_moving) {this -> is_moving = is_moving;
}

获取数字块相应属性

unsigned int get_x() {return x;
}
unsigned int get_y() {return y;
}
unsigned int get_number() {return number;
}
unsigned int get_is_moving() {return is_moving;
}

suitiation_judgement.h

超出上界和填满空格判断

bool framework::end_judge(number_block* moving_block)

{
unsigned int current_x = moving_block->get_x();
unsigned int current_y = moving_block->get_y();

//超出上界判断
if ((this->game_blocks[current_x][current_y - 1].is_none == false) && current_y == column - 1)
{return true;
}//填满空格判断
for (current_y = 0; current_y < row; ++current_y)
{for (current_x = 0; current_x < column; ++current_x){if (game_blocks[current_y][current_x].is_none){return false;}}
}
if (current_y == row && current_x == column)
{return true;
}

控制数字块左移
case 75://方向左
{
if (current_x == 0)//
{//边界判断
return;
}

    if (!this->game_blocks[current_y][current_x - 1].is_none || this->game_blocks[current_y][current_x - 1].is_uncombined){//左侧块为空块或为障碍块return;}game_blocks[current_y][current_x].is_none = true;game_blocks[current_y][current_x - 1].is_none = false;game_blocks[current_y][current_x - 1].block = moving_block;moving_block->modify_x(current_x - 1);
}
break;

控制数字块右移

case 77://方向右
{if (current_x == this->column - 1)return;else if (!this->game_blocks[current_y][current_x + 1].is_none || this->game_blocks[current_y][current_x + 1].is_uncombined){//右侧块不为空或为障碍块return;}this->game_blocks[current_y][current_x].is_none = true;this->game_blocks[current_y][current_x + 1].is_none = false;this->game_blocks[current_y][current_x + 1].block = moving_block;moving_block->modify_x(current_x + 1);
}
break;

控制数字块下移

case 80://方向下
{int tmp = 0;if (current_y == 0){return;}if (!this->game_blocks[current_y - 1][current_x].is_none || this->game_blocks[current_y - 1][current_x].is_uncombined){return;}while (!this->game_blocks[tmp][current_x].is_none){tmp++;}this->game_blocks[tmp][current_x].is_none = false;this->game_blocks[tmp][current_x].is_uncombined = false;this->game_blocks[tmp][current_x].block = moving_block;this->game_blocks[current_y][current_x].is_none = true;moving_block->modify_y(tmp);
}
break;

(二)数据库设计

四.Alpha任务分配计划

召开迭代计划会议,为下周进入Sprint作准备。具体内容如下:

  1. 依据项目组能提供的总时间、功能模块的优先级以及模块之间的依赖关系,在Product Backlog中选取待实现的功能项。

1484732-20181028224056258-1126750938.png

  1. 对已选择的功能项再做进一步分解,分解为1-10小时左右的任务,构成Sprint Backlog。在PM的协助下,编码的同学对任务进行认领。

1484732-20181028224108040-1119169194.png

  1. 以甘特图的方式拟定迭代冲刺计划。

五.测试计划

说明:测试将在游戏基本实现后再进行

转载于:https://www.cnblogs.com/coothen/p/9858221.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 从头学 01:CPU 是如何执行一条指令的?

摘自&#xff1a;Linux 从头学 01&#xff1a;CPU 是如何执行一条指令的&#xff1f; 作者&#xff1a;IOT物联网小镇 发布时间&#xff1a;2021-07-02 08:22:43 网址&#xff1a;https://blog.csdn.net/jchen1218/article/details/118404217?utm_sourceapp&app_version4.…

积极拥抱.NET Core开源社区

潘正磊在上海的Tech Summit 2018 大会上给我们的.NET Core以及开源情况带来了最新信息。 .Net Core 开源后取得了更加快速的发展&#xff0c;目前越活跃用户高达400万人&#xff0c;每月新增开发者45万&#xff0c;在 GitHub 上的月度增长达到15%。目前有来自超过3,700家企业的…

内存:你跑慢点行不行?CPU:跑慢点你养我吗?内存:我不管!(内附超全思维导图)

摘自&#xff1a;内存&#xff1a;你跑慢点行不行&#xff1f;CPU&#xff1a;跑慢点你养我吗&#xff1f;内存&#xff1a;我不管&#xff01;&#xff08;内附超全思维导图&#xff09; 作者&#xff1a;程序员cxuan 发布时间&#xff1a;2020-03-09 13:43:11 网址&#xff1…

过期时间_2020年最新航空里程过期时间及避免过期方法总结

【2020.2 更新】近几年来主要有如下变化&#xff1a;UA 里程永不过期了&#xff0c;Southwest 里程永不过期了&#xff0c;Asia Miles 里程可以通过里程变动续命了&#xff0c;Flying Blue 里程变成24个月过期了&#xff0c;AV 里程变成12个月过期了。各大航空的里程过期政策辛…

Spring Boot 5:应用程序启动时初始化资源

需求&#xff1a;应用程序启动后&#xff0c;初始化基础数据、加密证书等操作。 可以使用CommandLineRunner接口来实现&#xff0c;在SpringBoot.run()之后完成资源的初始化工作。 注意&#xff1a;多个Runner需要顺序启动的话&#xff0c;可以使用Order注解 package sun.flowe…

中的 终端报错怎么看原因_《琅琊榜》中太子被封禁,高湛引皇上看桂花的真正原因是什么?...

《琅琊榜》中&#xff0c;高湛是一个非常经典的角色&#xff0c;他比夏江更懂梁帝的心&#xff0c;或者说&#xff0c;知梁帝者&#xff0c;莫过于高湛。当然&#xff0c;若不是如此&#xff0c;高湛也不能在梁帝身边待了那么些年。梁帝生病&#xff0c;喝下静妃娘娘配制的甜汤…

STM32安装Keil5、芯片支持包、startup启动文件(启动过程、冷热启动)、建立工程、ST-LINK烧写步骤

参考&#xff1a;stm32入门之keil5的安装以及第一个工程的建立 作者&#xff1a;SKY丶丿平才 发布时间&#xff1a; 2020-12-06 17:08:30 网址&#xff1a;https://blog.csdn.net/weixin_48264057/article/details/110734596 目录使用的STM32F103C8T6一、Keil5的下载与安装1.下…

深度学习都是非凸问题_神经网络的损失函数为什么是非凸的?

Ian Goodfellow曾经给在quora回答过&#xff0c;以下是原文&#xff1a;There are various ways to test for convexity.One is to just plot a cross-section of the function and look at it. If it has a non-convex shape, you don’t need to write a proof; you have dis…

针对移动互联网应用的网络建设和优化

为什么80%的码农都做不了架构师&#xff1f;>>> 针对移动互联网应用的网络建设和优化 截至2013年3月,移动互联网的人均上网时长和PC互联网相比差距已经扩大了29%.PC互联网向移动端迁移的趋势进一步凸显.小米是一家专注于iPhone和Android等新一代智能手机软件…

STM32F103实现点灯(寄存器方式)

参考&#xff1a;STM32F103系列最简易版点灯程序 作者&#xff1a;一只青木呀 发布时间&#xff1a;2020-10-21 11:40:38 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/109196950 目录硬件软件点灯流程使能GPIO端口E和B对应的时钟找到GPIO对应的时钟…

rocketmq 消费方式_RocketMQ事务消费和顺序消费详解

一、RocketMq有3中消息类型1.普通消费2. 顺序消费3.事务消费顺序消费场景在网购的时候&#xff0c;我们需要下单&#xff0c;那么下单需要假如有三个顺序&#xff0c;第一、创建订单 &#xff0c;第二&#xff1a;订单付款&#xff0c;第三&#xff1a;订单完成。也就是这个三个…

GPIO输入输出模式原理(八种工作方式附电路图详解)

这几篇博文讲的不错&#xff0c;可参照着理解&#xff1a; STM32下拉输入模式与振动传感器的使用 “上拉电阻与下拉电阻”通俗解读 上、下拉电阻&#xff08;定义、强弱上拉、常见作用、吸电流、拉电流、灌电流&#xff09; 个人总结&#xff1a; 模拟量选浮空输入&#xff0c…

STM32F103构建固件库模板(PS固件库文件树介绍)

参考&#xff1a;STM32F103ZE新建固件库模板 作者&#xff1a;追兮兮 发布时间&#xff1a;2020-10-14 10:31:45 网址&#xff1a;https://blog.csdn.net/weixin_44234294/article/details/109065495 参考博文&#xff1a;https://blog.csdn.net/visual_eagle/article/details/…

STM32F103实现点灯(固件库方式)

参考&#xff1a;stm32上实现点灯 作者&#xff1a;SKY丶丿平才 发布时间&#xff1a; 2021-03-20 16:51:06 网址&#xff1a;https://blog.csdn.net/weixin_48264057/article/details/115028724 目录前言一、硬件设计二、软件设计1.建立工程2.代码编写三、实际验证1.烧写程序2…

STM32震动感应控制继电器(使用循环VS使用外部中断EXTI和中断控制器NVIC)

参考&#xff1a;stm32的外部中断 震动感应 控制 继电器 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-05 22:37:01 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114417161 参考&#xff1a;STM32震动感应灯 作者&#xff1a;一只小阿大…

结构体与共用体(联合体)

参考&#xff1a;结构体与共用体 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-09 08:29:22 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107889394 参考&#xff1a;联合体&#xff08;union&#xff09;的使用方法及其本质 作者&am…

STM32串口原理、结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯、接收不定长数据

参考&#xff1a;串口的结构体 重定向printf串口发送stm32等博文 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-06 21:46:33 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114458698 目录串口相关知识定义通信概念1.通讯结构2.电平标准3…

STM32通用定时器(原理、结构体、库函数、定时器中断每秒闪烁一次灯) —— 时钟源、分频值、重装载值

参考&#xff1a;stm32定时器与定时器中断 作者&#xff1a;打酱油的 发布时间&#xff1a; 2021-04-11 01:04:09 网址&#xff1a;https://blog.csdn.net/weixin_46098612/article/details/115493737 参考&#xff1a;stm32通用定时器结构体函数定时器实现led闪烁 作者&#x…

关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。

关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。 楼主在公司接手了一段代码。编译的时候发现一个很奇怪的问题&#xff0c;就是获取最新代码的时候能编译通过&#xff0c;然后下次就编译不通过了&#xff0c;提示如下错误。 后来发现问题出在std…

STM32端口复用和端口重映射

参考&#xff1a;stm32 端口复用和重映射 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-09 13:49:19 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114581032 目录端口复用1.什么是端口复用2. 如何配置端口复用(以PA9、PA10串口为例)端口…