编程之美:第一章 1.17俄罗斯方块游戏
来源:互联网 发布:如何重新设置网络账号 编辑:程序博客网 时间:2024/05/16 15:29
/*俄罗斯方块游戏:1玩家操作:90度旋转积木块,左右移动积木块,让积木加速落下2积木落到最下方或则在其他积木上无法移动时,会固定在该处,新的积木落下3某行格子全部填满,该行小时,并成为玩家得分。一次删除的行越多,的扥越多4积木堆积到区域上方,游戏结束1如何用数据结构表示游戏的各种元素?如每个可活动的积木,在底层的积木2现在已经知道底层积木的状态,然后在游戏区域上方出现新的积木,如何移位?3有预览窗口时,可看到积木什么新装。比如下一个积木是长条时,就不要把最深的峡谷堵住。有了该新参数,如何改写程序?分析:每一块积木落下时,可以做:1旋转到合适方向,2水平移动到某一列,3垂直下落到底部1用一个二维数组area[M][N]表示M*N的游戏区域,数组中值为0表示空2积木块也用数组表示,需要用统一尺寸的数组容纳所有可能的积木块,4*4的数组,积木块一共7种,每种4个方向,定义BlockSets[7][4],表示7中积木块的4个旋转方向的形状,编译时将这个数组的值预计算好,程序中可以直接使用可以得到旋转后的形状rotateBlock = BlockSets[n][m%4],n是特定的方块序号,m是旋转的次数。判断方块的水平移动范围,记录积木块左上角相对于游戏区域的位移为(offset X,offset Y),平移范围即Offset X的取值范围由于积木块可能无法占满4*4区域的每一列,因此横向位移x的值可能小于0.首先计算积木块所占区域的最小列minCol和最大列maxCol,则Offset X的取值范围为[0-minCol,M-1-maxCol],L型积木块占据的最小列和最大列分别是1和2,因此水平移动范围为[-1,M-3]用位移坐标,计算出积木块是否和游戏区域中已有的方块重叠。定义minRow和maxRow为积木块所占区域的最小行和最大行while(OffsetY < N - maxRow){ OffsetY++; Flag = 0; For i = 0 to 3//判断是否和已有方块重合 For j = 0 to 3 if(Block[i][j] != 0 && Area[OffsetX + i][OffsetY + j] != 0) { Flag = 1; } if(Flag == 1) { return OffsetY - 1;//如果有重合,则不能下落到该行 }}可以下落的最低高度取决于最先接触到已有方块的那一列,可以计算每一列触底高度的最小值,即min0<=i<=3(di - maxRowi),di是该列堆积方块的高度Dim configurations As ArrayFor i = 0 To 3//穷举所有旋转方向,得到各种旋转方式下的积木块形状 rotateBlock = GetRotateBlock(currentBlock,i);[minCol,maxCol] = CalOffsetXRange(rotatedBlock);//计算横向坐标可以移动的范围For j = minCol To maxCol y = CalcBottomOffsetY(rotatedBlock,j);//计算下落停留的纵向位移configurations.Add(i,j,y);//保存当前格局判断格局更好例如消除2行,则加上3分,如果形成一个洞,扣除20分1一次性多消行,同时消除1,2,3,4行,分别加1,3,7,13分2不要形成洞,每增加一个洞,扣除4分,超过5个洞,额外扣除15分3不要摆放太高,放置行高于M*3/5,则每高一行,扣除两分积分规则的伪代码Score = 0CopyTo(area,tempArea) // 复制一份游戏区域 PasteTo(block,tempArea) // 将积木块放入复制的游戏区域中linCount = 0;For y = OffsetY to OffsetY + 4//消行一定发生在放入积木块的四行中 if(RowIsFull(tempArea,y)){ lineCount++;}Score += ClearLineScore[lineCount];ClearLines(tempArea);//统计洞数前需要先消行OffsetY += lineCont;//更新列下移位置holeCount = 0;For x = OffsetX To OffsetX + 4//增加的洞一定出现在放入积木块的4列(想不到,因为洞是按列计算的) holeCount += CalcHoles(tempArea,x) - CalcHoles(area,x);Score -= holeCount*4;//每个洞扣除4分if(holeCount > 5){ Score -= 15;}if(OffsetY < M*3/5){ Score = (M*3/5 - OffsetY)*2;//位置过高则扣分}return Score;预知下一形状时,同样采用积分制,选取最好的格局。注意,摆放第二块积木前,第一块积木可能会消行,因此需要用额外空间处理。穷举法。需要用剪枝来降低复杂度,穷举一个积木的各种格局,计算每种格局得分,然后只选取前N个最高得分的格局进行后续计算。*/
0 0
- 编程之美:第一章 1.17俄罗斯方块游戏
- 读书笔记之编程之美 - 1.17 俄罗斯方块游戏
- 编程之美1.17——俄罗斯方块游戏
- 编程之美-俄罗斯方块游戏方法整理
- 编程之美----俄罗斯方块
- 编程之美第一章游戏之乐学习总结
- 编程之美:第一章游戏之乐-饮料供货问题
- 编程之美:第一章 1.11一排石头的游戏
- 编程之美:第一章 1.12拈石游戏分析
- 编程之美:第一章 1.14连连看游戏设计
- 编程之美:第一章 1.16 24点游戏
- 编程之美: 第一章 1.16 24点游戏
- 编程之美:第一章 1.13 NIM两堆石头的游戏
- 编程之美:第一章 1.6饮料供货
- 编程之美之24点游戏
- 编程之美读书笔记之象棋游戏
- 编程之美1.11之 石头游戏
- 编程之美 - NIM“拈”游戏分析
- 智慧北京3
- 编程修养(四)
- JS 解析JSON
- Java实现文件的RSA和DES加密算法
- webstrom 安装教程 配置js调试
- 编程之美:第一章 1.17俄罗斯方块游戏
- 剖析Spring自动注入中的注解
- c# ConcurrentQueue
- Swing 中各种提示框的工具类
- Java 类中各成分加载顺序 和 内存中的存放位置
- 通过位置找到ListView中的某个item的View
- 编程修养(五)
- 【转】通过编程自动化增加CSDN博客的访问量
- 异常