基本實現俄羅斯方塊遊戲,有可能有一點小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();
}
}