俄罗斯方块Java编写精髓
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
continueAction(); //继续游戏 pause = false; //设置暂停标记为false timer = new Timer(); //创建一个新的计时器对象 timer.schedule(new TimerTask(){ public void run() { softDropAction(); repaint(); } }, inteval, inteval); schedule(TimerTask task,long delay,long period) 安排指定的任务从指定的延迟后开始进行重复的固定延 迟执行 Inteval为间隔时间800ms;
action(); //启动软件 调用startAction()开始动作流程. 创建键盘按键监听对象new KeyAdapter(){ keyPressed(KeyEvent e); }; 如果有按键按下 完成时候(pressed)就会执行 VK_Q:quit(); //退出 VK_S:startAction(); //重新开始游戏 VK_C:continueAction(); //继续游戏 VK_P:pauseAction(); //暂停游戏 VK_DOWN:softDropAction(); //下落一格 VK_UP:rotateRightAction(); //旋转 VK_SPACE:hardDropAction(); //下落到底部 VK_LEFT moveLeftAction(); //左移一格 VK_RIGHT: moveRightAction();//右移一格
landToWall(); //着陆到墙 Cell[] cells = tetromino.cells; 遍历当前四格方块对象将每一个格子对象赋值给墙 wall[cell.getRow][cell.getCol] = cell destroyLines(); //销毁行数 遍历每行的格子,如果fullCells(row)(遍历当 前行的各自是否是满的)为true,调用 deleteLine(row)消除这行; lines++; 最后加成绩this.score += scoreTable[lines]; scoreTable[]为得分表
左移、右移
moveLeftAction(); //左移 先调用tetromino.moveLeft(); 如果出界,或者重合再调用tetromino.moveRight(); 在moveLeft方法中遍历当前对象cells中所有cell对 象 循环调用cell.leftMove();
moveRightAction();
coincide() //判断重合方法 Cell[] cells = tetromino.cells; 遍历当前四格方块对象的每个格子 如果(cell.getCol >= 0 && cell.getCol < COLS &&cell.getRow >= 0 && cell.getRow < ROWS&& wall[cell.getRow][cell.getCol]!=null)成立(在 长方形界面内部检查是否撞到其他方块),返回true. pauseAction(); //暂停游戏 timer.cancel(); //终止该计时器 pause = true; //将暂停标记设置为true
游戏结束
当方框到达顶端时 (Wall[0][4]!=null) ,判定游戏结束。 按下“S”可重新初 始化界面开始游戏
具体实现
Cell(格子类) Tetromino(四格方块类) 7个子类(T,I,O,S,Z,J,L) 一个内部类(State): 存放四个方块旋转时的坐标状态。 Tetris(俄罗斯方块类) extends Jpanel 逻辑处理及方法的具体实现
绘图方法(尹亮)
paint(Graphics g); //重写绘图方法 g.drawImage(background, 0, 0, null); //画背景 g.translate(15, 15); //将图形上下文的原点平移到 当前坐标系中的点 (x, y) 绘制墙,四格方块,下一个方块,成绩,已消除行 数,暂停/继续提示 如果游戏结束标记为true,绘制游戏结束的图片 paintWall(Graphics g); //绘制墙 将长方形区域划分成20行,10列.遍历每个方块对 象,若cell不为空g.drawImage(cell.getImage(), x-1, y-1, null); 图像大小x-1,y-1是图形看起来顺眼.
//右移的原理同上
下落(李有宁)
softDropAction(); //一步一步下落 if(canDrop())为true(检查当前方块是否能够 继续下落),则调用tetromino.softDrop();在 softDrop()中遍历cells对象调用cell.drop(); hardDropAction(); //瞬间下降 while(canDrop())为true(检查当前方块是否能 够继续下落),则调用tetromino.softDrop();在 softDrop()中遍历cells对象调用cell.drop(); 否则调用方法: landToWall(); // 着陆到墙 destroyLines(); // 销毁行数 checkGameOver(); // 检查游戏是否结束
paintTetromino(Graphics g); //绘制四格方块 如果没有正在下落的方块就不绘制,否则遍历四格 方块对象的四个小格子并绘制. paintNextOne(Graphics g); //绘制下一个方块 如果没有正在下落的方块,就不绘制,否则遍历随 机生成的下一个四格方块的四个小格子并绘制. paintScore(Graphics g); //绘制成绩 paintLines(Graphics g); //绘制已消除行数 paintPause(Graphics g); //绘制暂停/继续提示 以上3个方法均是先设置字体格式,颜色,位置再 绘制.
Cell
属性:row,col,Image 方法:drop(); // 向下降落一个单位 leftMove(); // 向左移动一个单位 rightMove(); // 向右移动一个单位
Tetromino
Cell[] cells = new Cell[4]; State[] states; //旋转状态 Index; //旋转下标 Protected class State {} ; //旋转状态类(内部类) 7个子类7种方块 rotateRight(); //向右旋转 rotateLeft(); //向左旋转 softDrop(); //下落 moveLeft(); //左移 moveRight(); //右移 RandomOne(); //随机生成一个四格方块
旋转,左移,右移(沈唯唯)
private int Index = 10000; 表示旋转状态下标.设置为10000防止旋转次数 过多而使游戏无法正常进行.
在Tetromino类中添加内部类State 属性:row0,col0,row1,col1,row2,col2,row3,col3 以上8个属性表示4个方块的相对坐标. 构造方法:public State(int row0„){„}
states[0]
states[1]
states[2]
states[3]
以编号为“0”的格子为旋转轴,计算其他格子的相对坐标: states[0] = (0,0,0,-1,0,1,1,-1); states[1] = (0,0,-1,0,1,0,-1,-1); states[2] = (0,0,0,1,0,-1,-1,1); states[3] = (0,0,1,0,-1,0,1,1);
程序启动方法(雷凯)
通过静态代码块将背景图片,7种方块图片和游戏结 束图片加载进来,这会节省很多时间. static{ Class cls = Tetris.class; background = ImageIO.read(cls.getResource(image)); //可以读取图片文件到内存中的对象 „ „ } 该静态代码块需捕捉异常(IOException)
简单工厂模式实例化四格方块 T,I,O,S,Z,J,L(田亮)
将7个子类封装到类Tetromino,在构造方法里初始 化四格方块的初始位置(row,col)和相对位置.
以“L”型四格方块为例:
初始位置: cell[0] = (0,4); cell[1] = (0,3); cell[2] = (0,5); cell[3] = (1,3);
判断方法,暂停、继续、退出(田园)
checkGameOver(); //检查游戏是否结束 如果wall[0][4] != null成立,调用 timer.cancle() 关闭计时器,游戏结束. outOfBounds(); //出界检查方法 Cell[] cells = tetromino.cells; 遍历当前四格方块对象的每个格子 如果(cell.getCol<0 || cell.getCol>=COLS || cell.getRow < 0 || cell.getRow >= ROWS)成 立(方块是否出了长方形界面),返回true;
Tetris
paint(Graphics g); //重写绘图方法 paintWall(Graphics g); //绘制墙 action(); //通过调用该方法 启动软件 Quit(); //退出 pauseAction(); //暂停 continueAction(); //继续 paintTetromino(Graphics g); //绘制四格方块 paintNextOne(Graphics g); //绘制下一个方块 paintScore(Graphics g); //绘制成绩 paintLines(Graphics g); //绘制已消除行数 paintPause(Graphics g); //绘制暂/继续停提示
softDropAction(); //下落控制方法 canDrop(); //判断是否能够继续下落 landToWall(); //着陆到墙 destroyLines(); //销毁的行数 fullCells(int row); //判断一行是否满了 deleteLine(int row);//删除一行 checkGameOver(); //检查游戏结束状态 moveLeftAction(); //判断左移是否出界 moveRightAction(); //判断右移是否出界 rotateRightAction();//判断旋转是否出界 outOfBounds(); //检查是否出界 coincide(); //判断是否重合 hardDropAction(); //瞬间下降 startAction(); //开始动作流程
旋转
rotateRight(); 下标Index自增 rotateLeft(); 下标Index自减 State s = states[index%states.length]; 当前状态s为四格方块旋转[index%states.length] 次的状态. 以cells[0]为旋转轴,根据初始化的相对坐标 cells[1].setRow(cells[0]. getRow() + s.row1); cells[1].setCol(cells[0]. getCol() + s.col1); cells[2].setRow(cells[0]. getRow() + s.row2); cells[2].setCol(cells[0]. getCol() + s.col2); cells[3].setRow(cells[0]. getRow() + s.row3); cells[3].setCol(cells[0]. getCol() + s.col3);
项目评审
俄罗源自文库方块
主讲人:雷凯 组员:沈唯唯,李有宁,田园 田亮,尹亮
界面展示
程序运行成功后, 进入游戏界面。 如左图所示。
游戏暂停
按下键盘按键“P” (pause)游戏进入 停止状态,等待用 户按下“C” (Continue)键继续 游戏。
退出游戏
按下键盘按键 “Q”(Quit)弹 出系统提示框 ,选择是否要 退出游戏。