心得体会

俄罗斯方块心得体会

时间:2022-10-01 22:30:57 心得体会 我要投稿
  • 相关推荐

俄罗斯方块心得体会

  俄罗斯方块实训总结

俄罗斯方块心得体会

  这次实训即有收获,也有失落:

  1、俄罗斯方块程序勿促完成,有很多的bug,架构也有很多不合理的地方。虽然把所有的逻辑都进行的封装,但总感觉有些牵强附会。上课时,并没有讲任何的面向对象的内容,这样的代码让学生去理解实在是勉为其难。其实先让学生以面向过程的方法去编程,过一段时间再学面向对象或许对学生更为有利。 2、代码和逻辑过于复杂,一方面学生难于理解,以至于使很多的学生丧失了继续学习程序的勇气,打击了一大片。另一方面,学生敲错代码找老师解决,如果是语法错误还容易解决掉,但如果是逻辑错误就麻烦了,有时,一个加减号的错误就要花掉很多时间,这导至了教师的工作量大增。

  3、实现分数显示功能非常困难(这点是我没想到的)有几种解决方案,第一种是在界面上直接画分数,但需要传递多一个画板。第二种是使用事件(这样比较合理,但太难),事件本身就很难理解了。由于使用的Timer本身是一个多线程的Timer,还需掌握多线程的知识才能做出来,我的《C#语言参考视频》还没有做到多线程,这样就变得难上加难了。但这样也有一个好处,如果能实现,能学到并理解不少的东西。 4、在做程序时一直在考虑是否应该使用静态类,说白了就是把静态类当全局变量使用。最后是决定i用。但现在感觉还是应该使用的,至少改变参数时不用写任何代码就可以马上见到效果,也可以减少几百行的代码,有效使程序减肥。

  5、实训时看到每个学生都在埋头敲代码感到很欣慰,有部分同学回到宿舍还继续奋战。虽然代码完全是照视频抄的,可能不会理解到太多的东西,但至少让他们找到了学习和互助的感觉,这一点才是最重要的。

  这次实训有很多不足之处,需要改进。想了一下,大概制定了初步的解决方案,首先,程序代码不超过1000行,其次,不使用面向对象的编程方法:

  1、继续使用俄罗斯方块,去掉设置界面,XML存储,也就是把砖块样式和快捷键写死在程序里面。这样一半的代码就没了。另外再使用单色的砖块样式,这样就可以使用位运算实现部份逻辑,这样不但加快了程序的运行速度,算法变得简单,也减少了部份的代码。但这样做这个游戏就变得没有特点了,可玩性大大降低。而且再重做一遍这个视频好象也不太好。

  制作单机俄罗斯方块游戏心得

  前面说的是创建了Piece0, Piece1,Piece2,Piece3,Piece4,Piece5,Piece6.其中变化的方块,由于游戏开始和下一个方块出现时是随机得到不同的大方块的,在定义Piece时用changes属性(Protectec List> changes = new ArrayList<>())来储存变化的方块,所以要想随机的到一个方块,在Piece提供了一个geDefault()方法,并提供了一个随机产生数字的想要得到的变化的随机数属性random(protected Random random = new Random(); )。

  protected Random random = new Random();

  public List getDefault() {

  //从changes中随机得到其中一种变化

  int defaultChange = random.nextInt(changes.size());

  this.currentIndex = defaultChange;

  return changes.get(defaultChange);

  }

  在Piece1,Piece2,Piece3,Piece4,Piece5,Piece6类里添加下面的语句super.setSquares(getDefault());

  注意了前面只说了大方块和小方块的类。特别是小方块里的Image image属性且 前面创建了各个Piece的子类。每个子类都提供一个含有image构造器。只需从文件里读取图片就可以创建一个可以下降的大方块了。下面说说创建与显示大方块。新建一个PieceCreator接口专门用于创建大方块。(注:在这里我想不出书的作者为什么创建这个接口)并未接口提供了一个PieceCreatorImpl实现类

  public interface PieceCreator {

  /**

  * 在x和y坐标中创建一个Square对象

  */

  Piece createPiece(int x,int y);

  /**

  *返回一个Square对象

  */

  Piece getPiece();

  }

  为了创建一个真正带有图片的物快,很明显需要考虑的因素是:必须得到图片,为此在PieceCreatorImpl类提供了getImge(int key)方法。(关于参数key的加入待会看了后面会明白)。从文件里得到图片要有文件的读取操作。为了不用每次都去文件里读取一个Image对象,在PieceCreatorImpl里提供了一个Map类存储读取过的image对象

  Private Map images = new HashMap();

  但是对于Map里的图片又是从哪里来的呢?当然是读取文件的来的。所以有设计了一个ImageUtil类来读取图片

  public class ImageUtil {

  public static BufferedImage getImage(String imagePath) {//注意是静态方法

  try {

  //使用ImageIO读取图片

  return ImageIO.read(new File(imagePath));

  } catch (IOException e) {

  //读取图片发生异常,抛出GameException

  throw new GameException("read image error");

  }

  }

  }

  //于是map中的图片就是下面代码得来的。从map中得到图片对象,如果map中没有对应的图片对象,则创建

  private Image getImage(int key) {

  if(this.images.get(key)==null) {

  Image s = ImageUtil.getImage("images/square" + key+".jpg");

  this.images.put(key,s);//

  }

  return this.images.get(key);

  }

  (个人认为把图片放入map应该单独定义一个方法)

  得到了图片下面改创建把图片加入到Square里进而创建一个大方块了,注意由于文件里保留了七种不同颜色的图片(/

  /总共有七种颜色的方块

  private final static int COLOR_SIZE = 7;),

  所以获得图片时也是提供一个在PieceCreatorImplement类里提供了random属性

  (private Random random = new Random();)

  来随机读取一张图片,

  public Piece createPiece(int x, int y) {

  //随机得到一张方块图片

  Image image = getImage(random.nextInt(COLOR_SIZE));

  Piece piece = initPiece(image);

  return piece;

  }

  /**

  * 初始化各个大方快,随机创建各个大方框

  */

  public Piece initPiece(Image image) {

  Piece piece = null;

  int pieceType = random.nextInt(SQUARE_SIZE);

  if(pieceType == 0) {

  piece = new Piece0(image);

  }else if(pieceType == 1) {

  piece = new Piece1(image);

  }else if(pieceType == 2) {

  piece = new Piece0(image);

  }else if(pieceType == 2) {

  piece = new Piece3(image);

  }else if(pieceType == 3) {

  piece = new Piece4(image);

  }else if(pieceType == 5) {

  piece = new Piece5(image);

  }else if(pieceType == 6) {

  piece = new Piece6(image);

  }

  return piece;

  }

  需要注意的是,游戏中大方块出现的位置和移动的位置的实现是通过改变方块位置的纵横坐标来实现的,又由于实际上大方块是由小方块组成的,只要同时改变组成大方块的所有小方块的x和y 坐标就可以了,为此Piece提供了一以下方法

  //让Piece对象中所有的Square对象的x坐标都加上参数x

  public void setSquareXLocation(int x) {

  for(int i = 0;i

  //得到一个变化

  List change = this.changes.get(i);

  for(int j = 0;j

  Square s = change.get(j);

  s.setBeginX(s.getBeginX()+x);

  }

  }

  }

  //让Piece对象中所有的Square对象的y坐标都加上参数y

  public void setSquareYLocation(int y) {

  for(int i = 0;i

  //从变化容器里得到各个成有不同形状的大方块的容器

  List change = this.changes.get(i);

  for(int j = 0;j

  //得到容器里的小方块

  Square s = change.get(j);

  s.setBeginY(s.getBeginY()+y);

  }

  }

  }

 

 

 

 

【俄罗斯方块心得体会】相关文章:

支教心得体会_心得体会范文06-08

事故心得体会_心得体会范文06-15

听课心得体会_心得体会范文_04-15

公文心得体会培训心得体会04-04

心得体会01-10

心得体会10-09

心得体会作文优秀作文心得体会01-06

心得体会:李强员工精神心得体会10-07

素质拓展心得体会拓展心得体会,素质11-15

邮政员工工作心得体会_培训心得体会07-03