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

📄 russiarect.java

📁 java应用举例
💻 JAVA
字号:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RussiaRect extends Applet
{
	private GameTable myGameTable;                 //创建一个游戏桌
	private Image rectImageOne,rectImageTwo;       //加载两个图片,用来覆盖背景和组成方块
	private JButton btStart,btRestart;             //创建两个按钮,一个开始,一个重新开始
	private int speed=800;                         //速度,创建记时器是使用
	private int currentRect;                       //标志创建哪一个要下落的方块
	private boolean canMove=false;	               //标志是否响应键盘
	private Root root;                             //要落下的方块的引用,即根类
	private int nextRect;                          //标志下一个要创建的方块,即提前显示下落块
	private Timer timer;                           //记时器,用于控制下落时间间隔
	private int nScore=0;                          //用来记录总分数
	private JComboBox speedContorller;             //选择速度的控件
	private Label scorelabel;                      //显示成绩的控件
	private StartListener startlistener;           //开始按钮事件监听器
	private String[] choices={"1","2","3","4","5"};//JComboBox的选项单

	

	public void init()//初始化各个变量
	{	
		btStart=new JButton("开始");
		btRestart=new JButton("重新开始");

		btStart.setToolTipText("开始新游戏");
		btRestart.setToolTipText("重新开始游戏");	

		setLayout(null);                       //设为空布局
		
		btStart.setBounds(320,275,80,20);
		btRestart.setBounds(320,320,80,20);
		add(btStart);
		add(btRestart);

		startlistener=new StartListener();     //为两个按钮添加监听器
		btStart.addActionListener(startlistener);
		btRestart.addActionListener(new RestartListener());
		btRestart.setEnabled(false);           //禁用初始重开始按钮

		rectImageOne=getImage(getCodeBase(),"rect0.jpg");//加载图片
		rectImageTwo=getImage(getCodeBase(),"rect1.jpg");	
		
		speedContorller=new JComboBox(choices);//初始速度控件
		speedContorller.addItemListener(new SpeedListener());
		speedContorller.setEditable(false);
		speedContorller.setBounds(320,70,80,20);
		add(speedContorller);

		scorelabel=new Label("0");//初始成绩控件
		scorelabel.setBounds(320,125,80,20);
		add(scorelabel);

		myGameTable.x=15;//初始化游戏桌
		myGameTable.y=20;
		myGameTable.myTable=new int[myGameTable.x][myGameTable.y];
		for(int i=0;i<myGameTable.x;i++)
			for(int j=0;j<myGameTable.y;j++)
				myGameTable.myTable[i][j]=0;

		currentRect=(((int)Math.round(Math.random()*12345))%8)+1;//产生随机方块
		switch(currentRect)//初始化产生的方块
		{
			case 1:root=new One();break;
			case 2:root=new Two();break;
			case 3:root=new Three();break;
			case 4:root=new Four();break;
			case 5:root=new Five();break;
			case 6:root=new Six();break;
			case 7:root=new Seven();break;
			case 8:root=new Eight();break;
			default:break;
		}
		root.begin();//占据桌子,详见root类
		nextRect=(((int)Math.round(Math.random()*12345))%8)+1;//产生下一个提前显示的方块
		currentRect=nextRect;
		
		timer=new Timer(speed,new MyRun());//创建记时器

       		addKeyListener(new KeyAdapter()    //主窗口添加键盘监听器
					{
						public void keyPressed(KeyEvent e)
						{	
							if(canMove)//如果满足记时器开始
								judgement(e);//响应输入
						}
					});	
		btStart.addKeyListener(new KeyAdapter()//两个按钮添加键盘监听器,前面添的是鼠标点击监听器
					{
						public void keyPressed(KeyEvent e)
						{
							if(canMove)
								judgement(e);
						}
					});
		btRestart.addKeyListener(new KeyAdapter()
					{
						public void keyPressed(KeyEvent e)
						{
							if(canMove)
								judgement(e);
						}
					});
	}

	public void start()
	{
		
	}

	public void stop()
	{
		
	}	

	public void paint(Graphics g)
	{
		g.setColor(Color.cyan);         //画背景框架,两个大长方形
		for(int i=0;i<10;i++)
			g.drawRect(10+i,10+i,420-2*i,400-2*i);
		g.setColor(new Color(255,0,0));
		for(int i=0;i<5;i++)
			g.drawRect(40+i,40+i,267-2*i,352-2*i);
		for(int i=0;i<myGameTable.x;i++)//决定是否画方块
			for(int j=0;j<myGameTable.y;j++)
			{
				if(myGameTable.myTable[i][j]==1)//有,画蓝方块
					{
						g.drawImage(rectImageTwo,45+i*(15+2)+2,45+j*(15+2)+2,this);
					}
				else if(myGameTable.myTable[i][j]==0)//无,画白方块
					{
						g.drawImage(rectImageOne,45+i*(15+2)+2,45+j*(15+2)+2,this);
					}
			}	
		btStart.repaint();
		btRestart.repaint();
		speedContorller.repaint();
		scorelabel.setText(Integer.toString(nScore));//更新成绩
		scorelabel.setBackground(new Color(191,186,220));
		scorelabel.repaint();
		g.drawString("速度(1..5)",320,60);
		g.drawString("分数:",320,110);
		g.drawString("下一个:",325,165);
		g.setColor(Color.red);
		nextTo(g);                                  //画下一个提前显示的方块
	}

	public void update(Graphics g)
	{
		paint(g);
	}

	public void nextTo(Graphics g)                     //画下一个提前显示的方块
	{	
		for(int i=0;i<3;i++)                       //先全部用白方块覆盖
			for(int j=0;j<4;j++)
				g.drawImage(rectImageOne,330+i*(15+2),180+j*(15+2),this);
		switch(nextRect)                           //根据标志决定画哪个方块,画蓝方块
		{	
			case 1:g.drawImage(rectImageTwo,347,180,this);
			       g.drawImage(rectImageTwo,347,197,this);
			       g.drawImage(rectImageTwo,347,214,this);
			       g.drawImage(rectImageTwo,347,231,this);
			       break;
			case 2:g.drawImage(rectImageTwo,330,197,this);
			       g.drawImage(rectImageTwo,330,214,this);
			       g.drawImage(rectImageTwo,347,197,this);
			       g.drawImage(rectImageTwo,347,214,this);
			       break;
			case 3:g.drawImage(rectImageTwo,330,197,this);
			       g.drawImage(rectImageTwo,330,214,this);
			       g.drawImage(rectImageTwo,347,180,this);
			       g.drawImage(rectImageTwo,347,197,this);
			       break;
			case 4:g.drawImage(rectImageTwo,330,180,this);
			       g.drawImage(rectImageTwo,330,197,this);
			       g.drawImage(rectImageTwo,347,197,this);
			       g.drawImage(rectImageTwo,347,214,this);
			       break;
			case 5:g.drawImage(rectImageTwo,330,180,this);
			       g.drawImage(rectImageTwo,330,197,this);
			       g.drawImage(rectImageTwo,330,214,this);
			       g.drawImage(rectImageTwo,347,180,this);
			       break;
			case 6:g.drawImage(rectImageTwo,330,180,this);
			       g.drawImage(rectImageTwo,347,180,this);
			       g.drawImage(rectImageTwo,347,197,this);
			       g.drawImage(rectImageTwo,347,214,this);
			       break;
			case 7:g.drawImage(rectImageTwo,347,197,this);
			       g.drawImage(rectImageTwo,347,214,this);
			       g.drawImage(rectImageTwo,330,214,this);
			       g.drawImage(rectImageTwo,364,214,this);
			       break;
			case 8:g.drawImage(rectImageTwo,347,197,this);
			       break;
			default:break;
		}
	}

	public void judgement(KeyEvent e)//判断输入的是哪个键,并做出响应
	{
		switch(e.getKeyCode())
		{
			case KeyEvent.VK_DOWN://如果是向下键,就一下到底,并产生一个新的方块
				root.downTo();
				lineOver();//消去添满的一行,并加10分
				switch(currentRect)//产生新的方块
				{
					case 1:root=new One();break;
					case 2:root=new Two();break;
					case 3:root=new Three();break;
					case 4:root=new Four();break;
					case 5:root=new Five();break;
					case 6:root=new Six();break;
					case 7:root=new Seven();break;
					case 8:root=new Eight();break;
					default:break;
				}
				nextRect=(((int)Math.round(Math.random()*12345))%8)+1;
				currentRect=nextRect;
				if(!root.begin())//如果新的方块产生失败,则游戏结束
				{	
					repaint();
					gameover();
				}
				else	
				{
					repaint();
				}
				break;
			case KeyEvent.VK_LEFT:root.left();repaint();break;
			case KeyEvent.VK_RIGHT:root.right();repaint();break;
			case KeyEvent.VK_UP:root.change();repaint();break;
			default:break;
		}
	}

	public void lineOver()//消去添满的一行,并加10分
	{
		boolean isCan;//标志是否循环消一行
		boolean isContinue=true;//标志是否还有待消的行
		int k=myGameTable.y-1;
		while(isContinue)
		{
			isCan=true;
			while(isCan)
			{
				for(int i=0;i<myGameTable.x;i++)
				{
					if(myGameTable.myTable[i][k]!=1)
						isCan=false;
				}
				if(isCan)//满足条件,开始消行
				{
					for(int i=0;i<myGameTable.x;i++)
						myGameTable.myTable[i][k]=0;
					for(int j=k-1;j>=0;j--)
						for(int i=0;i<myGameTable.x;i++)
						{
							if(myGameTable.myTable[i][j]==1)
							{
								myGameTable.myTable[i][j+1]=1;
								myGameTable.myTable[i][j]=0;
							}
						}
					repaint();
					nScore+=35;//加成绩
				}
			}
			k--;
			if(k<1)
				isContinue=false;
		}
	}

	public void gameover()//游戏结束
	{
		timer.stop();
		JOptionPane anOptionPane=new JOptionPane();//弹出对话框
		anOptionPane.showMessageDialog(this,"Game Over!   Thank You!","HHr",JOptionPane.WARNING_MESSAGE);
		over();//处理各个变量,以便重新开始
	}

	public void over()//游戏结束后,处理各个变量,以便重新开始
	{
		timer.stop();
		for(int i=0;i<myGameTable.x;i++)//重新给游戏桌置0标志
			for(int j=0;j<myGameTable.y;j++)
			{
				myGameTable.myTable[i][j]=0;
			}
		repaint();
		nScore=0;
		switch(currentRect)//产生新的方块
		{
			case 1:root=new One();break;
			case 2:root=new Two();break;
			case 3:root=new Three();break;
			case 4:root=new Four();break;
			case 5:root=new Five();break;
			case 6:root=new Six();break;
			case 7:root=new Seven();break;
			case 8:root=new Eight();break;
			default:break;
		}
		nextRect=(((int)Math.round(Math.random()*12345))%8)+1;
		currentRect=nextRect;
		root.begin();
		repaint();
		btStart.setLabel("Start");
		btStart.setToolTipText("Start a game.");
		btStart.setEnabled(true);
		speedContorller.setEnabled(true);
		btRestart.setEnabled(false);
		btStart.setLabel("Start");
		startlistener.setisRun(true);
		canMove=false;
	}
	
	
	
	public class MyRun implements ActionListener//记时器调用的监听器
	{
		public void actionPerformed(ActionEvent e)
		{
			if(!root.down())//将方块下落一格,如果不能再下降了,就调用下面语句
			{
				lineOver();//消行
				switch(currentRect)//产生新的方块
				{
					case 1:root=new One();break;
					case 2:root=new Two();break;
					case 3:root=new Three();break;
					case 4:root=new Four();break;
					case 5:root=new Five();break;
					case 6:root=new Six();break;
					case 7:root=new Seven();break;
					case 8:root=new Eight();break;
					default:break;
				}
				nextRect=(((int)Math.round(Math.random()*12345))%8)+1;
				currentRect=nextRect;
				if(!root.begin())//如果失败,游戏结束
				{	
					repaint();
					gameover();
				}
				else	
					repaint();
			}
			else
			{
				repaint();
			}
		}
	}

	public class StartListener implements ActionListener//开始按钮监听器
	{
		private boolean isRun=true;//标志是开始还是暂停,一钮两用

		public void setisRun(boolean run)
		{
			isRun=run;
		}	

		public void actionPerformed(ActionEvent e)
		{
			speedContorller.setEnabled(false);
			btRestart.setEnabled(true);
			if(isRun)//是开始
			{
				btStart.setLabel("Pause");
				btStart.setToolTipText("Pause a game.");
				timer.start();
				isRun=!isRun;
				canMove=true;//可以响应键盘
			}
			else//是暂停
			{
				btStart.setLabel("Start");
				btStart.setToolTipText("Start a game.");
				timer.stop();
				isRun=!isRun;
				canMove=false;//不可以响应键盘
			}
		}
	
	}

	public class RestartListener implements ActionListener//重新开始按钮监听器
	{
		public void actionPerformed(ActionEvent e)
		{
			over();//重新初始化各个变量
		}
	}

	public class SpeedListener implements ItemListener//速度控件监听器
	{
		public  void itemStateChanged(ItemEvent e)
		{
			speed=1000-(new Integer(speedContorller.getSelectedItem().toString()).intValue())*110;
			timer=new Timer(speed,new MyRun());//根据选择的speed间隔重新设置记时器,以变换速度
		}
	}
}//主体结束

⌨️ 快捷键说明

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