首页>代码>java swing开发的俄罗斯方块游戏>/MyTetris/src/controller/Controller.java
package controller;

import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import listener.ContainerListener;

import util.Global;
import util.IConstant;
import view.LeftContainerPanel;
import view.RightContainerPanel;

import entities.Block;
import entities.BlockFactory;
import entities.FormListener;
import entities.LeftContainer;
import entities.RightContainer;

public class Controller extends KeyAdapter implements IConstant, ContainerListener,Runnable
{

	public static final int INIT = 1;
	public static final int PLAYING = 2;
	public static final int PAUSE = 3;
	public static final int SUCCESS = 5;
	public static final int FAIL = 6;
	private Block curBlock = null;// 当前块
	private Block nextBlock = null;// 下一个块
	private BlockFactory blockFactory = null;
	private RightContainer rightContainer = null;
	private LeftContainer leftContainer = null;
	public static int gameState;

	//private int score;
	
	public boolean run;

	private LeftContainerPanel leftContainerPanel;
	private RightContainerPanel rightContainerPanel;
	
	private FormListener formListener;

	public Controller(LeftContainerPanel leftContainerPanel,RightContainerPanel rightContainerPanel)
	{
		this.leftContainerPanel = leftContainerPanel;
		this.rightContainerPanel = rightContainerPanel;
		init();
	}

	private void init()
	{
		blockFactory = new BlockFactory();
		leftContainer = new LeftContainer();
		rightContainer = new RightContainer();
		rightContainer.setListener(this);
		
		setState(INIT);
		new Thread(this).start();
		
	}
	
	//开始游戏
	public void startGame()
	{
		clear();
		curBlock = blockFactory.getBlock();
		nextBlock = blockFactory.getBlock();
		leftContainer.init();
		rightContainer.init();
		setState(PLAYING);
	}
	
	//暂停游戏
	public void pauseGame()
	{
		setState(PAUSE);
	}
	
	//继续游戏
	public void continueGame()
	{
		setState(PLAYING);
	}
	
	//结束游戏
	public void endGame()
	{
		clear();
		setState(INIT);
	}
	
	private void clear()
	{
		curBlock = null;
		nextBlock = null;
	}
	
	
	

	/** 把下一个方块给当前方块,然后重新产生下一个方块 */
	private void proNewBlock()
	{
		curBlock = nextBlock;
		nextBlock = blockFactory.getBlock();
	}

	int flag = 0;// 控制游戏的速度

	/** 刷新当前页面 */
	public void update()
	{
		switch(gameState)
		{
			case INIT:
				rightContainerPanel.redisplay(curBlock, rightContainer);
				rightContainerPanel.repaint();
				leftContainerPanel.redisplay(nextBlock, leftContainer);
				leftContainerPanel.repaint();
				break;
			case PLAYING:
				if (flag == Global.DOWN_SPEED - 1)
				{
					if (rightContainer.isMoveable(curBlock, Block.DOWN))
					{
						curBlock.moveDown();
					}
					else
					{
						rightContainer.setBarrier(curBlock);
						if (!rightContainer.isFull())
						{
							// 产生新图像
							proNewBlock();
						}
					}
				}
				flag = (++flag) % Global.DOWN_SPEED;
				rightContainerPanel.redisplay(curBlock, rightContainer);
				rightContainerPanel.repaint();
				leftContainerPanel.redisplay(nextBlock, leftContainer);
				leftContainerPanel.repaint();
				break;
			case PAUSE:
				rightContainerPanel.redisplay(curBlock, rightContainer);
				rightContainerPanel.repaint();
				leftContainerPanel.redisplay(nextBlock, leftContainer);
				leftContainerPanel.repaint();
				break;
			case FAIL:
				rightContainerPanel.redisplay(null, rightContainer);
				rightContainerPanel.repaint();
				leftContainerPanel.redisplay(nextBlock, leftContainer);
				leftContainerPanel.repaint();
				break;
		}
		

	}

	/** 设置游戏状态 */
	public static void setState(int state)
	{
		gameState = state;
	}


//	public void setScore(int score)
//	{
//		this.score = score;
//	}

	public void containerIsFull()
	{
		// curBlock = null;
		setState(FAIL);
	}

	public void removeFullLine(int score)
	{
		//this.score = this.score + score;// 消除满行后增加分数
		formListener.addScore(score);

	}

	@Override
	public void run()
	{
		while(true)
		{
			update();
			
			try
			{
				Thread.sleep(Global.SLEEPTIME);
			} catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}


	@Override
	public void keyPressed(KeyEvent e)
	{
		if(gameState ==PLAYING)
		{
			switch (e.getKeyCode())
			{
				case KeyEvent.VK_UP:
				
					if (rightContainer.isMoveable(curBlock, Block.ROTATE))
					{
						curBlock.rotBlock();
					}
				break;
				case KeyEvent.VK_DOWN:
					if (rightContainer.isMoveable(curBlock, Block.DOWN))
					{
						curBlock.moveDown();
					}
				break;
				case KeyEvent.VK_LEFT:
					if (rightContainer.isMoveable(curBlock, Block.LEFT))
					{
						curBlock.moveLeft();
					}
				break;
				case KeyEvent.VK_RIGHT:
					if (rightContainer.isMoveable(curBlock, Block.RIGHT))
					{
						curBlock.moveRight();
					}
				break;
			}
		}
		
	}
	
	public void addListener(FormListener formListener)
	{
		this.formListener = formListener;
	}

}
最近下载更多
lhm789  LV6 2024年9月23日
luoyanglin  LV2 2024年9月14日
微信网友_7062902643691520  LV1 2024年7月2日
caojiaxuan  LV1 2024年6月20日
鬼屋报道  LV3 2024年6月4日
yx666666  LV1 2024年1月5日
ClydeSon  LV5 2023年12月27日
1351408674  LV1 2023年12月27日
1112WHQ  LV7 2023年11月3日
ggl163163eel  LV2 2023年10月18日
最近浏览更多
lhm789  LV6 2024年9月23日
luoyanglin  LV2 2024年9月14日
54ty1212 2024年8月6日
暂无贡献等级
微信网友_7062902643691520  LV1 2024年7月2日
feelinfer  LV1 2024年6月27日
qqqww11  LV2 2024年6月26日
azzzz1  LV2 2024年6月26日
hainabian1977  LV2 2024年6月24日
caojiaxuan  LV1 2024年6月20日
鬼屋报道  LV3 2024年6月1日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友