辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 图形计算器游戏推箱子.doc_第1页
辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 图形计算器游戏推箱子.doc_第2页
辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 图形计算器游戏推箱子.doc_第3页
辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 图形计算器游戏推箱子.doc_第4页
辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 图形计算器游戏推箱子.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 图形计算器游戏推箱子 摘要利用图形计算器的编程功能,在CASIO fx-CG20图形计算器平台上实现了推箱子游戏。本文中的程序利用了图形计算器中的矩阵来储存数据,通过模拟法实现推箱子游戏,提供撤消和恢复操作以及游戏的保存,实现了推箱子的地图编辑,并利用原创的压缩算法压缩储存推箱子游戏地图。关键词图形计算器;推箱子;前言 观察过以前的获奖论文,大多数的论文只利用到图形计算器的画图功能和小部分的编程功能。图形计算器编程功能的强大之处并未充分体现出来,而本文正是利用了图形计算器强大的编程功能,并使用了原创的压缩算法,从而在图形计算器上实现了推箱子游戏和推箱子游戏地图的压缩保存。研究目的利用图形计算器的编程功能,在图形计算器上实现推箱子游戏,从而锻炼编程能力和算法能力,加深对进制转换的理解,同时增强了CASIO图形计算器的娱乐功能,丰富同学们的课余生活。程序功能说明游戏功能:玩家可以通过CASIO图形计算器fx-CG20上的按键B、N、!和$或数学键2、4、6和8控制搬运工(显示为一个手指图案)上下左右移动,将箱子(蓝色方框)推到指定地点。(如图1)图 1游戏截图图 2编辑地图中地图编辑功能:玩家可以将原创的或搜集到的推箱子游戏地图输入到图形计算器中并储存起来。(如图2)程序提供粘滞功能,按下L键后移动的光标即可拖动出多个与当前位置相同的图案(包括空白)。本程序用一个包含1000个矩阵元素的矩阵储存地图,经过压缩后,储存上限大约为200幅地图。游戏保存功能:玩家可以在游戏途中将游戏保存起来。按u或l打开游戏菜单(如图3),选择“Save & Exit”即可保存并退出游戏,下次运行程序时,程序将自动读取游戏存档。(如图4)图 3图 4游戏存档读取中撤消和恢复功能:本程序能记录所有箱子发生的移动,玩家按d键即可撤消上一次的箱子移动。如果想恢复刚才的操作可以按p键,可以通过多次按p键将地图状态恢复到撤消前的状态。特色:1. 由于图形计算器的主储存空间有限(61KB),所以如果直接将地图的全部信息储存进矩阵的话,储存上限会非常小。本程序使用原创的压缩算法压缩地图之后,仅用47个矩阵元素就能储存一幅地图。这是整个程序最复杂的部分。2. 提供快捷键7和9,玩家可以立即跳到上一幅图或下一幅图。提供快捷键w和y,玩家可以读取其他地图和重新载入当前地图。3. 搬运工所指向的方向会根据搬运工移动而改变。研究过程1. 确定程序功能,请参考“程序功能说明”。2. 构思算法:本程序游戏功能实现方面使用模拟法。屏幕上的一格对应矩阵中的一个元素。在矩阵中,不同的数字有不同的含义,请见下表:数字01234含义空箱子目标位置在目标位置上的箱子墙需要记录的数据:搬运工的坐标、未完成的目标位置个数(即上面没有箱子的目标位置个数)、当前地图编号地图保存的实现:需要压缩储存的原因:屏幕显示的方格为217,共147个方格,而每个矩阵(默认为只储存实数)储存所占用的空间大小为36 B+矩阵元素个数12 B(字节),即每个矩阵元素占用12 B的空间。如果采用直接储存的方法,一幅地图所用的空间为:B。而CASIO fx-CG20图形计算器的主内存大小为61 KB,约为61000 B,所以忽略其他数据储存,采用直接储存地图的方法最多只能储存幅地图,亦即实际上只能储存不足30幅地图。压缩思想一:忽略空白区域。考虑到所有地图都是一个封闭的不规则图形(即地图最外侧一定被墙包围),地图外围都是空白的区域,所以用一个最小的矩形覆盖地图,只记录下矩形的信息和矩形中的所有方格的信息即可。压缩思想二:一个矩阵元素储存多个方格信息。由于一个方格的种类只有五种,把每一个方格视为一位的五进制数,将多个方格所对应的五进制数连成一个长五进制数,并转换为十进制数储存在矩阵当中。因此,一个矩阵元素可以储存多个方格的数据。CASIO fx-CG20图形计算器中的十进制数能保存十位有效数字,如果多于十位有效数字,多余的有效数字会被去掉。所以用于记录地图数据的数字不能超过。5的整数次幂中,514为满足此要求的最大的数,所以矩阵元素最多可以储存一个14位的五进制数,即一个矩阵可以储存14个方格的信息。而,所以最多只需11个矩阵元素就储存一幅地图。储存格式:为了不浪费每个矩阵元素,需要将储存数据连续储存在一个矩阵。由于不同大小的地图所占的元素个数不同,所以需要记录储存数据的起始位置,也就是数据的地址。同时又需要记录上面提到的矩形的信息和搬运工的起始位置。为了节约空间,所以将信息整合起来储存到一个矩阵元素当中,并将这些数据储存到一个矩阵当中,下文称之为“地图索引”数据。地图索引信息整合方法:根据模运算的基本理论,对于任意一个整数n,一定存在等式,其中,且。由模运算的定义可知。因为如果给定p的话,n的分解是唯一的。令r为将要整合的信息,p为r的可能的状态总数,k则为之前其他信息整合得出的结果。P和Q为矩形纵坐标范围,U和V为矩形横坐标范围,X和Y为搬运工的起始位置的坐标,A和B为数据地址。其中。只考虑P、Q、U、V、X、Y,这六个信息共有种状态,也就是说数据地址的状态数可以达到3148种,超出这个范围之后,数据的地址就无法记录了。最后可以得出这样一个计算公式:地图读取和保存实现细节:由于储存和读取时,读取矩阵和编(解)码的方向都是相反的。本程序保存地图时,从右往左,从下往上编码地图,将五进制转换为十进制,写入到矩阵时,由前往后写入,并记录完成编码时A和B的值,即最后一个地图数据的位置。读取地图时,解码出A和B的值,从矩阵中(A,B)开始往前读取地图数据,而地图显示时,玩家就可以看到地图是从左往右,从上往下地显示的,这也是地图数据的解码方向。游戏保存实现:储存方式与地图保存类似,不同在于地图信息和地图索引储存在一个固定的地方,还要记录存档的关卡数。游戏的撤消和恢复功能实现:用一个矩阵储存被推动的箱子的坐标和按下的按键(可以从中获取箱子推动的方向)。3. 使用图形计算器编程实现。4. 进行程序调试。5. 游戏试用。具体实现步骤如下:1. 打开图形计算器,按1进入“计算矩阵”模式。2. 按e进入矩阵存储器。并创建矩阵:矩阵名尺寸用途Mat A239程序运行时记录地图信息Mat E1002实现撤消和恢复功能时,用于记录箱子移动情况Mat G2001地图索引信息的储存Mat H793按键判断Mat I10010储存地图Mat H的初始化:第27行为1,0,2;第28行为0,-1,1;第37行为0,1,3;第38行为-1,0,4;第52行为1,1,-1;第53行为1,0,2;第54行为1,-1,-1;第62行为0,1,3;第64行为0,-1,1;第72行为-1,1,-1;第73行为-1,0,4;第74行为-1,-1,-1;其余矩阵元素为0。3. 返回主菜单,进入“程序”模式。4. 创建程序“PUSHBOX”,代码请参考“程序代码分析”或附件。5. 创建程序“PEDIT”,代码请参考“程序代码分析”或附件。6. 创建程序“PSAVE”,代码请参考“程序代码分析”或附件。7. 创建程序“PLOAD”,代码请参考“程序代码分析”或附件。8. 创建程序“NUMSTR”,代码请参考“程序代码分析”或附件。程序代码分析为了便于阅读和交流,笔者将由计算器转换成txt文件得出的代码加以修改并增加缩进,同时还添加了程序注释。如需将代码导入计算器中,请参见附件。一、 主程序PUSHBOXProgramMode:RUN_Mat _A,E,G,H,IStr 1:Str 2Str 3:Str 4Str 5Str 1记录的是墙的图案,Str 2记录的是目标位置的图案,Str 3记录的是箱子的图案,Str 4记录的是当前搬运工的图案,Str 5记录的四个方向的搬运工的图案Mat I1,3=Goto 2如果有游戏存档,则自动读取Lbl 1If Mat I1,1:Then 判断计算器中是否存有地图Mat I1,1r矩阵I的(1,1)记录的是总共有多少幅地图Prog NUMSTR用程序NUMSTR将地图数转换为字符串Input level(1+Str 6+)?L询问想要读取的关卡,提示关卡数范围LMat I1,1=Goto 1输入有误,再次询问Else Red Locate 8,4,No mapChar!StopIfEndGoto 3Lbl 2:0L:Lbl 3Prog PLOAD读取地图If Mat AX,Y=2显示搬运工Then Red Locate X-1,Y-1,Str 4Else Green Locate X-1,Y-1,Str 4IfEndLr:Prog NUMSTRLevel +Str 6Str 6字符串6用于游戏菜单标题的显示,提示当前关卡数P记录最后一次箱子移动信息的储存位置,Q记录的是开始撤消时箱子移动信息的储存位置0P:0QWhile MM为剩余目标个数,不为0时,执行游戏循环Do按键获取循环GetkeyKLpWhile K=0If Mat HK,3=1 And Mat HK,3Mat AX+E,Y+F=0 Or Mat AX+E,Y+F=2=1O如果搬运工前方有箱子,判断箱子可否推动If T=0 Or T=2 Or O:Then搬运工可以发生移动If S=2搬运工原位置的图案的恢复Then Red Locate X-E-1,Y-F-1,Str 2Else Locate X-E-1,Y-F-1, IfEndIf T=2 Or T=3搬运工的再显示Then Red Locate X-1,Y-1,Str 4Else Green Locate X-1,Y-1,Str 4IfEndIf T=1 Or T=3:Then推动了箱子,记录箱子被推动的信息用于撤消操作Mat AX,Y-1Mat AX,YMat AX+E,Y+F+1Mat AX+E,Y+FP+1P:0Q10X+YMat EP,1KMatEP,2T=3=M+1M判断箱子是否推到了目标位置上If Mat AX+E,Y+F=3:Then M-1MRed Locate X+E-1,Y+F-1,Str 3Else Blue Locate X+E-1,Y+F-1,Str 3IfEndIfEndElse 搬运工无法前进,搬运工坐标的回退和显示更新X-EX:Y-FYIf S=2Then Red Locate X-1,Y-1,Str 4Else Green Locate X-1,Y-1,Str 4IfEndIfEndElse If K=74:Then 按下了数字键7,跳到上一幅图Locate 1,1,Pre Level:L-1LL=0=Mat I1,1LLocate 1,2,LGoto 3Else If K=54:Then 按下了数字键9,跳到下一幅图Lbl 5Locate 1,1,Next LevelL+1LLMat I1,1=1LLocate 1,2,LGoto 3Else If K=47 And P:Then 按下d键,进行撤消操作Q=0=PQIf Mat AX,Y=2Then Red Locate X-1,Y-1,Str 2Else Locate X-1,Y-1, IfEndInt (Mat EP,1/10)X从矩阵E中获取上一次箱子移动的信息MOD(Mat EP,1,10)YMat EP,2KMat HK,1EMat HK,2FStrMid(Str 5,Mat HK,3,1)Str 4P-1PMat AX,Y+1Mat AX,YMat AX+E,Y+F-1Mat AX+E,Y+FIf Mat AX,Y=3:Then 箱子回退到目标位置上,M减少1M-1MRed Locate X-1,Y-1,Str 3Else Blue Locate X-1,Y-1,Str 3IfEndIf Mat AX+E,Y+F=2:Then 箱子从目标位置中退出来M+1MRed Locate X+E-1,Y+F-1,Str 2Else Locate X+E-1,Y+F-1, IfEndX-EX:Y-FYIf Mat AX,Y=2Then Red Locate X-1,Y-1,Str 4Else Green Locate X-1,Y-1,Str 4IfEndElse If K=48 And PGoto 3按下y键,重新载入当前地图K=69=Goto 1按下w键,读取其他地图IfEnd:IfEnd:IfEndIfEnd:IfEnd:IfEndFor 1I To 50:NextWhileEnd游戏通关,显示菜单Pass +Str 6Str 6Menu Str 6,Next level,5,Exit,7Lbl 6:(-)LL将变量L取相反数,以表示游戏保存“2i”为程序PSAVE的调用标记,表示这是程序调用,不是程序的单独运行,以防误操作使程序运行导致数据被意外修改2i:Prog PSAVELbl 7二、 子程序PSAVE此子程序用于地图或游戏的保存ProgramMode:RUNAns2i=Stop:0判断是否有程序调用标记从四个方向向地图逼近,以忽略地图周围的空白区域,P、Q、U、V记录的是刚好能覆盖地图的最小矩阵的信息0PFor 2I To 22For 2J To 8If Mat AI,J:Then IP:BreakIfEndNextP=BreakNext0QFor 22I To 2 Step (-)1For 2J To 8If Mat AI,J:Then IQ:BreakIfEndNextQ=BreakNext0UFor 2J To 8For 2I To 22If Mat AI,J:Then JU:BreakIfEndNextU=BreakNext0VFor 8J To 2 Step (-)1For 2I To 22If Mat AI,J:Then JV:BreakIfEndNextV=BreakNext判断是游戏的保存还是地图的保存If L0:Then 1A:4BA和B记录数据储存位置,游戏存档保存的位置为(1,4)Else If Mat GL,1 And LMat I1,1:Then 地图要保存的位置上已有数据,判断两图储存所占空间大小是否相等Int (Mat GL,1/3148)RMOD(R,7)-MOD(Int (R/7),7)+1SInt (R/49)R(MOD(R,21)-MOD(Int (R/21),21)+1)*STIf MOD(T,14)Then Int (T/14)+1TElse T/14TIfEnd(Q-P+1)*(V-U+1)SIf MOD(S,14)Then Int (S/14)+1SElse S/14SIfEndIf ST:Then所占储存空间不相等,则不储存该地图Maps size is unfitReturnIfEndElse 添加新地图If L=1:Then 2A:5B第一幅地图的储存起始位置Else 从上一幅图的储存结束位置计算出此次储存的开始位置MOD(Mat GL-1,1,3148)+1AMOD(A,10)+1BInt (A/10)+1AIfEnd:IfEnd:IfEndMOD(Q-P+1)*(V-U+1),14)C计算出第一个矩阵元素应该储存的方格个数C=0=14C0R对地图进行编码For QI To P Step (-)1For VJ To U Step (-)1R*5+Mat AI,JRC-1C储存满14位的五进制,写入到矩阵中,并跳到下一个储存位置If C=0:ThenRMatIA,B:B+1B14C:0RIf B=11:ThenA+1A:1BIfEndIfEndNextNext保存地图索引信息If L0:Then(X+21Y-44)*21+P-2)*21+Q-2)*7+U-2)*7+V-2)*3148+10A+B-12Mat GL,1Else (X+21Y-44)*21+P-2)*21+Q-2)*7+U-2)*7+V-2)*3148+10A+B-12Mat I1,2(-)LMat I1,3记录游戏存档的关卡数IfEnd三、 子程序PLOAD此子程序用于地图或游戏存档的读取ProgramMode:RUNIf L:ThenMat GL,1RElse 读取游戏存档信息,并标记删除存档Mat I1,2RMat I1,3L0Mat I1,3IfEnd解码索引信息MOD(R,3148)BInt (B/10)+1AMOD(B,10)+1B: Int (R/3148)RMOD(R,7)+2V: Int (R/7)RMOD(R,7)+2U: Int (R/7)RMOD(R,21)+2Q: Int (R/21)RMOD(R,21)+2P: Int (R/21)RMOD(R,21)+2XInt (R/21)+2Y初始化矩阵AClrTextFill(0,Mat A)For 1I To 234Mat AI,14Mat AI,9NextFor 2I To 84Mat A1,I4Mat A23,INextMat IA,BR0C:0MFor PI To QFor UJ To V解码地图数据MOD(R,5)DDMatAI,JInt (R/5)RC+1CIf C=14:Then0C修改A和B,跳到前一个储存位置B-1BIf B=0:ThenA-1A:10BIfEndMat IA,BRIfEnd在屏幕上显示地图If D=4:Then Locate I-1,J-1,Str 1Else If D=2:Then Red Locate I-1,J-1,Str 2Else If D=1:ThenBlue Locate I-1,J-1,Str 3:M+1MElse D=3=Red Locate I-1,J-1,Str 3IfEnd:IfEnd:IfEndNextNext四、 地图编辑器PEDIT此程序用于编辑、保存、删除或修改推箱子游戏地图ProgramMode:RUNStr 1: Str 2Str 3:Str 40L:(-)1S显示菜单,由于地图是连续储存的,所以只能删除最后一幅地图如果计算器上没有任何地图,则直接进入地图编辑Mat I1,1=Menu Editor,New map,1,Change map,2,Del last map,8Lbl 1Fill(0,Mat A)11X:4YGoto 3Lbl 2Input maps number?LLMat I1,1=Goto 2Prog PLOADX-1X:Y-1YLbl 3For 1I To 50:NextWhile 1编辑循环Do按键获取循环Locate X,Y, 变量S记录粘滞状态If S=0粘滞状态时,字符用蓝色显示Then Blue Locate X,Y,Str 4Else Red Locate X,Y,Str 4IfEndGetkeyKLpWhile K=0If Mat HK,3:Then 按下了方向键Mat AX+1,Y+1T恢复原位置的显示If T=4:Then Locate X,Y,Str 1Else If T=2:ThenRed Locate X,Y,Str 2Else If T=1:ThenBlue Locate X,Y,Str 3Else If T=3:ThenRed Locate X,Y,Str 3Else Locate X,Y, IfEnd:IfEnd:IfEnd:IfEnd修改光标坐标X+MatHK,1XY+MatHK,2Y判断边界If X=0:Then 21XElse X=22=1X:IfEndIf Y=0:Then 7YElse Y=8=1Y:IfEnd如果为粘滞状态,则用变量S的数值覆盖当前方格对应矩阵上的数值S=0=SMat AX+1,Y+1Else If K=63 Or K=29:Then 按下u或5,将当前方格变为墙4Mat AX+1,Y+1Else If K=43 Or K=39:Then按下m或y,将当前方格变为目标位置上的箱子或目标位置If Mat AX+1,Y+1=1Then 3Mat AX+1,Y+1Else 2Mat AX+1,Y+1IfEndElse If K=42 Or K=49:Then按下+或r,将当前方格变为箱子或目标位置上的箱子If Mat AX+1,Y+1=2Then 3Mat AX+1,Y+1Else 1Mat AX+1,Y+1IfEndElse If K=44 Or K=47:Then 按下P或d,将当前方格变为空地0Mat AX+1,Y+1Else If K=41 Or K=48:Then按下n或p,将当前方格变为目标位置上的箱子3Mat AX+1,Y+1Else If K=78:Then 按下L,进入或退出粘滞状态If S=0:Then (-)1SElse Mat AX+1,Y+1SIfEndElse K=31=Break按下l完成编辑IfEnd:IfEnd:IfEnd:IfEnd:IfEnd:IfEnd:IfEndStrMid(,Mat AX+1,Y+1+1,1)Str 4更新光标图案If Mat HK,3=0:Then 不发生移动时增加延时For 1I To 50:NextIfEndWhileEndM用于统计箱子个数,N用于统计目标位置个数(统计M和N时均忽略目标位置和箱子重叠的方格)0M:0NFor 2I To 22For 2J To 8If Mat AI,J=1Then M+1MElse Mat AI,J=2=N+1NIfEndNextNext最后光标应停在搬运工的起始位置上,以表示搬运工的起始位置,所以光标不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论