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

📄 squaregamepanel.java

📁 Java编写的俄罗斯方块游戏 Java编写的俄罗斯方块游戏
💻 JAVA
字号:
package game;

import javax.swing.*;
import javax.swing.Timer;
import java.awt.geom.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class SquareGamePanel extends JPanel implements Data, Serializable 

{
	public SquareGamePanel(SquareGameFrame frame)
	{
		for(int i = LEFT; i <= RIGHT; i++)
		{
			for(int j = UP; j <= DOWN; j++)
			{
				flag[i][j] = 0;
			}
		}
		
		addKeyListener(new KeyHandler());
		setFocusable(true);
		timerAction = new TimerAction();
		timer = new Timer(1000, timerAction);
		timer.start();
		
		sr1 = makeNewSquareRoot();
		sr2 = makeNewSquareRoot();
		score = 0;
		
		this.frame = frame;
		
		square = new Square();
	}
	
	public void drawGameFrame(Graphics2D g2)
	{
		Rectangle2D.Double leftFrame=new Rectangle2D.Double(BIGLEFT, BIGUP, 200, 400);
		Rectangle2D.Double rightFrame=new Rectangle2D.Double(LITTLELEFT, LITTLEUP, 80, 80);
		g2.draw(leftFrame);
		g2.draw(rightFrame);
	}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D)g;
		
		drawGameFrame(g2);
		
		if(frame.beginDraw)
		{
			sr1.draw(g2);
			sr2.drawNext(g2);
		}
		
		for(int i = LEFT; i <= RIGHT; i++)
		{
			for(int j = UP; j <= DOWN; j++)
			{
				if(flag[i][j] == 1)
				{
					square.x = i;
					square.y = j;
					square.color = color[i][j];
					square.draw(g2);
				}
			}
		}
		
		g.drawString("Score: " + score, LITTLELEFT, 200);
	}
	
	public void writeSelfToFile(File file)
	{

		try
		{
			FileOutputStream fileStream = new FileOutputStream(file);
			ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);
			objectStream.writeObject(flag);
			objectStream.writeObject(color);
			objectStream.writeObject(sr1);
			objectStream.writeObject(sr2);
			objectStream.writeObject(new Integer(score));
			objectStream.close();
			fileStream.close();
			
			JOptionPane.showConfirmDialog(frame,  "保存游戏进度成功", "俄罗斯方块", JOptionPane.DEFAULT_OPTION);
		}
		catch(Exception e)
		{
			JOptionPane.showConfirmDialog(frame, e.toString() + "\n保存游戏进度失败", "俄罗斯方块", JOptionPane.DEFAULT_OPTION);
		}
	}
	
	public void readSelfFromFile(File file)
	{
		
		try
		{
			int[][] f;
			SquareRoot s1, s2;
			Integer integer;
			Color[][] c;
			FileInputStream fileStream = new FileInputStream(file);
			ObjectInputStream objectStream = new ObjectInputStream(fileStream);
			f = (int[][])objectStream.readObject();
			c = (Color[][])objectStream.readObject();
			s1 = (SquareRoot)objectStream.readObject();
			s2 = (SquareRoot)objectStream.readObject();
			integer = (Integer)objectStream.readObject();
			objectStream.close();
			fileStream.close();
			
			System.out.println(f);
			System.out.println(s1);
			System.out.println(s2);
			System.out.println(integer);
			
			if(f != null && c != null && s1 != null && s2 != null && integer != null)
			{
				flag = f;
				color = c;
				sr1 = s1;
				sr2 = s2;
				score = integer.intValue();
				frame.runFlag = true;
				frame.beginDraw = true;
				frame.setGameStateIsPause();
		
				repaint();
				
				JOptionPane.showConfirmDialog(frame, "装载游戏进度成功", "俄罗斯方块", JOptionPane.DEFAULT_OPTION);
			}
		}
		catch(Exception e)
		{
			JOptionPane.showConfirmDialog(frame, e.toString() + "\n装载游戏进度失败", "俄罗斯方块", JOptionPane.DEFAULT_OPTION);
		}
	}
	
	private void writeScore()
	{
		if(score == 0)
		{
			return;
		}
		
		ReadAndWriteFile.setPath("file.dat");
		MyArray array = ReadAndWriteFile.read();
		if(array == null || array.isEmpty() || !array.isFull() || (array.getTair().score <= score && !array.isFull()))
		{
			String playerName = JOptionPane.showInputDialog("Please input a your name");
			while(playerName == null || playerName.length() == 0)
			{
				System.out.println("playerName: " + playerName);
				playerName = JOptionPane.showInputDialog("Please input a your name");
			}
			
			array.add(new Score(playerName, score));
			ReadAndWriteFile.write(array);
		}
	}
	
	private void judgeGameOver()
	{
		if(flag[4][UP] == 1 || flag[5][UP] == 1 || flag[6][UP] == 1)
		{
			gameOver = true;
			writeScore();
			int result =JOptionPane.showConfirmDialog(frame, 
					"Game over! Continue?", "俄罗斯方块", JOptionPane.YES_NO_OPTION);
			if(result == JOptionPane.YES_OPTION)
			{
				for(int i = LEFT; i <= RIGHT; i++)
				{
					for(int j = UP; j <= DOWN; j++)
					{
						flag[i][j] = 0;
					}
				}
				frame.runFlag = true;
				score = 0;
				gameOver = false;
			}
			else
			{
				System.exit(0);
			}
		}
	}
	
	private class KeyHandler implements KeyListener
	{
		public void keyPressed(KeyEvent event)
		{
			int keyCode = event.getKeyCode();
			switch(keyCode)
			{
				case KeyEvent.VK_LEFT:
					if(frame.runFlag)
						sr1.moveLeft(flag);
					break;
					
				case KeyEvent.VK_RIGHT:
					if(frame.runFlag)
						sr1.moveRight(flag);
					break;
					
				case KeyEvent.VK_UP:
					if(frame.runFlag)
						sr1.changeState(flag);
					break;
					
				case KeyEvent.VK_DOWN:
					if(frame.runFlag)
						sr1.moveDown(flag);
					break;
					
				default:
					break;
			}
			repaint();
		}
		
		public void keyReleased(KeyEvent event)
		{
		}
		
		public void keyTyped(KeyEvent event)
		{
		}
	}
	
	private class TimerAction implements ActionListener, Serializable
	{
		public void actionPerformed(ActionEvent event)
		{
			System.out.println(frame.runFlag);
			if(gameOver || !frame.runFlag)
			{
				return;
			}
			
			timer.setDelay(1000 - 200 * (frame.speedFlag - 1));
			
			int num = 0;
			sr1.moveDown(flag);
			
			if(!sr1.isLife)
			{
				for(int i = 0; i < 4; i++)
				{
					flag[sr1.square[i].x][sr1.square[i].y] = 1;
					color[sr1.square[i].x][sr1.square[i].y] = sr1.color;
				}
				
				judgeGameOver();
				
				for(int i = UP; i <= DOWN; i++)
				{
					int count = 0;
					for(int j = LEFT; j <= RIGHT; j++)
					{
						count += flag[j][i];
					}
					
					if(count == 10)
					{
						num++;
						
						for(int m = i; m > UP; m--)
						{
							for(int n = LEFT; n <= RIGHT; n++)
							{
								flag[n][m] = flag[n][m - 1];
								color[n][m] = color[n][m - 1];
							}
						}
						
						for(int s = LEFT; s <= RIGHT; s++)
						{
							flag[s][UP] = 0;
						}
					}
				}
				
				sr1 = sr2;
				sr2 = makeNewSquareRoot();
			}
			if(num == 1)
			{
				score += num * 10;
			}
			else if(num > 1)
			{
				score += (num + 1) * 10;
			}
			
			repaint();
		}
	}
	
	private SquareRoot makeNewSquareRoot()
	{
		SquareRoot sr = null;
		int index = (int)(Math.random() * 7);
		switch(index)
		{
		case 0:
			sr = new SquareRoot1();
			break;
			
		case 1:
			sr = new SquareRoot2();
			break;
			
		case 2:
			sr = new SquareRoot3();
			break;
			
		case 3:
			sr = new SquareRoot4();
			break;
			
		case 4:
			sr = new SquareRoot5();
			break;
			
		case 5:
			sr = new SquareRoot6();
			break;
			
		case 6:
			sr = new SquareRoot7();
			break;
	
		default:
			break;
		}
		
		return sr;
	}
	
	
	public int flag[][] = new int[10][20];
	public Color color[][] = new Color[10][20];
	public SquareRoot sr1;
	public SquareRoot sr2;
	public TimerAction timerAction;
	public int score;
	public SquareGameFrame frame;
	public Timer timer;
	public Square square;
	public boolean gameOver;
	
}

⌨️ 快捷键说明

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