java實現俄羅斯方塊

基本實現俄羅斯方塊遊戲,有可能有一點小bug

import java.awt.Color;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.MatteBorder;
import javax.swing.event.TreeWillExpandListener;

public class TetrisMain extends JFrame {
	public LinkedList<JLabel> jLabels = new LinkedList<>();// 在地圖裏的方塊
	LinkedList<Integer> coord1 = new LinkedList<>();// 在地圖裏方塊的座標
	private int direction = 0;
	private int temp = 0;// 變換動作切換參數
	public int[] coord = new int[4];// 正在下落得方塊
	JPanel jPanel = null;
	private RandomAccessFile rankingFile = null;// 爲存儲排名所創建的隨機存儲類
	ArrayList<Integer> list = new ArrayList<>();// 排名集合類
	private boolean isBatton = false;// 根據isBatton標誌位來判定是否彈出/收起排名單
	private boolean isSuspend = true;// 根據isSuspend標誌位來判定繼續/暫停
	private boolean isStart = false;// 根據isStart來控制開始

	private void fileOperations() {
		// 採用冒泡排序對list排名集合進行排名
		for (int i = 0; i < list.size() - 1; i++) {
			for (int j = list.size() - 1 - i; j > 0; j--) {
				if (list.get(j) > list.get(j - 1)) {
					int temp = list.get(j);
					list.set(j, list.get(j - 1));
					list.set(j + 1, temp);
				}
			}
		}
		try {
			// 將排名存入文件
			rankingFile = new RandomAccessFile("分數.txt", "rwd");
			for (int j = 0; j < list.size(); j++) {
				// 控制只存儲5個最大的值
				if (j > 4) {
					break;
				}
				rankingFile.writeInt(list.get(j));
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private void fileOperation() {
		try {// 排名從文件中取出
			rankingFile = new RandomAccessFile("分數.txt", "rwd");

			while (true) {
				int temp = rankingFile.readInt();
				list.add(temp);
			}

		} catch (IOException e) {

		}

	}

	// 設置窗體大小,屏幕位置,可管,佈局爲空
	public TetrisMain() {

		this.setTitle("俄羅斯方塊");
		this.setSize(700, 600);
		this.setLocation(200, 200);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLayout(null);
	}

	// 變換動作
	private void transformation() {
		// 根據temp來判定要變得的方塊類型
		switch (temp) {
		case 0: {
			
			if (coord[0] == coord[1] + 1 || coord[0] == coord[1] - 1) {
				for (int i = 0; i < coord.length; i++) {
					coord[i] = coord[1] + (i - 1) * 20;

				}

			} else {
				for (int i = 0; i < coord.length; i++) {
					coord[i] = coord[1] + i - 1;
				}
			}
		}
			break;
		case 1:
			if (coord[0] == coord[2] + 20 && coord[2] == coord[3] + 1) {

				coord[3] = coord[2] - 20;
			} else if (coord[3] == coord[2] - 20 && coord[2] == coord[0] - 20) {
				coord[0] = coord[2] - 1;
			} else if (coord[0] == coord[2] - 1 && coord[1] == coord[2] + 1) {

				coord[1] = coord[2] + 20;
			} else {
				System.out.println("aaa");
				coord[0] = coord[1];
				coord[1] = coord[2] + 1;
				coord[3] = coord[2] - 1;
			}
			break;
		case 3:
			if (coord[3] == coord[2] - 20) {
				System.out.println("aa");
				coord[3] = coord[2] - 1;
				coord[1] = coord[2] - 20;
				coord[0] = coord[2] - 20 + 1;
			} else if (coord[3] == coord[2] - 1 && coord[1] == coord[0]) {
				coord[3] = coord[2] + 20;
				coord[1] = coord[2] + 1;
				coord[0] = coord[1] - 20;

			} else if (coord[3] == coord[2] + 20) {
				coord[3] = coord[2] - 1;
				coord[1] = coord[2] - 20;
				coord[0] = coord[1] + 1;
			} else {
				coord[3] = coord[2] - 20;
				coord[1] = coord[2] + 1;
				coord[0] = coord[1] + 20;
			}
			break;
		case 4:
			if (coord[0] == coord[1] + 20) {

				coord[3] = coord[2] + 20;
				coord[1] = coord[2] - 20;
				coord[0] = coord[1] + 1;
			} else if (coord[1] == coord[0] - 1) {
				coord[0] = coord[1] - 1;
			} else if (coord[0] == coord[1] - 1) {
				coord[3] = coord[2] - 1;
				coord[1] = coord[2] + 1;
				coord[0] = coord[3] - 20;
			} else {
				coord[0] = coord[1] + 20;
			}
		default:
			break;
		}

	}

	public void init() {
		JButton ranking = new JButton("排名");// 排名按鈕
		ranking.setSize(60, 15);

		ranking.setLocation(440, 0);
		this.add(ranking);
		//排名顯現窗口
		JLabel[] jLabels1 = new JLabel[5];
		for (int i = 0; i < jLabels1.length; i++) {

			jLabels1[i] = new JLabel();
			jLabels1[i].setSize(60, 15);
			jLabels1[i].setLocation(800, 800);//將沒有點擊排名按鈕的顯現窗口放在看不到的文職
			this.add(jLabels1[i]);

		}

		ranking.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if (!isBatton) {
					//isBatton爲false顯現窗口
					fileOperation();
					for (int i = 0; i < jLabels1.length; i++) {
						if (i <= list.size() - 1) {
							jLabels1[i].setText((i + 1) + "." + list.get(i));//將排名添加到JLabel中
							jLabels1[i].setLocation(440, 15 + i * 15);//將JLabel方法排名按鈕下
						} else {
							jLabels1[i].setLocation(440, 15 + i * 15);;//如果list.size()小於i數就不需要沒有在存在分數所以只移動位置
						}
						jLabels1[i].setBorder(new MatteBorder(new Insets(2, 2, 2, 2), Color.blue));
					}
                       
					isBatton = true;
				} else {
					//收起排名窗口
					for (int i = 0; i < jLabels1.length; i++) {
						jLabels1[i].setLocation(800, 800);
						isBatton = false;
					}
				}
				//點擊按鈕後將
				TetrisMain.this.requestFocus();
			}
		});

		JButton suspend = new JButton("繼續/暫停");
		suspend.setSize(80, 15);
		suspend.setLocation(510, 0);
		this.add(suspend);
		suspend.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				isSuspend = !isSuspend;
				TetrisMain.this.requestFocus();

			}
		});
		JButton start = new JButton("開始/重新開始");
		start.setSize(150, 15);
		start.setLocation(440, 40);
		this.add(start);
		start.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				isStart = true;
				for (JLabel jLabel : jLabels) {
					jPanel.remove(jLabel);// 刪除jlabel空間
					jPanel.repaint();

				}
				jLabels = new LinkedList<>();
				coord1 = new LinkedList<>();
				TetrisMain.this.requestFocus();

			}
		});
		jPanel = new JPanel();// 遊戲地圖
		jPanel.setBorder(new MatteBorder(new Insets(0, 20, 20, 20), Color.gray));
		jPanel.setSize(440, 580);
		jPanel.setLocation(0, 0);
		jPanel.setLayout(null);

		this.add(jPanel);
		JLabel addSorce = new JLabel("  0");
		addSorce.setSize(80, 80);
		addSorce.setLocation(480, 200);
		addSorce.setBackground(Color.GRAY);
		addSorce.setOpaque(true);
		addSorce.setFont(new Font("宋體", 20, 30));

		this.add(addSorce);
		this.setVisible(true);
		this.requestFocus();
		this.addKeyListener(new KeyListener() {

			@Override
			public void keyTyped(KeyEvent e) {

			}

			@Override
			public void keyReleased(KeyEvent e) {
               boolean flag = true;
				isSuspend = false;
				if (e.getKeyCode() == KeyEvent.VK_W) {
					transformation();
				}
				if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                  for (int i = 0; i < coord.length; i++) {
						if(coord[i]%20==0){
							flag = false;
							break;
						}
						
					}
					for (int i = 0; i < coord.length; i++) {
						if(flag){
						coord[i] -= 1;
						}else{
							break;
						}
					}
				} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
					   for (int i = 0; i < coord.length; i++) {
							if(coord[i]%20==19){
								flag = false;
								break;
							}
							
						}
					for (int i = 0; i < coord.length; i++) {
						if(flag){
							coord[i] += 1;
							}else{
								break;
					       }
					}
				}
				isSuspend = true;

			}

			@Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub

			}
		});
		int score = 0;
		while (true) {
			System.out.print(0);
			while (isStart) {
         
				switch ((int)(Math.random()*5)) {
				case 0:
					jLabels.addAll(state1());
					temp = 0;
					break;
				case 1:
					jLabels.addAll(state2());
					temp = 1;
					break;
				case 2:
					jLabels.addAll(state3());
					temp = 2;
					break;
				case 3:
					jLabels.addAll(state4());
					temp = 3;
					break;
				case 4:
					jLabels.addAll(state5());
					temp = 4;
					break;
				default:
					break;
				}

				for (int i = 0; i < 4 && jLabels.size() > 0; i++) {
					jPanel.add(jLabels.get(jLabels.size() - 1 - i));

					coord[i] = (jLabels.get(jLabels.size() - 1 - i).getX() / 20
							+ jLabels.get(jLabels.size() - 1 - i).getY());

				}

				while (true && jLabels.size() > 0) {
					boolean is = false;
				System.out.print(0);
					while (isSuspend) {
						boolean flag = false;

						for (int i = 0; i < 4 && jLabels.size() > 0; i++) {
							jLabels.get(jLabels.size() - 1 - i).setLocation((coord[i]) % 20 * 20 + 20,
									(coord[i]) / 20 * 20);
							coord[i] += 20;

							if (coord1.contains(coord[i])) {

								flag = true;

							}

						}
						for (int j = 0; j < coord.length; j++) {

							if (coord[j] >= 560 || flag) {

								for (int i = 0; i < coord.length; i++) {
									coord1.add(coord[i] - 20);
								}
								is = true;
								break;
							}

						}

						if (is || jLabels.size() == 0) {
							break;
						}
						try {
							Thread.sleep(200);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					if (is) {
						break;
					}
				}

				try {
					Thread.sleep(200);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				int[] array = new int[28];
				Iterator<Integer> iterator = coord1.iterator();
				while (iterator.hasNext()) {
					Integer integer = iterator.next();

					for (int j = 540; j >= 0; j -= 20) {
						if (integer >= j) {
                          System.out.println(j/20+":"+array[j / 20]);
							array[j / 20] += 1;
							break;

						}

					}
				}

				for (int i = 0; i < array.length; i++) {
					if (array[i] == 20) {
						System.out.println(array[i]+"11");
						score += 1;
						
						addSorce.setText(" " + score);
						Iterator<JLabel> iterator2 = jLabels.iterator();
						while (iterator2.hasNext()) {
							JLabel jLabel = iterator2.next();

							if (jLabel.getY() == i * 20) {
								jPanel.remove(jLabel);// 刪除jlabel空間
								jPanel.repaint();// 刷新
								iterator2.remove();
							} else if(jLabel.getY()<i * 20){
								jLabel.setLocation(jLabel.getX(), jLabel.getY() + 20);
							}
						}
						Iterator<Integer> iterator3 = coord1.iterator();
						while (iterator3.hasNext()) {
							Integer integer = iterator3.next();
							if (integer >= i * 20 && integer < (i + 1) * 20) {

								iterator3.remove();
							}else if(integer < i * 20){
								integer+=20;
							}
						}

					}

				}
				for (int i = 0; i < coord1.size(); i++) {
					if (coord1.get(i) <= 20) {
						list.add(score);

						JOptionPane.showMessageDialog(null, "遊戲結束");
						isStart = false;
					}
				}
			}
		}
	}

	// 所有樣式的初始狀態
	private LinkedList<JLabel> state1() {
		LinkedList<JLabel> jLabels1 = new LinkedList<>();

		for (int i = 8; i < 12; i++) {
			jLabels1.add(addJLabel(i));
		}

		return jLabels1;
	}

	private LinkedList<JLabel> state2() {
		LinkedList<JLabel> jLabels1 = new LinkedList<>();
		for (int i = 8; i < 11; i++) {
			jLabels1.add(addJLabel(i));
		}
		jLabels1.add(addJLabel(29));
		return jLabels1;
	}

	private LinkedList<JLabel> state3() {
		LinkedList<JLabel> jLabels1 = new LinkedList<>();
		jLabels1.add(addJLabel(8));
		jLabels1.add(addJLabel(9));
		jLabels1.add(addJLabel(28));
		jLabels1.add(addJLabel(29));
		return jLabels1;
	}

	private LinkedList<JLabel> state4() {
		LinkedList<JLabel> jLabels1 = new LinkedList<>();
		jLabels1.add(addJLabel(8));
		jLabels1.add(addJLabel(28));
		jLabels1.add(addJLabel(29));
		jLabels1.add(addJLabel(49));
		return jLabels1;
	}

	private LinkedList<JLabel> state5() {
		LinkedList<JLabel> jLabels1 = new LinkedList<>();
		for (int i = 8; i < 11; i++) {
			jLabels1.add(addJLabel(i));
		}
		jLabels1.add(addJLabel(30));
		return jLabels1;
	}

	private JLabel addJLabel(int i) {
		JLabel jLabel = new JLabel();
		jLabel.setSize(18, 18);
		// jLabel.setBorder(new MatteBorder(new Insets(1,1,1,1),Color.white));
		jLabel.setLocation(i % 20 * 20, i / 20 * 20);
		jLabel.setBackground(Color.blue);
		jLabel.setOpaque(true);
		return jLabel;
	}

	public static void main(String[] args) {
		new TetrisMain().init();
	}
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章