俄罗斯方块java用Java设计网络版俄罗斯方块会遇到哪些难点?

俄罗斯方块java  时间:2021-07-17  阅读:()

求一个java俄罗斯方块的设计思路 不要代码 只要思路 本人是初学者

思路就是数组 地图是 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 然后再定义各种形状 比如 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 然后编写这些形状的反转方法,也就是根据方向调整形状中1的位置 然后就写游戏呗,下落过程其实就是不断的修改地图的值

跪求,用JAVA编译的俄罗斯方块源代码

---------------------------- import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Tetris extends JFrame { public Tetris() { TetrisPanel a = new TetrisPanel(); addKeyListener(a.listener); add(a); JMenuBar menu = new JMenuBar(); JMenu game = new JMenu("游戏"); game.add("新游戏"); game.add("暂停"); game.add("继续"); game.add("退出"); JMenu help = new JMenu("帮助"); help.add("关于"); menu.add(game); menu.add(help); this.setJMenuBar(menu); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(220, 275); setTitle("Tetris内测版"); setResizable(false); } public static void main(String[] args) { new Tetris().setVisible(true); } } // 创建一个俄罗斯方块类 class TetrisPanel extends JPanel { public TimerListener listener = new TimerListener(); // blockType 代表方块类型 // turnState代表方块状态 private int blockType; private int score = 0; private int turnState; private int x; private int y; int flag = 0; // 定义已经放下的方块x=0-11,y=0-21; int[][] map = new int[13][23]; // 方块的形状 第一组代表方块类型有S、Z、L、J、I、O、T 7种 第二组 代表旋转几次 第三四组为 方块矩阵 private final int shapes[][][] = new int[][][] { // I { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } }, // S { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } }, // Z { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } }, // J { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // O { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // L { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // T { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } }; // 初始化构造方法 public TetrisPanel() { nextBlock(); newGame(); new Timer(1000, listener).start(); } // 生成新方块的方法 private void nextBlock() { blockType = (int) (Math.random() * 1000) % 7; turnState = (int) (Math.random() * 1000) % 4; x = 4; y = 0; if (crash(x, y, blockType, turnState) == 0) { JOptionPane.showMessageDialog(null, "GAME OVER"); newGame(); } } // 初始化地图 private void newGame() { score = 0; for (int i = 0; i < 12; i++) { for (int j = 0; j < 22; j++) { map[i][j] = 0; map[11][j] = map[0][j] = 3; } map[i][21] = 3; } } // 旋转的方法 private void turn() { turnState = (crash(x, y, blockType, (turnState + 1) % 4) + turnState) % 4; repaint(); } // 左移的方法 private void left() { x -= crash(x - 1, y, blockType, turnState); repaint(); } // 右移的方法 private void right() { x += crash(x + 1, y, blockType, turnState); repaint(); } // 下落的方法 private void down() { y += crash(x, y + 1, blockType, turnState); if (crash(x, y + 1, blockType, turnState) == 0) { add(x, y, blockType, turnState); nextBlock(); } repaint(); } // 是否碰撞的方法 private int crash(int x, int y, int blockType, int turnState) { for (int a = 0; a < 4; a++) { for (int b = 0; b < 4; b++) { if ((shapes[blockType][turnState][a * 4 + b] & map[x + b + 1][y + a]) == 1) { return 0; } } } return 1; } // 尝试消行的方法 private void tryDelLine() { for (int b = 0; b < 21; b++) { int c = 1; for (int a = 0; a < 12; a++) { c &= map[a][b]; } if (c == 1) { score += 10; for (int d = b; d > 0; d--) { for (int e = 0; e < 11; e++) { map[e][d] = map[e][d - 1]; } } } } } // 把当前添加map private void add(int x, int y, int blockType, int turnState) { for (int a = 0; a < 4; a++) { for (int b = 0; b < 4; b++) { map[x + b + 1][y + a] |= shapes[blockType][turnState][a * 4 + b]; } } tryDelLine(); } // 画方块的的方法 public void paintComponent(Graphics g) { super.paintComponent(g); // 画当前方块 for (int j = 0; j < 16; j++) { if (shapes[blockType][turnState][j] == 1) { g.fillRect((j % 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10); } } // 画已经固定的方块 for (int j = 0; j < 22; j++) { for (int i = 0; i < 12; i++) { if (map[i][j] == 1) { g.fillRect(i * 10, j * 10, 10, 10); } else if (map[i][j] == 3) { g.drawRect(i * 10, j * 10, 10, 10); } } } g.drawString("score=" + score, 125, 10); g.drawString("抵制不良游戏,", 125, 50); g.drawString("拒绝盗版游戏。

", 125, 70); g.drawString("注意自我保护,", 125, 90); g.drawString("谨防受骗上当。

", 125, 110); g.drawString("适度游戏益脑,", 125, 130); g.drawString("沉迷游戏伤身。

", 125, 150); g.drawString("合理安排时间,", 125, 170); g.drawString("享受健康生活。

", 125, 190); } // 定时器监听和键盘监听 class TimerListener extends KeyAdapter implements ActionListener { public void actionPerformed(ActionEvent e) { down(); } public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_DOWN: down(); break; case KeyEvent.VK_UP: turn(); break; case KeyEvent.VK_RIGHT: right(); break; case KeyEvent.VK_LEFT: left(); } } } }

java版的俄罗斯方块问题。定义方块的形状那个数组和生成新方块的方法没看懂,有高人解释下不?

/** 定义方块的形状那个数组和生成新方块的方法没看懂 */ 下面这个是(三维数据)shapes中的一个二维元素 //i { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } }, 第一行{ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 } 画出的图形为:(0代表&,1代表O) & & & & O O O O & & & & & & & & 第二行{0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0} & O & & & O & & & O & & & O & & 从上面两个你应该就可以看出这个数组存储各种方块的方式了。

blockType = (int) (Math.random() * 1000) % 7; turnState = (int) (Math.random() * 1000) % 4; 这里取的7和4的原因是这个三维数组的两个维度的大小是7和4,7种类型的图形,和每个图形的4种形态 反映到数组上就是 newShape[] = shapes[blockType][State] ;

java俄罗斯方块代码

import java.awt.*;   import java.awt.event.*;   //俄罗斯方块类   public class ERS_Block extends Frame{   public static boolean isPlay=false;   public static int level=1,score=0;   public static TextField scoreField,levelField;   public static MyTimer timer;   GameCanvas gameScr;   public static void main(String[] argus){   ERS_Block ers = new ERS_Block("俄罗斯方块游戏 V1.0 Author:Vincent");   WindowListener win_listener = new WinListener();   ers.addWindowListener(win_listener);   }   //俄罗斯方块类的构造方法   ERS_Block(String title){   super(title);   setSize(600,480);   setLayout(new GridLayout(1,2));   gameScr = new GameCanvas();   gameScr.addKeyListener(gameScr);   timer = new MyTimer(gameScr);   timer.setDaemon(true);   timer.start();   timer.suspend();   add(gameScr);   Panel rightScr = new Panel();   rightScr.setLayout(new GridLayout(2,1,0,30));   rightScr.setSize(120,500);   add(rightScr);   //右边信息窗体的布局   MyPanel infoScr = new MyPanel();   infoScr.setLayout(new GridLayout(4,1,0,5));   infoScr.setSize(120,300);   rightScr.add(infoScr);   //定义标签和初始值   Label scorep = new Label("分数:",Label.LEFT);   Label levelp = new Label("级数:",Label.LEFT);   scoreField = new TextField(8);   levelField = new TextField(8);   scoreField.setEditable(false);   levelField.setEditable(false);   infoScr.add(scorep);   infoScr.add(scoreField);   infoScr.add(levelp);   infoScr.add(levelField);   scorep.setSize(new Dimension(20,60));   scoreField.setSize(new Dimension(20,60));   levelp.setSize(new Dimension(20,60));   levelField.setSize(new Dimension(20,60));   scoreField.setText("0");   levelField.setText("1");   //右边控制按钮窗体的布局   MyPanel controlScr = new MyPanel();   controlScr.setLayout(new GridLayout(5,1,0,5));   rightScr.add(controlScr);   //定义按钮play   Button play_b = new Button("开始游戏");   play_b.setSize(new Dimension(50,200));   play_b.addActionListener(new Command(Command.button_play,gameScr));   //定义按钮Level UP   Button level_up_b = new Button("提高级数");   level_up_b.setSize(new Dimension(50,200));   level_up_b.addActionListener(new Command(Command.button_levelup,gameScr));   //定义按钮Level Down   Button level_down_b =new Button("降低级数");   level_down_b.setSize(new Dimension(50,200));   level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr));   //定义按钮Level Pause   Button pause_b =new Button("游戏暂停");   pause_b.setSize(new Dimension(50,200));   pause_b.addActionListener(new Command(Command.button_pause,gameScr));   //定义按钮Quit   Button quit_b = new Button("退出游戏");   quit_b.setSize(new Dimension(50,200));   quit_b.addActionListener(new Command(Command.button_quit,gameScr));   controlScr.add(play_b);   controlScr.add(level_up_b);   controlScr.add(level_down_b);   controlScr.add(pause_b);   controlScr.add(quit_b);   setVisible(true);   gameScr.requestFocus();   }   }   //重写MyPanel类,使Panel的四周留空间   class MyPanel extends Panel{   public Insets getInsets(){   return new Insets(30,50,30,50);   }   }   //游戏画布类   class GameCanvas extends Canvas implements KeyListener{   final int unitSize = 30; //小方块边长   int rowNum; //正方格的行数   int columnNum; //正方格的列数   int maxAllowRowNum; //允许有多少行未削   int blockInitRow; //新出现块的起始行坐标   int blockInitCol; //新出现块的起始列坐标   int [][] scrArr; //屏幕数组   Block b; //对方快的引用   //画布类的构造方法   GameCanvas(){   rowNum = 15;   columnNum = 10;   maxAllowRowNum = rowNum - 2;   b = new Block(this);   blockInitRow = rowNum - 1;   blockInitCol = columnNum/2 - 2;   scrArr = new int [32][32];   }   //初始化屏幕,并将屏幕数组清零的方法   void initScr(){   for(int i=0;i<rowNum;i++)   for (int j=0; j<columnNum;j++)   scrArr[i][j]=0;   b.reset();   repaint();   }   //重新刷新画布方法   public void paint(Graphics g){   for(int i = 0; i < rowNum; i++)   for(int j = 0; j < columnNum; j++)   drawUnit(i,j,scrArr[i][j]);   }   //画方块的方法   public void drawUnit(int row,int col,int type){   scrArr[row][col] = type;   Graphics g = getGraphics();   switch(type){ //表示画方快的方法   case 0: g.setColor(Color.black);break; //以背景为颜色画   case 1: g.setColor(Color.blue);break; //画正在下落的方块   case 2: g.setColor(Color.magenta);break; //画已经落下的方法   }   g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true);   g.dispose();   }   public Block getBlock(){   return b; //返回block实例的引用   }   //返回屏幕数组中(row,col)位置的属性值   public int getScrArrXY(int row,int col){   if (row < 0 || row >= rowNum || col < 0 || col >= columnNum)   return(-1);   else   return(scrArr[row][col]);   }   //返回新块的初始行坐标方法   public int getInitRow(){   return(blockInitRow); //返回新块的初始行坐标   }   //返回新块的初始列坐标方法   public int getInitCol(){   return(blockInitCol); //返回新块的初始列坐标   }   //满行删除方法   void deleteFullLine(){   int full_line_num = 0;   int k = 0;   for (int i=0;i<rowNum;i++){   boolean isfull = true;   L1:for(int j=0;j<columnNum;j++)   if(scrArr[i][j] == 0){   k++;   isfull = false;   break L1;   }   if(isfull) full_line_num++;   if(k!=0 && k-1!=i && !isfull)   for(int j = 0; j < columnNum; j++){   if (scrArr[i][j] == 0)   drawUnit(k-1,j,0);   else   drawUnit(k-1,j,2);   scrArr[k-1][j] = scrArr[i][j];   }   }   for(int i = k-1 ;i < rowNum; i++){   for(int j = 0; j < columnNum; j++){   drawUnit(i,j,0);   scrArr[i][j]=0;   }   }   ERS_Block.score += full_line_num;   ERS_Block.scoreField.setText(""+ERS_Block.score);   }   //判断游戏是否结束方法   boolean isGameEnd(){   for (int col = 0 ; col <columnNum; col ++){   if(scrArr[maxAllowRowNum][col] !=0)   return true;   }   return false;   }   public void keyTyped(KeyEvent e){   }   public void keyReleased(KeyEvent e){   }   //处理键盘输入的方法   public void keyPressed(KeyEvent e){   if(!ERS_Block.isPlay)   return;   switch(e.getKeyCode()){   case KeyEvent.VK_DOWN:b.fallDown();break;   case KeyEvent.VK_LEFT:b.leftMove();break;   case KeyEvent.VK_RIGHT:b.rightMove();break;   case KeyEvent.VK_SPACE:b.leftTurn();break;   }   }   }   //处理控制类   class Command implements ActionListener{   static final int button_play = 1; //给按钮分配编号   static final int button_levelup = 2;   static final int button_leveldown = 3;   static final int button_quit = 4;   static final int button_pause = 5;   static boolean pause_resume = true;   int curButton; //当前按钮   GameCanvas scr;   //控制按钮类的构造方法   Command(int button,GameCanvas scr){   curButton = button;   this.scr=scr;   }   //按钮执行方法   public void actionPerformed (ActionEvent e){   switch(curButton){   case button_play:if(!ERS_Block.isPlay){   scr.initScr();   ERS_Block.isPlay = true;   ERS_Block.score = 0;   ERS_Block.scoreField.setText("0");   ERS_Block.timer.resume();   }   scr.requestFocus();   break;   case button_levelup:if(ERS_Block.level < 10){   ERS_Block.level++;   ERS_Block.levelField.setText(""+ERS_Block.level);   ERS_Block.score = 0;   ERS_Block.scoreField.setText(""+ERS_Block.score);   }   scr.requestFocus();   break;   case button_leveldown:if(ERS_Block.level > 1){   ERS_Block.level--;   ERS_Block.levelField.setText(""+ERS_Block.level);   ERS_Block.score = 0;   ERS_Block.scoreField.setText(""+ERS_Block.score);   }   scr.requestFocus();   break;   case button_pause:if(pause_resume){   ERS_Block.timer.suspend();   pause_resume = false;   }else{   ERS_Block.timer.resume();   pause_resume = true;   }   scr.requestFocus();   break;   case button_quit:System.exit(0);   }   }   }   //方块类   class Block {   static int[][] pattern = {   {0x0f00,0x4444,0x0f00,0x4444},//用十六进至表示,本行表示长条四种状态   {0x04e0,0x0464,0x00e4,0x04c4},   {0x4620,0x6c00,0x4620,0x6c00},   {0x2640,0xc600,0x2640,0xc600},   {0x6220,0x1700,0x2230,0x0740},   {0x6440,0x0e20,0x44c0,0x8e00},   {0x0660,0x0660,0x0660,0x0660}   };   int blockType; //块的模式号(0-6)   int turnState; //块的翻转状态(0-3)   int blockState; //快的下落状态   int row,col; //块在画布上的坐标   GameCanvas scr;   //块类的构造方法   Block(GameCanvas scr){   this.scr = scr;   blockType = (int)(Math.random() * 1000)%7;   turnState = (int)(Math.random() * 1000)%4;   blockState = 1;   row = scr.getInitRow();   col = scr.getInitCol();   }   //重新初始化块,并显示新块   public void reset(){   blockType = (int)(Math.random() * 1000)%7;   turnState = (int)(Math.random() * 1000)%4;   blockState = 1;   row = scr.getInitRow();   col = scr.getInitCol();   dispBlock(1);   }   //实现“块”翻转的方法   public void leftTurn(){   if(assertValid(blockType,(turnState + 1)%4,row,col)){   dispBlock(0);   turnState = (turnState + 1)%4;   dispBlock(1);   }   }   //实现“块”的左移的方法   public void leftMove(){   if(assertValid(blockType,turnState,row,col-1)){   dispBlock(0);   col--;   dispBlock(1);   }   }   //实现块的右移   public void rightMove(){   if(assertValid(blockType,turnState,row,col+1)){   dispBlock(0);   col++;   dispBlock(1);   }   }   //实现块落下的操作的方法   public boolean fallDown(){   if(blockState == 2)   return(false);   if(assertValid(blockType,turnState,row-1,col)){   dispBlock(0);   row--;   dispBlock(1);   return(true);   }else{   blockState = 2;   dispBlock(2);   return(false);   }   }   //判断是否正确的方法   boolean assertValid(int t,int s,int row,int col){   int k = 0x8000;   for(int i = 0; i < 4; i++){   for(int j = 0; j < 4; j++){   if((int)(pattern[t][s]&k) != 0){   int temp = scr.getScrArrXY(row-i,col+j);   if (temp<0||temp==2)   return false;   }   k = k >> 1;   }   }   return true;   }   //同步显示的方法   public synchronized void dispBlock(int s){   int k = 0x8000;   for (int i = 0; i < 4; i++){   for(int j = 0; j < 4; j++){   if(((int)pattern[blockType][turnState]&k) != 0){   scr.drawUnit(row-i,col+j,s);   }   k=k>>1;   }   }   }   }   //定时线程   class MyTimer extends Thread{   GameCanvas scr;   public MyTimer(GameCanvas scr){   this.scr = scr;   }   public void run(){   while(true){   try{   sleep((10-ERS_Block.level + 1)*100);   }   catch(InterruptedException e){}   if(!scr.getBlock().fallDown()){   scr.deleteFullLine();   if(scr.isGameEnd()){   ERS_Block.isPlay = false;   suspend();   }else   scr.getBlock().reset();   }   }   }   }   class WinListener extends WindowAdapter{   public void windowClosing (WindowEvent l){   System.exit(0);   }   }

用Java设计网络版俄罗斯方块会遇到哪些难点?

(Java ) . 1.1 开发一个俄罗斯方块游戏。

游戏者移动和旋转窗口内落下的方块,方块在一行堆满后就可以消掉,并得到相应的分数;如果方块堆积至窗口顶端,即告负。

1.2 在游戏程序中,我们可以将它看成3 个对象,分别是程序窗体主类对象、方块数据管理对象、控制游戏自动下落的定时器线程对象、三个背景音乐对象。

窗体主类对象: 方块数据管理对象: 控制游戏自动下落的定时器线程对象: 三个背景音乐对象: 1.3 开发工具:Sun NetBeans IDE 6.1 NetBeans IDE 是一个为软件开发者提供的自由、开源的集成开发环境。

您可以从中获得您所需要的所有工具,用 Java、C/C++ 甚至是 Ruby 来创建专业的桌面应用程序、企业应用程序、web 和移动应用程序。

此 IDE 可以在多种平台上运行,包括 Windows、Linux、Mac OS X 以及 Solaris;它易于安装且非常方便使用。

6.0 发行版包含了重要的增强功能和新特性,包括完全重写的编辑器基础结构、对扩展语言的支持、新的生产率特性,以及一个能让您根据实际需求安装并配置 IDE 的简化安装过程。

. 2.1 游戏数据与界面显示相分离,用游戏结构数据描述游戏的状态,玩家操作或游戏自行走一步,程序中都通过修改游戏数据来体现,即每走一步,程序会修改当前的游戏数据,判断游戏是否结束了,也是通过对游戏数据的分析来作出结论。

游戏界面是根据当时游戏数据来绘制的,当数据改变时,要清除原图形并重绘。

总之,游戏的逻辑设计是针对游戏数据,而不是游戏界面。

界面只是间接地向玩家显示结果。

因此,在设计函数时,大致分二类:与玩家操作事件有关的数据处理函数,与界面效果有关的图形绘制函数。

游戏运行过程由窗体监听到的键盘事件控制 主要流程图如下: 制造新的方块 方 向键 的控 制与方法 IsCanChangeTo() Anthem类 游戏背景音乐当游戏开始时启动 Class RussionGame clearblock() makeblock() moveright() movedown() moveleft() turnleft() turnright() Anthem2 类 按键的声音当触发方向键的方法时响应 formKeyPressed() 当游戏结束后启动另一首音乐 定义一个线程类,在后台自动地按游戏速度,移动方块。

CheckAndCutLine() IsOver() Anthem3 类 检查某一行是否为全填充,如是,消掉并返回1 IsHitBottom() 判断当前方块是否已触底,并处理 TimerRuner 游戏数据管理对象:主要管理着两方面数据:方块的坐标数据和游戏空间数据。

用成员数组变量描述游戏空间状态,根据游戏空间状态判断游戏是否结束。

用它的成员变量保存方块的形状数据及坐标数据,定义当方块走动方块数据变化的处理方法。

此外,还把各种游戏属性数据作为其成员变量。

控制游戏自动下落的定时器线程对象:是一个线程类派生对象,独立运行,每隔一段时间控制方块下落下格。

窗体界面主类对象:负责绘制游戏图象、包含游戏设置的各种控件(如:设置速度的文本框、显示得分的标签、开始及暂停按钮),负责游戏的各种属性数据的读入及显示输出,最重要的是:它还是一个键盘事件处理类,监听玩家的键盘操作,处理键盘事件,在键盘事件处理函数中调用游戏数据管理对象的方法,控制游戏的运行。

我们还把游戏数据管理对象、控制游戏自动下落的定时器线程对象作为它的成员变量。

往面板中加入需要的控件(2 个 Jlable,2 个 boBox,4 个 Jbottun),并布置好它们的位置,并重命名控件对象变量的名称,如上图: 2.3 1. 首先对于方块的构造分析,可以用一个三维数组来表示,方块总共有四种基本形,其它形状可由这四种基本形通过旋转得到,如下图: class RussionBlockGame { final int sp_WIDTH = 20; // final int sp_HIGHT = 20; // final int boxtypes[4][4][2]={ {{-1,0},{0,0},{1,0},{2,0}}, {{-1,0},{0,0},{1,0},{1,-1}}, {{-1,0},{0,0},{1,0},{0,-1}}, {{-1,0},{0,0},{1,0},{-1,-1}} };/* */ int box[4][2]; /* */ int cx, cy; /* */ int type; /* ( 0,1,2,3)*/ int block_box[][]=new int[4][2]; /* */ int block_cx, block_cy; /* */ int block_type; /* ( 0,1,2,3)*/ int gamespace[][] = new int[sp_HIGHT][sp_WIDTH] ; void makeblock()// { block_type = (int)(Math.random()*100)%4;//产生一个1-4 的随机数 for(int i=0; i<4;i++) block_box[i] = types[block_type][i]; block_cx=sp_WIDTH/2; block_cy=0; } HIGHT WIDTH (cx,cy)= (11,4) (WIDTH-1,HIGHT-1) 游戏空间可以看成由sp_WIDTH × sp_HIGHT 个正方形小格子构成,每格子都有一个相对于左上角的坐标。

可以用一个sp_WIDTH × sp_HIGHT 的二维数组表示游戏空间。

如下: int gamespace[sp_WIDTH][sp_HIGHT]; 某格子对应的数组元素的值为1,表示此格子已被方块填充,为0 表示未被填充。

在游戏空间中,被方块填充了的格子为深灰色,未被填充的格子为白色(底色),灰色格子触及空间顶部时,游戏结束。

即gamespace[0](二维数组第一排)中有元素的值为1 时,游戏结束。

下面是判断游戏是否结束的程序: boolean IsGameOver() { boolean flag=false; for(int i=0; i=sp_WIDTH || y>=sp_HIGHT|| (y>0 && gamespace[y][x]==1)) { IsCan = false; break;} } return IsCan; } 4. , 判断方块是否已落到底,就是判断方块中每个小正方形格的正下方位置是否已被填充或出下界。

如已到底,把方块所在的位置(格子)填充(对应 gamespace 1),还要查看是否有某行已被全填充,把被全填充的行消掉,并给用户加分,程序片段如下: boolean IsHitBottom( ) / { boolean flag =false ; int i, x, y; for (i=0; i<4; i++) { x= block_cx + block_box[i][0]; y= block_cy + block_box[i][1] + 1 ; if ( y>=sp_HIGHT|| gamespace[y][x]==1) { flag = true; break; } } if( flag ) { for (i=0; i<4; i++) { x= block_cx + block_box[i][0] ; y= block_cy + block_box[i][1] ; if(y>=0) { gamespace[y][x]=1;} } for (i=0; i<4; i++) { y= block_cy + block_box[i][1] ; while(y>=0 && CheckAndCutLine(y)) m_score += 100; } isplaying = ! IsGameOver(); } return flag; } 开始音乐时已被循环播放 w1.audioClips.loop(); Anthem2 w2 = new Anthem(); 当触发到按键事件时执行formKeyPressed 方法,每当系统取得某一个按键的键码时程序都会自动执行w2.audioClips2.play();直到游戏结束。

Anthem2 w3 = new Anthem() ; 当触发到game.IsOver 方法时证明游戏已结束这时程序会调用 (); w3.audioClips3.play(); 背景音乐消失,结束音乐开始。

6. 游戏窗体的设计视图中,选择“开始游戏”按钮,再右键点击“开始游戏”按钮,从菜单中选“事件”->“Action”事件类型->“actionPerformed”接口方法,将转到源视图中事件处理代码处,加入我们的处理代码,使得游戏开始,如下: private void jButton_startActionPerformed(java.awt.event.ActionEvent evt) { game.isplaying=true; this.requestFocusInWindow(); new TimerRuner(this); } 用同样的方法编写“暂停游戏”、“结束游戏”、“退出游戏”的点击事件处理代码,代码如下: private void jButton_ActionPerformed(java.awt.event.ActionEvent evt) { game.isplaying=false; } private void jButton_overActionPerformed(java.awt.event.ActionEvent evt) { game.isplaying=false; game.cleargamespace(); } private void jButton_exitActionPerformed(java.awt.event.ActionEvent evt) { game.isplaying=false; System.exit(0); } 2.4 功能: 具有等级功能,不同的等级游戏的难度不一样; 具有分数功能,消行可以得到分数; 具有声音,有背景音和执行不同的操作出现不同的声音; 具有设置功能,可以用来设置初始等级、开始行数、按键设置等。

3. /number2 方块向下 /number4:方块向下 /number3:方块向右 PageDown 方块向右翻传 End 方块向左传 Start 游戏开始 背景音乐的开关 暂停游戏 over 停止游戏 Speed:调整速度 :选择方块的背景色(默认为浅蓝) 程序运行结果大部分按照预期设计一样,但背景色的改变有时响应过慢,而且每次打开音乐后必须重新按下start 键,这是该游戏的缺陷之一。

鉴于此,已作出部分修正,虽然还没有达到游戏更加人性化,但基本上能满足游戏的多方面的需要了。

企鹅小屋:垃圾服务商有跑路风险,站长注意转移备份数据!

企鹅小屋:垃圾服务商有跑路风险!企鹅不允许你二次工单的,二次提交工单直接关服务器,再严重就封号,意思是你提交工单要小心,别因为提交工单被干了账号!前段时间,就有站长说企鹅小屋要跑路了,站长不太相信,本站平台已经为企鹅小屋推荐了几千元的业绩,CPS返利达182.67CNY。然后,站长通过企鹅小屋后台申请提现,提现申请至今已经有20几天,企鹅小屋也没有转账。然后,搞笑的一幕出现了:平台账号登录不上提示...

LayerStack$10.04/月(可选中国香港、日本、新加坡和洛杉矶)高性能AMD EPYC (霄龙)云服务器,

LayerStack(成立于2017年),当前正在9折促销旗下的云服务器,LayerStack的云服务器采用第 3 代 AMD EPYC™ (霄龙) 处理器,DDR4内存和企业级 PCIe Gen 4 NVMe SSD。数据中心可选中国香港、日本、新加坡和洛杉矶!其中中国香港、日本和新加坡分为国际线路和CN2线路,如果选择CN2线路,价格每月要+3.2美元,付款支持paypal,支付宝,信用卡等!...

3G流量免费高防CDN 50-200G防御

简介酷盾安全怎么样?酷盾安全,隶属于云南酷番云计算有限公司,主要提供高防CDN服务,高防服务器等,分为中国境内CDN,和境外CDN和二个产品,均支持SSL。目前CDN处于内测阶段,目前是免费的,套餐包0.01一个。3G流量(高防CDN)用完了继续续费或者购买升级包即可。有兴趣的可以看看,需要实名的。官方网站: :点击进入官网云南酷番云计算有限公司优惠方案流量3G,用完了不够再次购买或者升级套餐流量...

俄罗斯方块java为你推荐
rdlregardless是什么意思tvosTVOS智能电视操作系统如何越狱调度系统生产调度系统flowplayer如何编译flowplayer源码spawningVC中Error spawning cl.exe错误的解决方法.cf加速器玩CF需要用加速器吗?基础设施即服务基础设施、 产品服务、 财务和 () 这几个问题是商业模式设计需要去主要解决的。疫苗之王万兽之王是什么意思alphablenddelphi编程中value值是什么意思?杭州营销型网站易搜的易搜网络
google电话 主机评测 京东云擎 win8.1企业版升级win10 ubuntu更新源 申请个人网页 php空间申请 权嘉云 腾讯云分析 宁波服务器 息壤代理 微软服务器操作系统 电信主机 raid10 实惠 服务器防御 密钥索引 石家庄服务器 cpu使用率过高怎么办 更多