⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.java

📁 俄罗斯方块。适用于初学者学习。想念很好
💻 JAVA
字号:
package xn.tetris;


import java.io.IOException;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;

/**
 * 主类
 * 此类完成控制面板的界面
 * 及各种事件处理
 * */
public class Main {

	private Menu menuBar, fileMenu, helpMenu;
	private MenuItem fileMenuHeader, helpMenuHeader;
	private MenuItem fileExitItem, aboutItem, helpItem;
	Display display;
	Shell shell;
	private Canvas tetrisBoardCanvas;
	private Canvas nextBoardCanvas;
	private Button btStartPause;
	private Label lbScore;
	private Label lbLevel;
	private int score;
	private int level;
	private int highestScore;
	private int highestLevel;
	private String creator;
	private GC tetrisGC;
	private GC nextGC;
	private Game game;
	private Label lbHighestScoreInfo;
	private Label lbHighestScore;
	private Label lbHighestLevel;
	private Label lbCreator;
	private SaveFileIO io;
	private String[] info;

	public Main(){
		io = new SaveFileIO();
		try {
			info = io.readFromFile();
			creator = info[0];
			highestScore = Integer.valueOf(info[1]);
			highestLevel = Integer.valueOf(info[2]);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		init();
		
	}
	
	//初始化,画出控制面板界面
	public void init(){
		
		display = new Display();
		
		shell = new Shell(display, SWT.SHELL_TRIM & ~SWT.RESIZE &
				~SWT.MAX );
		shell.setText("myTetris");
		shell.setMinimumSize(600, 600);

		GridLayout gdLayout = new GridLayout(2, true);
		int xCenter = shell.getSize().x / 8;
		int yCenter = shell.getSize().y / 8;

		shell.setLocation(xCenter, yCenter);
		shell.setLayout(gdLayout);
		createMenuBar();
		
		tetrisBoardCanvas = new Canvas(shell, SWT.NONE);
		GridData gd = new GridData(GridData.FILL_BOTH);
		gd.verticalSpan = 9;
		gd.heightHint = 600;
		gd.widthHint = 300;
		tetrisBoardCanvas.setBackground(new Color(display, 0, 0, 0));
		tetrisBoardCanvas.setLayoutData(gd);
		
		nextBoardCanvas = new Canvas(shell, SWT.NONE);
		gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
		gd.heightHint = 150;
		gd.widthHint = 150;
		nextBoardCanvas.setBackground(new Color(display, 0, 0, 0));
		nextBoardCanvas.setLayoutData(gd);
		
		score = 0;
		lbScore = new Label(shell, SWT.NONE);
		lbScore.setText("Score:  " + score);
		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
		gd.widthHint = 150;
		gd.horizontalIndent = 80;
		gd.verticalIndent = 20;
		lbScore.setLayoutData(gd);
		
		level = 1;
		lbLevel = new Label(shell, SWT.NONE);
		lbLevel.setText("Level:  " + level);
		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
		gd.widthHint = 150;
		gd.horizontalIndent = 80;
		gd.verticalIndent = 20;
		lbLevel.setLayoutData(gd);
	
		btStartPause = new Button(shell, SWT.PUSH);
		btStartPause.setText("Start");
		gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER );
		gd.widthHint = 100;
		gd.verticalIndent = 50;
		btStartPause.setLayoutData(gd);
		
		lbHighestScoreInfo = new Label(shell, SWT.NONE);
		lbHighestScoreInfo.setText("Best Result:");
		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
		gd.widthHint = 150;
		gd.horizontalIndent = 45;
		gd.verticalIndent = 50;
		lbHighestScoreInfo.setLayoutData(gd);
		
		lbHighestScore = new Label(shell, SWT.NONE);
		lbHighestScore.setText("Score:  " + highestScore);
		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
		gd.widthHint = 150;
		gd.horizontalIndent = 80;
		gd.verticalIndent = 15;
		lbHighestScore.setLayoutData(gd);
		
		lbHighestLevel = new Label(shell, SWT.NONE);
		lbHighestLevel.setText("Level:  " + highestLevel);
		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
		gd.widthHint = 150;
		gd.horizontalIndent = 80;
		gd.verticalIndent = 15;
		lbHighestLevel.setLayoutData(gd);
	
		lbCreator = new Label(shell, SWT.NONE);
		lbCreator.setText("Creator:  " + creator);
		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
		gd.widthHint = 180;
		gd.horizontalIndent = 68;
		gd.verticalIndent = 15;
		lbCreator.setLayoutData(gd);
		
		game = new Game(10, 20, display, this);
		tetrisGC = new GC(tetrisBoardCanvas);
		nextGC = new GC(nextBoardCanvas);
		
		addListeners();
		
		shell.pack();
		shell.open();
		retainShell();
		
	}
	
	public void retainShell(){
		
		while(!shell.isDisposed()){
			if(!display.readAndDispatch()){
				display.sleep();
				}
		}
		display.dispose();
	}
	//设置最高分数的显示
	public void setHighestScore(int score){
		lbHighestScore.setText("Score:  " + score);
	}
	
	//设置分数的显示
	public void setScoreText(int score){

		lbScore.setText("Score:  " + score);
	}
	//设置玩家玩到的最高等级显示
	public void setHighestLevel(int level){
		lbHighestLevel.setText("Level:  " + level);
	}
	
	//设置最高分玩家姓名
	public void setCreatorName(String name){
		lbCreator.setText("Creator:  " + name);
	}
	
	//设置等级的显示
	public void setLevelText(int level){
		lbLevel.setText("Level:  " + level);
	}
	//设置按钮上的文字
	public void setBtStartPauseText(String text){
		btStartPause.setText(text);
	}
	//得到游戏主面板的画布
	public Canvas getTetrisBoardCanvas(){
		return tetrisBoardCanvas;
	}
	//得到显示下一个方块面板的画布
	public Canvas getNextBoardCanvas(){
		return nextBoardCanvas;
	}
	
//	创建menu bar
	private void createMenuBar(){
		menuBar = new Menu(shell, SWT.BAR);
		fileMenuHeader = new MenuItem(menuBar, SWT.CASCADE);
		fileMenuHeader.setText("文件");
		
		fileMenu = new Menu(shell, SWT.DROP_DOWN);
		fileMenuHeader.setMenu(fileMenu);
		fileExitItem = new MenuItem(fileMenu, SWT.PUSH);
		fileExitItem.setText("退出");
		
		helpMenuHeader = new MenuItem(menuBar, SWT.CASCADE);
		helpMenuHeader.setText("帮助");
		
		helpMenu = new Menu(shell, SWT.DROP_DOWN);
		helpItem = new MenuItem(helpMenu, SWT.PUSH);
		helpItem.setText("操作方法");
		helpMenuHeader.setMenu(helpMenu);
		aboutItem = new MenuItem(helpMenu, SWT.PUSH);
		aboutItem.setText("关于");
		
		shell.setMenuBar(menuBar);
		
	}
	//添加监听器
	public void addListeners() {
		tetrisBoardCanvas.addKeyListener(new ControlGameByKey());
		tetrisBoardCanvas.addPaintListener(new PaintTetrisBoard());
		nextBoardCanvas.addPaintListener(new PaintNextBoard());
		fileExitItem.addSelectionListener(new FileExitItemAdapter());
		aboutItem.addSelectionListener(new AboutItemAdapter());
		helpItem.addSelectionListener(new HelpItemAdapter());
		btStartPause.addSelectionListener(new StartPauseAdapter());
		shell.addListener(SWT.Close, new SwtCloseAdapter());
	}
	//键盘事件处理
	class ControlGameByKey extends KeyAdapter{
		public void keyPressed(KeyEvent e) {

			game.controlGame(e);

		}

	}
	
	//tetrisBoardCanvas上的重绘事件处理
	class PaintTetrisBoard implements PaintListener{
		
		public void paintControl(PaintEvent e) {
			
			MyGC.setMyGC(tetrisGC);
			if(!game.isPlaying()){
				if(!game.isGameOver()){
					game.tetrisBoard.drawMessage("Press Start");
				}
				else{
					game.tetrisBoard.draw();
					game.tetrisBoard.drawMessage("Game Over");
				}
			}
			else{
				
				if(game.isPaused()){
					game.tetrisBoard.draw();
					game.currentBlock.draw();
					game.tetrisBoard.drawMessage("Paused");
				}
				else{
					game.currentBlock.draw();
					game.tetrisBoard.draw();
				}
			}
			
		}
		
	}
	//nextBlockBoardCanvas上的重绘事件处理
	class PaintNextBoard implements PaintListener{

		public void paintControl(PaintEvent e) {
			// TODO Auto-generated method stub

			MyGC.setMyGC(nextGC);
			if(game.isGameOver()){
				game.nextBoard.clear();
			}
			else if(!game.isPlaying()){
				game.nextBoard.clear();
			}
			else{
				game.nextBoard.draw();
			}
			MyGC.setMyGC(tetrisGC);
		}
		
	}
	
	
//	红叉按钮事件处理
	class SwtCloseAdapter extends SelectionAdapter implements Listener{
		public void handleEvent(Event event) {
			display.dispose();
			game.quit();
			tetrisGC.dispose();
			nextGC.dispose();
        }

	}
	
	//退出按钮事件处理
	class FileExitItemAdapter extends SelectionAdapter{
		public void widgetSelected(SelectionEvent arg0) {
			// TODO Auto-generated method stub
			display.dispose();
			game.quit();
			tetrisGC.dispose();
			nextGC.dispose();
			
		}
	}
	//关于按钮事件处理
	class AboutItemAdapter extends SelectionAdapter{
		public void widgetSelected(SelectionEvent arg0) {
			if(game.isPlaying() && !game.isPaused()){
				game.pauseGame();
				btStartPause.setText("Resume");
			}
			new AbortUI(display);
		}
	}
	//操作方法按钮事件处理
	class HelpItemAdapter extends SelectionAdapter{
		public void widgetSelected(SelectionEvent arg0) {
			if(game.isPlaying() && !game.isPaused()){
				game.pauseGame();
				btStartPause.setText("Resume");
			}
				
			new HelpUI(display);
		}
	}
//	start按钮事件处理
	class StartPauseAdapter extends SelectionAdapter{

		public void widgetSelected(SelectionEvent arg0) {
			
			if(!game.isPlaying()){
				if(!game.isGameOver()){
					game.startGame();
					btStartPause.setText("Pause");
				}
				else{
					game.gameOver();
					if(game.isTryAgain()){
						btStartPause.setText("Pause");
						game.startGame(); 
					}
				}
			}
			else{
				if(!game.isPaused()){
					btStartPause.setText("Resume");
					game.pauseGame();
					
				}
	
				else{
					btStartPause.setText("Pause");
					game.resumeGame();
				}
					
			}
			tetrisBoardCanvas.forceFocus();//强制将焦点移到tetrisBoardCanvas上
			tetrisBoardCanvas.redraw();
			
		}
	}
	//主函数
	public static void main(String[] args){
		
		new Main();
		
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -