学习C#从俄罗斯方块开始(二).doc_第1页
学习C#从俄罗斯方块开始(二).doc_第2页
学习C#从俄罗斯方块开始(二).doc_第3页
学习C#从俄罗斯方块开始(二).doc_第4页
学习C#从俄罗斯方块开始(二).doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

学习C#从俄罗斯方块开始(二)俄罗斯方块的规则和算法的简单实现 分类: C#开发 2010-02-09 13:30 3793人阅读 评论(50) 收藏 举报 根据上节我们规划好的开发过程,这节我们来实现一个简单的俄罗斯方块程序。当然完成俄罗斯方块的Demo是我们这节课的最终目标。在实现这个目标的同时,我还要跟大家一起去分析俄罗斯方块的需求、算法、具体开发的步骤。并且最终选择C#语言来实现这个demo。下面废话少说,翠花,上内容!第一步、 思考俄罗斯方块的游戏规则: 任何时候我们去开发或者设计一个项目,首先需要思考的就是需求。 俄罗斯方块中,我们要做一个俄罗斯方块的游戏,那么俄罗斯方块游戏的游戏规则就是我们的需求。所以我们必须深入了解俄罗斯方块游戏的游戏规则。俄罗斯方块游戏可能产生下面五种形状的方块。这些方块有我们的方向键的控制可以产生旋转,左右移动和加速前进等,往下掉,只到遇到下面已经有方块挡住停下来。如果一行完全排列满,则会消掉,如果排列到了顶部,则会失败。第二步、把我们的“需求”从计算机的角度去分析: 我们对任何一个项目的最初的需求是从使用者的角度去描述这个项目的,这种描述基本上涵盖了使用者可能用到的功能和要求。我们在做一个项目,特别是为一个非计算机专业做一个项目的时候,客户的描述,或者业务人员承接到项目的时候,他们和客户的沟通,基本上是基于这种初级的需求的,这种初级的需求的有点是:客户和业务人员比较容易理解,沟通起来非常的方便。但是他的缺点是非计算机专业用语,不够规范和严谨。不能拿这个文档和需求来直接要求开发人员。需要一个对市场(客户)比较了解,同时又是资深的程序员把这个需求编程一个专业开发人员相对比较容易理解的需求。甚至直接编程开发的具体思路。然后有开发人员去实现。我们的小游戏实在是太小了,不可能分出来业务人员、项目规划人员、项目架构、程序开发。所以这一切也都有我们开发者一个人独揽了。不过麻雀虽小,五脏俱全哦。我们不是说了嘛,通过学习俄罗斯方块掌握项目开发的经验呢。所以希望各位看客认真的看这些个步骤,如果我哪里说错了,欢迎拍砖。 a、关于俄罗斯方块游戏中方块的产生。我们假设产生四种方块。实际上俄罗斯方块产生的方块要多余四个。但是咱们这节课是做一个Demo,所以先做四个,具体的四个请见图片1。(因为CSDN不能上传图片,我上传到下载中去了。大家可以下载使用,期待csdn可以正常的上传图片)。 b、俄罗斯方块当需要变化方块的时候,每个方块需要顺时针旋转90,具体可能产生的形状也见图一。从数学,或者计算机的角度来看:我们根据图1来看,我们可以把所有的方块看成一个4*4的二维数组。把有“砖”的地方表示为1,没有“砖”的地方表示为0,所以所有的的方块都可以表示为图二的样式。 c、我们也可以把背景看成是14*20的二维数组。 那么俄罗斯方块的需求,站在程序员的角度上就可以变成:我们随机从方块的4个4*4的矩阵中挑选出来一个,并且随机的挑选一个他的初始化状态(关于状态变化,我们同样可以把他们表示在一个4*4的矩阵中)。然后这个被挑选的矩阵,在一个14*20的矩阵中不断的按照一种速度进行往下运动。我们同时可以使用方向键,对这个举证进行控制,使得它可以左右运动,同时可以循环的变化他的状态。如果这个矩阵在运动的方向上遇到了数值为1的时候则停止运动,在左右运动上表现为不能移动,在往下运动的时候则表现为这个方块运动的结束。把这个矩阵的数值复制到背景矩阵中去。这个时候检查背景矩阵,如果背景矩阵中有一个行全部为1,那么在y轴上比该行小的所有行向下移动一行,用户得分增加100。同理,检查所有的行,并且做同样动作。检查完成后,进入下个方块的随机挑选,下落。当某个方块下落完成的时候。他的y坐标在背景中为0的时候。游戏结束。作为游戏的界面,我们需要在游戏的状态发生改变的时候,把背景矩阵和运动矩阵都绘制出来。数值为0的地方不绘图,数值为1的地方绘制图片。-到此为止。我们的游戏已经用人类语言。从计算机的角度来说分析完成了。剩下的就是使用计算机语言表达出来了,不管你是学习的C#,C语言,C+,Delphi,Java,python,Js,VB,(汇编我不懂,暂时不包括吧)。只要你能理解了上述的“思路”。那么你可以用任何语言来写出来。我真希望用所有的语言都给大家写写,把IT老祖宗的那句:“编程靠的是思想(想法,思路),语言不重要。的真理来验证下,可怜CSDN的blog写起来太麻烦了,而且我老婆催着我赶紧回家过年的,所以这次就暂时使用C#来给大家实现下。我们就从一个C#盲来开始看看需要如何学习,如何实现。 首先、确定我们要用的语言是C#,矩阵的运算需要多是多维数组,数组的运算多需要循环。另外对多种情况的判断需要if,switch等分支判断语句,我们的方块定时运动,需要用到timer控件。所以在开始咱们的项目前,请确保,你已经对C#的语法有了基本的了解,尤其对数组的操作、if语句,for循环语句,switch语句要会用。同时对基本的button、timer控件进行基本的了解。如果你在使用其他语言编程,找你所使用的语言中的类似的东西。其他的东西至少这个项目中不会经常用到。即时用到,查查即可。这个可能就是所谓的“语言没有思想重要吧”。如果你还不懂,去看看. 其次、俄罗斯方块需要绘制图形,这个需要你对C# GDI+有所了解。在其他语言中可能是GDI或者API了,这个你只需要google下即可。如果GDI+编程你还不懂,那么来下载个教程吧。我已经给大家上传到:/source/2057311 上面的两个条件如果你已经具有了。那么开始我们的C#俄罗斯方块的代码之旅途吧。 不过在代码开始之前,还是先看看我们的界面吧。请看界面图; 下面我们来看代码。首先定义我们的砖块和背景吧。view plaincopy to clipboardprint?1. #region定义砖块inti,j,y,xTricks:i为那块砖,j为状态,y为列,x为行 2. privateint,Tricks=3. 4. 1,0,0,0,5. 1,0,0,0,6. 1,0,0,0,7. 1,0,0,08. ,9. 10. 1,1,1,1,11. 0,0,0,0,12. 0,0,0,0,13. 0,0,0,014. ,15. 16. 1,0,0,0,17. 1,0,0,0,18. 1,0,0,0,19. 1,0,0,020. ,21. 22. 1,1,1,1,23. 0,0,0,0,24. 0,0,0,0,25. 0,0,0,026. 27. ,28. 29. 30. 1,1,0,0,31. 1,1,0,0,32. 0,0,0,0,33. 0,0,0,034. ,35. 36. 1,1,0,0,37. 1,1,0,0,38. 0,0,0,0,39. 0,0,0,040. ,41. 42. 1,1,0,0,43. 1,1,0,0,44. 0,0,0,0,45. 0,0,0,046. ,47. 48. 1,1,0,0,49. 1,1,0,0,50. 0,0,0,0,51. 0,0,0,052. 53. ,54. 55. 56. 1,0,0,0,57. 1,1,0,0,58. 0,1,0,0,59. 0,0,0,060. ,61. 62. 0,1,1,0,63. 1,1,0,0,64. 0,0,0,0,65. 0,0,0,066. ,67. 68. 1,0,0,0,69. 1,1,0,0,70. 0,1,0,0,71. 0,0,0,072. ,73. 74. 0,1,1,0,75. 1,1,0,0,76. 0,0,0,0,77. 0,0,0,078. 79. ,80. 81. 82. 1,1,0,0,83. 0,1,0,0,84. 0,1,0,0,85. 0,0,0,086. ,87. 88. 0,0,1,0,89. 1,1,1,0,90. 0,0,0,0,91. 0,0,0,092. ,93. 94. 1,0,0,0,95. 1,0,0,0,96. 1,1,0,0,97. 0,0,0,098. ,99. 100. 1,1,1,0,101. 1,0,0,0,102. 0,0,0,0,103. 0,0,0,0104. 105. ; 106. 107. #endregion 108. #region定义背景 109. privateint,bgGraoud=110. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,111. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,112. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,113. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,114. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,115. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,116. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,117. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,118. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,119. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,120. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,121. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,122. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,123. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,125. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,126. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,128. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,129. 0,0,0,0,0,0,0,0,0,0,0,0,0,0130. ; 131. #endregion砖块定义好了,我们还需要定义几个系统在变化的时候需要的全局变量。我在注视中写清楚了,不絮叨了。view plaincopy to clipboardprint?1. privateint,CurrentTrick=newint4,4;/当前的砖块 2. /CurrentTrickNum当前砖块的数目,CurrentStatusNum当前状态,CurrentX当前x,CurrentY当前y,Sorce分数 3. privateintCurrentTrickNum,CurrentStatusNum,CurrentX,CurrentY,Sorce;4. privateintTricksNum=4;5. privateintStatusNum=4;6. privateImagemyImage;7. privateRandomrand=newRandom();定义好了变量,我们来想想我们的几个函数吧。首先是变化砖块,变化砖块其实就是变化砖块的状态,把砖块数组中的状态位进行循环变化即可:view plaincopy to clipboardprint?1. / 2. /变化方块 3. / 4. privatevoidChangeTricks()5. 6. if(CurrentStatusNum3)7. 8. CurrentStatusNum+;9. 10. else11. 12. CurrentStatusNum=0;13. 14. for(inty=0;y4;y+)15. 16. for(intx=0;x4;x+)17. 18. CurrentTricky,x=TricksCurrentTrickNum,CurrentStatusNum,y,x;19. 20. 21. 再接着是检测砖块是否可以向下移动、向左移动、向右移动。思路很简单。看看他的要运动的方向的背景下个位置是不是为1.如果不是。那么就返回true.否则是false:view plaincopy to clipboardprint?1. / 2. /检测是否可以向下了 3. / 4. / 5. privateboolCheckIsDown()6. 7. for(inty=0;y4;y+)8. 9. for(intx=0;x=20)15. 16. returnfalse;17. 18. if(x+CurrentX=14)19. 20. CurrentX=13-x;21. 22. if(bgGraoudy+CurrentY+1,x+CurrentX=1)23. 24. returnfalse;25. 26. 27. 28. 29. returntrue;30. 31. / 32. /检测是否可以左移 33. / 34. / 35. privateboolCheckIsLeft()36. 37. for(inty=0;y4;y+)38. 39. for(intx=0;x4;x+)40. 41. if(CurrentTricky,x=1)42. 43. if(x+CurrentX-10)44. 45. returnfalse;46. 47. if(bgGraoudy+CurrentY,x+CurrentX-1=1)48. 49. returnfalse;50. 51. 52. 53. 54. returntrue;55. 56. / 57. /检测是否可以右移 58. / 59. / 60. privateboolCheckIsRight()61. 62. for(inty=0;y4;y+)63. 64. for(intx=0;x=14)69. 70. returnfalse;71. 72. if(bgGraoudy+CurrentY,x+CurrentX+1=1)73. 74. returnfalse;75. 76. 77. 78. 79. returntrue;80. 下面是绘制函数:没啥思路,循环画出即可 view plaincopy to clipboardprint?1. privatevoidDraw()2. 3. Graphicsg=Graphics.FromImage(myImage);4. g.Clear(this.BackColor);5. for(intbgy=0;bgy20;bgy+)6. 7. for(intbgx=0;bgx14;bgx+)8. 9. if(bgGraoudbgy,bgx=1)10. 11. 12. g.FillRectangle(newSolidBrush(Color.Blue),bgx*20,bgy*20,20,20);13. 14. 15. 16. /绘制当前的图片 17. for(inty=0;y4;y+)18. 19. for(intx=0;x4;x+)20. 21. if(CurrentTricky,x=1)22. 23. g.FillRectangle(newSolidBrush(Color.Blue),(x+CurrentX)*20,(y+CurrentY)*20,20,20);24. 25. 26. 27. Graphicsgg=panel1.CreateGraphics();28. 29. gg.DrawImage(myImage,0,0);30. 下面的一个函数是比较重要的。向下运动函数。因为基本上向下运动的函数决定了下落的位置:基本思路其实很简单的。先检测是否可以向下下落,如果可以下落就下落了,如果不可以下落,那说明到底了。首先检测当前的坐标是不是为0,如果是,那么说明游戏结束了。否则。检测下。是否有满行的。如果有的,行平移然后并且可以增加积分,这一切完成以后,然后开始下个方块。view plaincopy to clipboardprint?1. / 2. /下落方块 3. / 4. privatevoidDownTricks()5. 6. if(CheckIsDown()7. 8. CurrentY+;9. 10. else11. 12. if(CurrentY=0)13. 14. timer1.Stop();15. MessageBox.Show(哈哈,你玩玩了);16. 17. return;18. 19. /下落完成,修改背景 20. for(inty=0;y4;y+)21. 22. for(intx=0;x4;x+)23. 24. if(CurrentTricky,x=1)25. 26. bgGraoudCurrentY+y,CurrentX+x=CurrentTricky,x;27. 28. 29. 30. CheckSore();31. BeginTricks();32. 33. 34. Draw();35. 好像忘记了如何开始向下落的哦。看代码:太容易了,不解释了。view plaincopy to clipboardprint?1. privatevoidBeginTricks()2. 3. /随机生成砖码和状态码 4. inti=rand.Next(0,TricksNum);5. intj=rand.Next(0,StatusNum);6. CurrentTrickNum=i;7. CurrentStatusNum=j;8. /分配数组 9. for(inty=0;y4;y+)10. 11. for(intx=0;x-1;y-)4. 5. boolisFull=true;6. for(intx=13;x-1;x-)7. 8

温馨提示

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

评论

0/150

提交评论