- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
5. 详细设计
5.1模型层(Model)设计
5.1.1 图形的产生
通过图形工厂类ShapeFactory的getShape(ShapeListener listener)方法随机产生方块的某种状态,这里运用了工厂设计模式,这种设计模式是为了实现高内聚低耦合而存在的你想要一个产品,你需要让工厂给你生产一个你要告诉工厂你要生产什么产品就把你需要生产的这个产品当做参数传给工厂类的生产产品的方法然后根据你传进来的产品而决定工厂人生产什么产品产生出来产品后最后要返回您要的这个东西
5.1.2 图形的数据结构
定义一个4x4方阵,共16个小格。用“0”和“1”来表示每个方格是绘制还是空白,由此可以组合出多种图形,如图所示:
其中图一表示为{0,0,0,0, 1,1,1,1 , 0,0,0,0, 0,0,0,0}
其中图二表示为{0,0,0,0, 0,1,1,0 , 0,1,1,0, 0,0,0,0}
其中图三表示为{0,0,0,0, 0,1,0,0 , 0,1,1,1, 0,0,0,0}
其中图四表示为{0,0,0,0, 0,1,0,1 , 0,1,1,0, 0,0,1,0}
方块的旋转是通过绘制4个方向的方块,在不同旋转角度显示不同方向的方块来完成的。所以程序要控制方块的旋转方向,只要控制显示哪副图就可以了。
本游戏是用一个三维数组int[][][] shapes = new int[][][];作为存储方块的数据结构来保存方块的28种状态的。
5.1.3 图形的移动
图形类Shape保存了自己的位置信息,用left表示图形到左边界的距离,top表示图形到上边界的距离,图形移动就是改变left和top的值。向上移动:top减1,向下移动:top加1,向左移动:left减1,向右移动:left加1。
图形的移动分为图形的自动下落以及通过按键事件实现图形的左移、右移以及加速下移。通过多线程ShapeDriver类来实现图形的自动下移,由于游戏中方块的动态性,每个方块有一定的生命周期,所以选用线程来实现方块。一个方块用一个线程类对象实现,该类继承与Thread类,当一个方块出现时也就表示一个线程对象产生并开始运行。通过对按键事件的响应,实现图形的左移、右移以及加速下移。
5.1.4 图形的变形
通过int type = new Random().nextInt(shapes.length); shape.setBody(shapes[type]);
shape.setStatus(0);实现初始图形的初始化,通过status = (status + 1) % body.length;实现图形的变形功能。
5.1.5 存储和表示障碍物
用一个和显示区域的面板大小相对应的二维数组保存障碍物的位置信息,如果对应的位置是障碍物,则这个数组中相应的元素就为1,否则就为0。如何把图形变成障碍物呢?只要把属于图形的格子对应的位置都变成障碍物即可。代码如下:
public boolean isMember(int x, int y, boolean rotate) {
int tempStatus = status;
if(rotate) {
tempStatus = (status + 1) % body.length;
}
return body[tempStatus][y*4 + x] == 1;
}
public void accept(Shape shape) {
System.out.println(Grounds accept);
for(int x=0; x4; x++) {
for(int y=0; y4; y++) {
if(shape.isMember(x, y, false)) {
if((shape.getLeft() + x)Global.WIDTH (shape.getTop() + y)Global.HEIGHT)
zaw[shape.getLeft() + x][shape.getTop() + y] = 1;
}
}
}
}
5.1.6 判断满行及消行
如果某一行没有空白,则这一行就是满行。满的那行上面所有的行整体下移一行就是消除这个满行。代码如下:
private void deleteFullLine() {
for(int y=Global.HEIGHT-1; y=0; y--) {
boolean full = true;
for(int x=0; xGlobal.WIDTH; x++) {
if(zaw[x][y] == 0) {
full = false;
您可能关注的文档
最近下载
- 除颤仪的使用方法及操作流程PPT课件.pptx VIP
- (完整版)土建工程师招聘笔试题和答案.pdf VIP
- 网络意识形态工作.pptx VIP
- 2025广西公需科目考试答案(3套,涵盖95_试题)一区两地一园一通道建设;人工智能时代的机遇与挑战.pdf VIP
- 2025年班组长成本绩效管理能力竞赛考试题库资料500题(含答案).pdf VIP
- 除颤仪的使用方法及操作流程PPT课件.pptx VIP
- 六安市霍邱县2022-2023学年七年级下学期期中数学试题【带答案】.docx VIP
- 医防融合的课件.pptx VIP
- 生物大分子中IPTG的含量测定方法.pdf VIP
- 意识形态工作培训.pptx VIP
文档评论(0)