貪吃蛇


TanChiSheJframe.java

package tanchishe;
import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import util.MyAWTEventListener;
public class TanChiSheJframe extends JFrame implements Serializable {
 /**
  * 
  */
 private static final long serialVersionUID = 5977722980538750979L;
 static JTable table;
 static JLayeredPane desktop = null;
 static TanChiSheTableModule tbModule;
 static int ROW_COUNT = 22;
 static int COL_COUNT = 22;
 static TanChiSheRandomIndex RANDOM_INDEX;
 static boolean GAME_START = false;
 public static List<String> displayList = new ArrayList<String>();
 static Timer timer;
 static String randomPosition = null;
 public static long SCORE = 0L;
 public TanChiSheJframe() {
  super();
  desktop = this.getLayeredPane();
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  int screenWitdth = screenSize.width;
  int screenHeight = screenSize.height;
  int width = COL_COUNT * 25;
  int height = ROW_COUNT * 25 + 100;
  setSize(width, height);
  setLocation((screenWitdth - width) / 2, (screenHeight - height) / 2);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 public static void main(String[] args) {
  TanChiSheJframe myFrame = new TanChiSheJframe();
  myFrame.setVisible(true);
  // myFrame.newGame();
  buildFrame();
 }
 public static void begin() {
  newGame();
 }
 public static void timerStart(boolean flag) {
  if (flag) {
   if (timer != null) {
    timer.cancel();
   }
   timer = new Timer();
   TanChiSheTask task = new TanChiSheTask() {
    public void run() {
     if (displayList != null && !displayList.isEmpty()) {
      String[] position = displayList.get(0).split(":");
      int x = Integer.valueOf(position[0]);
      int y = Integer.valueOf(position[1]);
      String newPosition = moveNext(x, y);
      checkPass(newPosition);
      displayList.add(0, newPosition);// 頭部位置新增1
      // 新的位置上有食物,那麼頭部加2,尾部清除
      // 新的位置上沒有食物,那麼頭部加1,尾部清除
      if (compareData(newPosition, randomPosition)) {
       SCORE += displayList.size();
       setScore();
       String[] position2 = newPosition.split(":");
       int x2 = Integer.valueOf(position2[0]);
       int y2 = Integer.valueOf(position2[1]);
       String newPosition2 = moveNext(x2, y2);
       displayList.add(0, newPosition2);// 頭部位置新增2
       randomPosition = random();// 新增一個食物
      }
      displayList.remove(displayList.size() - 1);// 尾部位置清除
      desktop.repaint();
     }
    }
   };
   timer.schedule(task, new Date(), 250);
  } else {
   if (timer != null) {
    timer.cancel();
    timer = null;
   }
  }
 }
 public static boolean checkPass(String position) {
  String[] positionXY = position.split(":");
  int x = Integer.valueOf(positionXY[0]);
  int y = Integer.valueOf(positionXY[1]);
  boolean flag = false;
  // 超出邊界
  if (x < 0 || x >= COL_COUNT || y < 0 || y >= ROW_COUNT) {
   flag = true;
   JOptionPane.showMessageDialog(table, "遊戲結束", "GAME OVER!",
     JOptionPane.ERROR_MESSAGE);
  }
  // 咬到蛇身
  if (displayList.contains(position)) {
   flag = true;
   JOptionPane.showMessageDialog(table, "蛇咬到了自己!", "GAME OVER!",
     JOptionPane.ERROR_MESSAGE);
  }
  if (flag) {
   desktop.repaint();
   if (timer != null) {
    timer.cancel();
   }
   return false;
  }
  // return;
  return flag;
 }
 public static boolean[][] displayFlagArr;
 public void move2(int index) {
  // 0
  for (int i = 0; i < ROW_COUNT; i++) {
   boolean temp = false;
   for (int j = 0; j < COL_COUNT; j++) {
    int nextIndex = (j + 1) == COL_COUNT ? 0 : (j + 1);
    if (j == 0) {
     temp = displayFlagArr[i][j];
    }
    if (j == COL_COUNT - 1) {
     displayFlagArr[i][j] = temp;
    } else {
     displayFlagArr[i][j] = displayFlagArr[i][nextIndex];
    }
   }
  }
  // leftMethod();
 }
 public static String moveNext(int row, int col) {
  int forwardX = 0;
  int forwardY = 0;
  switch (FORWARD) {
  case 0:// up
   forwardY = -1;
   break;
  case 1:// down
   forwardY = 1;
   break;
  case 2:// left
   forwardX = -1;
   break;
  case 3: // right 默認向右
   forwardX = 1;
  default:
   break;
  }
  int rowNew = row + forwardY;
  int colNew = col + forwardX;
  return rowNew + ":" + colNew;
 }
 public static void newGame() {
  SCORE = 0L;
  displayList.clear();
  GAME_START = true;
  String position = (ROW_COUNT / 2 - 1) + ":" + (COL_COUNT / 2 - 1);// 起始位置
  displayList.add(position);
  randomPosition = random();
  timerStart(true);
  desktop.repaint();
 }
 public static void buildFrame() {
  desktop.setLayout(new BoxLayout(desktop, BoxLayout.Y_AXIS));
  JPanel btnDesc = new JPanel();
  btnDesc.add(loadDescription());
  desktop.add(btnDesc, 500);
  desktop.add(Box.createHorizontalStrut(50));
  JPanel tbPanel = new JPanel();
  tbPanel.add(loadTable());
  tbPanel.setBounds(0, 0, 500, 600);
  desktop.add(tbPanel, 100);
  desktop.add(Box.createHorizontalStrut(50));
  /*JPanel btnPanel = new JPanel();
  btnPanel.add(loadButton());
  desktop.add(btnPanel, 200);*/
  Toolkit.getDefaultToolkit().addAWTEventListener(
    new MyAWTEventListener() {
     public void keyPressed(KeyEvent e) {
      keyEvent(e);
     }
    }, AWTEvent.KEY_EVENT_MASK);
  table.addMouseListener(new TanChiSheMouseListener());
 }
 public static void keyEvent(KeyEvent e) {
  // System.out.println(e.getKeyCode());
  switch (e.getKeyCode()) {
  case 9:// 9 tab
   cheat();
   break;
  case 112:// 112 F1
   begin();
   break;
  case 113:// 113 F2
   pause();
   break;
  case 114:// 114 F3
   cheat();
   break;
  case 115:// 115 F4
   reQueue();
   break;
  case 37:// 37 left
   if (FORWARD != 3 && FORWARD != 2) {// 不允許直接轉身
    FORWARD = 2;
   }
   break;
  case 38:// 38 up
   if (FORWARD != 0 && FORWARD != 1) {// 不允許直接轉身
    FORWARD = 0;
   }
   break;
  case 39:// 39 right
   if (FORWARD != 3 && FORWARD != 2) {// 不允許直接轉身
    FORWARD = 3;
   }
   break;
  case 40:// 40 down
   if (FORWARD != 0 && FORWARD != 1) {// 不允許直接轉身
    FORWARD = 1;
   }
   break;
  default:
   break;
  }
 }
 Color color = new Color(232, 232, 232);
 static TanChiSheTableCellRenderer tcr = new TanChiSheTableCellRenderer();// 設置table內容居中
 static JLabel jtf = new JLabel();
 public static JPanel loadTable() {
  JPanel fr4 = new JPanel();
  fr4.setBorder(new TitledBorder("貪吃蛇"));
  fr4.setLayout(new BoxLayout(fr4, BoxLayout.Y_AXIS));
  tbModule = new TanChiSheTableModule(ROW_COUNT, COL_COUNT);
  table = new JTable(tbModule);
//  table.setDefaultRenderer(Object.class, tcr);
  CellRendererAndMouseListener rendererAndListener = new CellRendererAndMouseListener();
  table.addMouseMotionListener(rendererAndListener);
  table.setDefaultRenderer(Object.class, rendererAndListener);
  table.setRowSelectionAllowed(false);
  table.setColumnSelectionAllowed(false);
  table.setCellSelectionEnabled(false);// 不允許選擇Cell
  tcr.setHorizontalAlignment(SwingConstants.CENTER);
  tcr.setVerticalAlignment(SwingConstants.CENTER);
  for (int i = 0; i < table.getColumnCount(); i++) {
   table.getColumnModel().getColumn(i).setPreferredWidth(22);
  }
  table.setRowHeight(22);
  Border bor = new BevelBorder(BevelBorder.LOWERED);
  table.setBorder(bor);
  table.setShowHorizontalLines(false);
  table.setShowVerticalLines(false);
  Dimension abc = table.getIntercellSpacing();
  abc.setSize(1, 1);
  table.setIntercellSpacing(abc);
  JPanel fr5 = new JPanel();
  JLabel jlb = new JLabel();
  jlb.setHorizontalAlignment(SwingConstants.CENTER);
  jlb.setVerticalAlignment(SwingConstants.CENTER);
  jlb.setText("分數:");
  fr5.add(jlb);
  jtf.setPreferredSize(new Dimension(140, 20));
  setScore();
  jtf.setFont(new Font("Goudy Stout", Font.BOLD, 18));
  jtf.setForeground(Color.RED);
  jtf.setOpaque(true);
  jtf.setBackground(Color.BLACK);
  jtf.setHorizontalAlignment(SwingConstants.CENTER);
  fr5.add(jtf);
  fr4.add(fr5);
  fr4.add(table);
  return fr4;
 }
 public static void setScore() {
  String SCORE_S = String.valueOf(SCORE);
  for (int i = 8; i > String.valueOf(SCORE).length(); i--) {
   SCORE_S = "0" + SCORE_S;
  }
  jtf.setText(SCORE_S);
 }
 public static int FORWARD = 3;// 0 up; 1 down; 2 left; 3 right
 public static JPanel loadDescription() {
  JPanel fr = new JPanel();
  JLabel j1, j2, j3, j4;
  fr.setSize(60, 100);
  j1 = new JLabel("F1 - New Game");
  j1.setForeground(Color.BLUE);
  j1.setOpaque(true);
  j2 = new JLabel("F2 - Pause");
  j2.setForeground(Color.BLUE);
  j2.setOpaque(true);
  j3 = new JLabel("F3 - Cheat");
  j3.setForeground(Color.BLUE);
  j3.setOpaque(true);
  j4 = new JLabel("F4 - Re-Queue");
  j4.setForeground(Color.BLUE);
  j4.setOpaque(true);
  fr.add(j1);
  fr.add(j2);
  fr.add(j3);
  fr.add(j4);
  fr.setCursor(new Cursor(12));
  return fr;
 }
 public static JPanel loadButton() {
  JPanel fr2 = new JPanel();
  fr2.setSize(60, 100);
  fr2.setLayout(new FlowLayout(FlowLayout.CENTER, 4, 3));// 設置內容面板爲流式佈局
  fr2.setBorder(new EmptyBorder(5, 5, 5, 5));// 設置面板的邊框
  JButton jbtnBegin = new JButton("New Game");
  jbtnBegin.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    begin();
   }
  });
  jbtnBegin.setCursor(new Cursor(12));
  fr2.add(jbtnBegin);
  JButton jbtnPause = new JButton("Pause");
  jbtnPause.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    pause();
   }
  });
  jbtnPause.setCursor(new Cursor(12));
  fr2.add(jbtnPause);
  JButton jbtnCheat = new JButton("Cheat");
  jbtnCheat.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    cheat();
   }
  });
  jbtnCheat.setCursor(new Cursor(12));
  fr2.add(jbtnCheat);
  return fr2;
 }
 static boolean STATUS = true;
 public static void pause() {
  if (STATUS) {
   STATUS = false;
  } else {
   STATUS = true;
  }
  timerStart(STATUS);
 }
 public static void reQueue() {
  timerStart(false);
  GAME_START = true;
  List<String> displayListCopy = new ArrayList<String>();
  for (int i = displayList.size() - 1; i >= 0; i--) {
   int row = i / COL_COUNT;
   int col = i % COL_COUNT;
   displayListCopy.add(row + ":" + col);
  }
  displayList.clear();
  displayList.addAll(displayListCopy);
  FORWARD = 1;// down
  randomPosition = random();
  timerStart(true);
  desktop.repaint();
 }
 public static void cheat() {
  GAME_START = true;
  List<String> displayListCopy = new ArrayList<String>();
  for (int i = displayList.size() - 1; i >= 0; i--) {
   displayListCopy.add(displayList.get(i));
  }
  displayList.clear();
  displayList.addAll(displayListCopy);
  switch (FORWARD) {// 0 up; 1 down; 2 left; 3 right
  case 0:
   FORWARD = 1;
   break;
  case 1:
   FORWARD = 0;
   break;
  case 2:
   FORWARD = 3;
   break;
  case 3:
   FORWARD = 2;
   break;
  }
  randomPosition = random();
  timerStart(true);
  desktop.repaint();
 }
 /**
  * @param start
  *            when true get center position
  * @return
  */
 public static String random() {
  if (RANDOM_INDEX == null) {
   RANDOM_INDEX = new TanChiSheRandomIndex();
  }
  int index = 0;
  RANDOM_INDEX.clearRange();// 清空可選隨機數範圍
  for (int row = 0; row < ROW_COUNT; row++) {
   for (int col = 0; col < COL_COUNT; col++) {
    if (!displayList.contains(row + ":" + col)) {
     RANDOM_INDEX.addIndexL(row * COL_COUNT + col);// 添加可用隨機數
    }
   }
  }
  index = RANDOM_INDEX.randomIndex();
  int row = index / COL_COUNT;
  int col = index % COL_COUNT;
  return (row + ":" + col);
 }
 public boolean checkEmpty(Object cellV) {
  if (cellV == null || String.valueOf(cellV).length() == 0) {
   return true;
  }
  return false;
 }
 public static boolean compareData(Object val1, Object val2) {
  if ((val1 == null && val2 == null)
    || (String.valueOf(val1).equals(String.valueOf(val2)))) {
   return true;
  }
  return false;
 }
 public boolean compareArr(Object[][] dataArr1, Object[][] dataArr2) {
  for (int rowIndex = 1; rowIndex < ROW_COUNT; rowIndex++) {
   for (int colIndex = 0; colIndex < COL_COUNT; colIndex++) {
    if (!compareData(dataArr1[rowIndex][colIndex],
      dataArr2[rowIndex][colIndex])) {
     return false;
    }
   }
  }
  return true;
 }
}

TanChiSheKeyListener.java

package tanchishe;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class TanChiSheKeyListener implements KeyListener {
 public void keyPressed(KeyEvent e) {
  // 37 left
  // 38 up
  // 39 right
  // 40 down
 }
 public void keyReleased(KeyEvent e) {
 }
 public void keyTyped(KeyEvent e) {
 }
}

TanChiSheMouseListener.java

package tanchishe;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class TanChiSheMouseListener implements MouseListener,MouseMotionListener {
 public void mouseClicked(MouseEvent e) {
  // 1 left click
  // 2 scroll click
  // 3 right click
  //System.out.println(e.getButton());
  return;
 }
 public void mouseEntered(MouseEvent e) {
  return;
 }
 public void mouseExited(MouseEvent e) {
  return;
 }
 public void mousePressed(MouseEvent e) {
  return;
 }
 public void mouseReleased(MouseEvent e) {
  return;
 }
 public void mouseDragged(MouseEvent e) {
  return;
 }
 public void mouseMoved(MouseEvent e) {
  return;
 }
}

TanChiSheRandomIndex.java

package tanchishe;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class TanChiSheRandomIndex {
 List<Integer> indexL = null;
 Random random = new Random();
 public void addIndexL(Integer i) {
  if (indexL == null) {
   indexL = new ArrayList<Integer>();
  }
  indexL.add(i);
 }
// public int getCenterNumber() {
//
//  int number = indexL.size() / 2 - 1;
//  indexL.remove(number);
//  return number;
// }
 public void clearRange() {
  if (indexL != null) {
   indexL.clear();
  }
 }
 public int randomIndex() {
  if (indexL.isEmpty()) {
   System.out.println("No more data!");
   return -1;
  }
  int index = random.nextInt(indexL.size());
  int number = indexL.get(index);
  indexL.remove(index);
  return number;
 }
}

TanChiSheTable.java

package tanchishe;
import javax.swing.JTable;
import javax.swing.table.TableModel;
public class TanChiSheTable extends JTable {
 /**
  * serialVersionUID
  */
 private static final long serialVersionUID = -5218217955961436299L;
 public TanChiSheTable() {
  super();
 }
 public TanChiSheTable(TableModel tm) {
  super(tm);
 }
 public boolean isCellSelected(int i, int j) {
  return false;
 }
}

TanChiSheTableCellRenderer.java

package tanchishe;
import java.awt.Color;
import java.awt.Component;
import java.io.Serializable;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class TanChiSheTableCellRenderer extends DefaultTableCellRenderer
  implements Serializable {
 /**
  * serialVersionUID
  */
 private static final long serialVersionUID = 7075922603764573186L;
 public TanChiSheTableCellRenderer() {
  setOpaque(true);
 }
 static Color color_gray = new Color(232, 232, 232);
 static Color color_food = new Color(112, 0, 112);
 public Component getTableCellRendererComponent(JTable table, Object value,
   boolean isSelected, boolean hasFocus, int row, int column) {
  Component editor = super.getTableCellRendererComponent(table, value,
    isSelected, hasFocus, row, column);
  editor.setBackground(color_gray);
  if (TanChiSheJframe.displayList.contains(row + ":" + column)) {
   editor.setBackground(Color.BLACK);
  } else if ((row + ":" + column).equals(TanChiSheJframe.randomPosition)) {
   editor.setBackground(color_food);
  } else {
   editor.setBackground(color_gray);
  }
  return editor;
 }
}

TanChiSheTableModule.java

package tanchishe;
import java.io.Serializable;
import javax.swing.table.AbstractTableModel;
public class TanChiSheTableModule extends AbstractTableModel implements
  Serializable {
 /**
  * 
  */
 private static final long serialVersionUID = 1978547795796513859L;
 private int rowCount = 1;
 private int columnCount = 1;
 private static Object[][] dataArr = null;
 public TanChiSheTableModule(int rowCount, int columnCount) {
  if (columnCount > 1) {
   this.columnCount = columnCount;
  } else {
   this.columnCount = 1;
  }
  if (rowCount > 1) {
   this.rowCount = rowCount;
  } else {
   this.rowCount = 1;
  }
  initTableDataAndHearder();
 }
 public Class<?> getColumnClass(int columnIndex) {
  if (getValueAt(0, columnIndex) != null) {
   return getValueAt(0, columnIndex).getClass();
  } else {
   return String.class;
  }
 }
 public String getColumnName(int columnIndex) {
  return " 第" + columnIndex + "列";
 }
 public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
  if (rowIndex >= rowCount) {
   new Exception("Row Index Outbound!").printStackTrace();
  }
  if (columnIndex >= columnCount) {
   new Exception("Column Index Outbound!").printStackTrace();
  }
  if (dataArr == null) {
   initTableDataAndHearder();
  }
  dataArr[rowIndex][columnIndex] = aValue;
  fireTableCellUpdated(rowIndex, columnIndex);
 }
 public void initTableDataAndHearder() {
  dataArr = new Object[rowCount][columnCount];
 }
 public Object getValueAt(int rowIndex, int columnIndex) {
  if (dataArr == null) {
   initTableDataAndHearder();
  }
  Object val = dataArr[rowIndex][columnIndex];
  return val;
 }
 public boolean isCellEditable(int rowIndex, int columnIndex) {
  return false;
 }
 public int getRowCount() {
  return rowCount;
 }
 public int getColumnCount() {
  return columnCount;
 }
 public Object[][] getDataArr() {
  return dataArr;
 }
 public void setDataArr(Object[][] dataArr) {
  TanChiSheTableModule.dataArr = dataArr;
 }
}

CellRendererAndMouseListener.java

package tanchishe;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
public class CellRendererAndMouseListener extends JLabel implements
  TableCellRenderer, MouseMotionListener {
 /**
  * 
  */
 private static final long serialVersionUID = 7083489923614792312L;
 public CellRendererAndMouseListener() {
  setOpaque(true);
 }
 static Color color_gray = new Color(232, 232, 232);
 static Color color_food = new Color(112, 0, 112);
 public Component getTableCellRendererComponent(JTable table, Object value,
   boolean isSelected, boolean hasFocus, int row, int column) {
  this.setBackground(color_gray);
  if (TanChiSheJframe.displayList.contains(row + ":" + column)) {
   this.setBackground(Color.BLACK);
  } else if ((row + ":" + column).equals(TanChiSheJframe.randomPosition)) {
   this.setBackground(color_food);
  } else {
   this.setBackground(color_gray);
  }
  return this;
 }
 public void mouseMoved(MouseEvent e) {
  JTable table = (JTable) e.getSource();
  table.repaint();
 }
 public void mouseDragged(MouseEvent e) {
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
 }
}

TanChiSheTask.java

package tanchishe;
import java.util.TimerTask;
public class TanChiSheTask extends TimerTask {
 @Override
 public void run() {
  System.out.println("Timer Start!!");
 }
}

DataModule.java

package tanchishe;
public class DataModule {
 int row = -1;
 int col = -1;
 public DataModule(int row, int col) {
  this.row = row;
  this.col = col;
 }
 public int getCol() {
  return col;
 }
 public void setCol(int col) {
  this.col = col;
 }
 public int getRow() {
  return row;
 }
 public void setRow(int row) {
  this.row = row;
 }
}


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