俄罗斯方块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 键,这是该游戏的缺陷之一。

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

tmhhost(100元/季)自带windows系统,香港(三网)cn2 gia、日本cn2、韩国cn2、美国(三网)cn2 gia、美国cn2gia200G高防

tmhhost可谓是相当熟悉国内网络情况(资质方面:ISP\ICP\工商齐备),专业售卖海外高端优质线路的云服务器和独立服务器,包括了:香港的三网cn2 gia、日本 cn2、日本软银云服务器、韩国CN2、美国三网cn2 gia 云服务器、美国 cn2 gia +200G高防的。另外还有国内云服务器:镇江BGP 大连BGP数据盘和系统盘分开,自带windows系统,支持支付宝付款和微信,简直就是专...

sharktech:洛杉矶/丹佛/荷兰高防服务器;1G独享$70/10G共享$240/10G独享$800

sharktech怎么样?sharktech (鲨鱼机房)是一家成立于 2003 年的知名美国老牌主机商,又称鲨鱼机房或者SK 机房,一直主打高防系列产品,提供独立服务器租用业务和 VPS 主机,自营机房在美国洛杉矶、丹佛、芝加哥和荷兰阿姆斯特丹,所有产品均提供 DDoS 防护。不知道大家是否注意到sharktech的所有服务器的带宽价格全部跳楼跳水,降幅简直不忍直视了,还没有见过这么便宜的独立服...

日本CN2独立物理服务器 E3 1230 16G 20M 500元/月 提速啦

提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...

俄罗斯方块java为你推荐
ISDNISDN是什么?赶什么用的? 详细点谢谢!saltstacksaltstack使用中的问题?master端sudo salt-master -l debug提示信息像这样,是什么情况?怎样改?g2g电子商务中的g2g模式代表showwindowvfp中菜单生成不能运行,提示说要把showwindow属性设为2,不懂求解知识库管理系统销售易CRM知识库,这是干什么用的?策略组电脑组策略详解备忘录模式手机如何设置备忘录提醒php论坛用php写一个论坛,重点是什么?还有具体的功能,谢谢有b吗有什么好看的b级片欢迎页面欢迎屏幕!!!!
紧急升级请记住新域名 域名大全 华为4核 本网站服务器在美国 天互数据 鲁诺 www789 photobucket 服务器防火墙 美国迈阿密 阿里云邮箱申请 杭州电信宽带 phpinfo winds windowsserverr2 linux服务器系统 linuxvi ddos攻击 香港云主机 堡垒主机 更多