java 俄罗斯方块

[复制链接]
查看11 | 回复1 | 2007-10-8 09:06:14 | 显示全部楼层 |阅读模式
import java.awt.*;import java.awt.event.*;//俄罗斯方块类public class Mytest 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){Mytest ers = new Mytest("俄罗斯方块游戏");WindowListener win_listener = new WinListener();ers.addWindowListener(win_listener); }// 俄罗斯方块类的构造方法 Mytest(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);//定义按钮playButton play_b = new Button("开始游戏");play_b.setSize(new Dimension(50,200));play_b.addActionListener(new Command(Command.button_play,gameScr));//定义按钮Level UPButton level_up_b = new Button("提高级数");level_up_b.setSize(new Dimension(50,200));level_up_b.addActionListener(new Command(Command.button_levelup,gameScr));//定义按钮Level DownButton level_down_b =new Button("降低级数");level_down_b.setSize(new Dimension(50,200));level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr));//定义按钮Level PauseButton pause_b =new Button("游戏暂停");pause_b.setSize(new Dimension(50,200));pause_b.addActionListener(new Command(Command.button_pause,gameScr));//定义按钮QuitButton 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 || 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 1){ Mytest.level--; Mytest.levelField.setText(""+Mytest.level); Mytest.score = 0; Mytest.scoreField.setText(""+Mytest.score);}scr.requestFocus();break;case button_pause:if(pause_resume){ Mytest.timer.suspend(); pause_resume = false;}else{ Mytest.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 > 1; }}return true; }// 同步显示的方法 public synchronized void dispBlock(int s){int k = 0x8000;for (int i = 0; i >1; }} }}//定时线程class MyTimer extends Thread{ GameCanvas scr; public MyTimer(GameCanvas scr){this.scr = scr; } public void run(){while(true){ try{
sleep((10-Mytest.level + 1)*100); } catch(InterruptedException e){} if(!scr.getBlock().fallDown()){
scr.deleteFullLine();
if(scr.isGameEnd()){
Mytest.isPlay = false;
suspend();
}else
scr.getBlock().reset(); }} }}class WinListener extends WindowAdapter{ public void windowClosing (WindowEvent l){System.exit(0); }}
回复

使用道具 举报

千问 | 2007-10-8 09:06:14 | 显示全部楼层
哇,二L弄什么啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行