1、1)由方块组成的分歧的随机图形会从区域上方开端缓慢落下.2)玩家可以做的操纵有: 以90度为单位旋转方每格块.以格子为单位左右移动方块,让方块加速落下.3)方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的随机图形会出现在上方开端落下.4)当区域中某一列横向格子全部由方块填满,则该列会自动消除并成为玩家的得分.5)一次性销毁分歧行数方块得分分歧,一行1分,两行2分,三行5分,四行10分.6)当固定的方块堆到区域最上方,则游戏竣事.处理玩家操纵2.2 功能分析2.2.1 系统操纵界面2.2.2 程序主要功能说明代码:package Tetris;import java.aw
2、t.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.Arrays;import java.util.Timer;import java.util.TimerTask;import javax.swing.JFrame;import javax.swing.JPanel;publicclassTetrisPanelextends JPanel/游戏主面板20行10列privates
3、taticfinalintROWS = 20;privatestaticfinalintCOLS = 10;/代表方块着陆的墙private Cell wall = new CellROWSCOLS;/定义每小块的大小privatestaticfinalintCELL_SIZE = 25;/游戏得分privateintscore;/游戏销毁行数privateintlines;/一次性销毁行数的计分尺度(0行=0分,1行=1分,2行=4分,3行=10分,4行=20分)privatestaticfinalint SCORE_LEVEL =0,1,4,10,20;/游戏竣事标识表记标帜private
4、booleangameOver = false;/游戏暂停标识表记标帜privatebooleanpause = false;/正在下落的四格方块private Tetromino currentTetro ;/下一个下落的四格方块private Tetromino nextTetro ;/定义游戏定时器private Timer timer;publicstaticvoid main(String args)JFrame frame = new JFrame(俄罗斯方块);int width = (COLS+8)*CELL_SIZE+100;int height = ROWS*CELL_SI
5、ZE+100;frame.setSize(width, height);frame.setLocationRelativeTo(null);frame.setDefaultClo搜索引擎优化peration(JFrame.EXIT_ON_CLOSE);/取消系统默许规划frame.setLayout(null);TetrisPanel panel = new TetrisPanel();panel.setLocation(45, 35);panel.setSize(COLS+8)*CELL_SIZE,ROWS*CELL_SIZE+1);frame.add(panel);frame.setVis
6、ible(true);panel.action();publicvoid paint(Graphics g)super.paint(g);/填充布景颜色this.paintBackground(g);/绘制游戏墙paintWall(g);/绘制分数墙paintScore(g);/绘制面板边框paintTetrisBorder(g);/绘制当前四格方块paintCurrentTetro(g);/绘制下个四格方块paintNextTetro(g);/privatestaticfinalintBG_COLOR = 0xC3D5EA;privatestaticfinalintBORDER_COLOR
7、= 0x667799;privatestaticfinalintFONT_COLOR = 0x000000;/绘制布景的方法publicvoid paintBackground(Graphics g)g.setColor(new Color(BG_COLOR);/this.setBackground(new Color(BG_COLOR);g.fillRect(0, 0, this.getWidth(), this.getHeight();/绘制游戏墙的方法publicvoid paintWall(Graphics g)for(int row=0;rowROWS;row+)for(int co
8、l=0;colCOLS;col+)Cell cell = wallrowcol;int x =col*CELL_SIZE;int y= row*CELL_SIZE;if(cell=null)g.setColor(new Color(BORDER_COLOR);g.drawRect(x, y, CELL_SIZE, CELL_SIZE);elseg.setColor(new Color(cell.getColor();g.fillRect(x, y, CELL_SIZE, CELL_SIZE);/绘制分数墙的方法publicvoid paintScore(Graphics g)int x = 1
9、2*CELL_SIZE;int y = 6*CELL_SIZE;Font font = new Font(楷体,Font.BOLD,23);String msg =分数:+score;g.setColor(new Color(FONT_COLOR);g.setFont(font);g.drawString(msg, x, y);y+=2*CELL_SIZE;msg = 行数:+lines;if(gameOver)(T_T)【S】再来;x-=CELL_SIZE;elseif(pause)【C】继续【P】暂停/绘制面板边框的方法publicvoid paintTetrisBorder(Graphi
10、cs g)g.drawRect(0, 0, CELL_SIZE*(COLS+8)-1, CELL_SIZE*ROWS);/绘制当前四格方块的方法publicvoid paintCurrentTetro( Graphics g)if(currentTetro=null)/如果没有四格方块,则返回不绘画return;for(Cell cell:currentTetro.cells)int row = cell.getRow();int col = cell.getCol();int x = col*CELL_SIZE;int y = row*CELL_SIZE;/绘制下个四格方块的方法public
11、void paintNextTetro( Graphics g)if(nextTetro=null)nextTetro.cells)int x = (col+9)*CELL_SIZE;int y = (row+1)*CELL_SIZE;/让四格方块动起来的方法publicvoid action()startGameAction();/请求此容器获取输入核心this.requestFocus();this.addKeyListener(new KeyAdapter()publicvoid keyPressed(KeyEvent e)int key= e.getKeyCode();if(key=K
12、eyEvent.VK_S)if(pause)if(key=KeyEvent.VK_C)continueAction();switch(key)case KeyEvent.VK_DOWN:softDownAction();break;case KeyEvent.VK_LEFT:moveLeftAction();case KeyEvent.VK_RIGHT:moveRightAction();case KeyEvent.VK_UP:rotateRightAction();case KeyEvent.VK_SPACE:hardDownAction();case KeyEvent.VK_P:pause
13、Action();repaint();/暂停游戏的方法privatevoid pauseAction() pause = true;timer.cancel();/继续游戏的方法privatevoid continueAction() pause = false;timer = new Timer();timer.schedule(new TimerTask() publicvoid run() , 500, 500););/在游戏开端时调用或者【S】按下时调用publicvoid startGameAction()gameOver = false;score = 0;lines = 0;/清
14、空游戏主面板emptyWall();/生成下一个四格方块nextTetromino();/生成定时器对象/启动定时器工作/调用面板的四格方块下落方法(自由下落)/重画面板/清空游戏主面板方法publicvoid emptyWall()for(int row =0;/wallrow这一行全部用null暗示Arrays.fill(wallrow, null);/生成(随机)下一个四格方块,1.下一个变成当前的.2.随机生成下一个.publicvoid nextTetromino()/第一次nextTetro是null时就随机生成一个nextTetro = Tetromino.randomTetro
15、mino();/下一个四格方块当即变成当前四格方块currentTetro = nextTetro;/四格方块下落流程,方块移动到区域最下方或者移动到其他方块上则固定在此处./而新的四个方块则会出现在区域上方并开端下落且随机生成下一个四格方块publicvoid softDownAction()if(canDown()/如果能下落则继续下落currentTetro.softDown();/不克不及下落则着陆到墙上tetrominoLandToWall();/每个四格方块着陆清除满行且计分destroy();/每个四格方块着陆需要检测游戏是否竣事if(gameOver()/如果游戏竣事gameO
16、verAction();/随机生成下一个四格方块/检查方块是否可以继续下落(落到最底部或者墙上的下方有方块)privateboolean canDown() /检查是否到底部Cell cells = currentTetro.cells;cells)if(cell.getRow()=ROWS-1)returnfalse;/检查次四格方块下方是否有方块Cell block = wallrow+1col;if(block!=null)returntrue;/方块“着陆”到墙上,取出每个小方块找到对应的行号row和列号col,将cell小方块放到对应的wallrowcol位置上privatevoid
17、 tetrominoLandToWall() /将cell小方块放到对应的wallrowcol位置上wallrowcol=cell;/销毁满行的方法privatevoid destroy() /统计本次销毁的行数int lines =0;for(int row =0 ;/断定此行是否是满行if(fullCells(row)/清除此行clearLine(row);/每清除一行就累计加一lines+;/整个游戏面板每行断定之后要记录销毁行数与计分score += SCORE_LEVELlines;this.lines += lines;/断定某一行是否填满cell小方块privateboolean
18、 fullCells(int row) Cellline = wallrow;for(int i=0; i=1;i-)/wallrow = Arrays.copyOf(wallrow-1, COLS);System.arraycopy(wallrow-1, 0, wallrow, 0, COLS);/第一行全部用null填充Arrays.fill(wall0, null);/检查游戏是否竣事(思路:游戏主面板中第一行出现四个方块的区域有小方块cell在则游戏竣事)privateboolean gameOver() gameOver = wall03!=null|wall04!=null;ret
19、urngameOver;/清零游戏竣事现场(停止计时器)privatevoid gameOverAction() /停止计时器/以四格方块为单位左右移动的方法:1.遇到左右鸿沟不克不及移动.2.遇到左右有方块不克不及移动./左移的方法privatevoid moveLeftAction() currentTetro.moveLeft();if(outOfBounds()|coincide()currentTetro.moveRight();/断定四格方块是否与墙上的方块重合的方法privateboolean coincide() /System.out.println(col+:+row);i
20、f(wallrowcol!= null)/断定四格方块是否出鸿沟的方法 privateboolean outOfBounds() if(col=COLS)/右移的方法privatevoid moveRightAction() /四格方块加速下落的方法privatevoid hardDownAction() /四格方块继续下落while(canDown()/着陆到墙上/清除满行并计分/旋转流程节制privatevoid rotateRightAction() currentTetro.rotateRight();currentTetro.rotateLeft();2./代表游戏中每个小格子方块publicclass Cell /小方块在游戏面板中的哪一行privateintrow;/小方块在游戏面板中的哪一列privateintcol;/小方块的颜色privateintcolor;public Cell(int row, int
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1