java GUI实现五子棋游戏

2020-02-26 10:00:59刘景俊

本文实例为大家分享了java实现五子棋游戏GUI,供大家参考,具体内容如下

引用包

//{Cynthia Zhang}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import java.awt.Image;
import com.sun.image.codec.jpeg.*;

前期预设

//extends JApplet {

 // Indicate which player has a turn, initially it is the X player
 private char whoseTurn = 'X';
 final int SIZE = 15;
 static boolean ISOVER = false;

 // Create and initialize cells
 private final Cell[][] cell = new Cell[SIZE][SIZE];

 // Create and initialize a status label
 private final JLabel jlblStatus = new JLabel("X's turn to play",JLabel.CENTER);

设置背景板

// Initialize UI
 @Override
 public void init() {
 // Panel p to hold cells
 JPanel p = new JPanel();
 p.setLayout(new GridLayout(SIZE, SIZE, 0, 0));
 for (int i = 0; i < SIZE; i++) {
  for (int j = 0; j < SIZE; j++) {
  Cell ce = new Cell();
  ce.setBackground(new Color(150,88,42)); // 背景色绝美!
  p.add(cell[i][j] = ce);
  }
 }
 // Set line borders on the cells panel and the status label
 p.setBackground(new Color(143,105,94)); // 背景色绝美!
 jlblStatus.setBorder(new LineBorder(new Color(255,255,255), 2)); // 白框框加宽!
 
 // Place the panel and the label to the applet
 this.getContentPane().add(p, BorderLayout.CENTER);
 this.getContentPane().add(jlblStatus, BorderLayout.SOUTH);
 }

主要框架段落

// This main method enables the applet to run as an application
public static void main(String[] args) {
 // Create a frame
 JFrame frame = new JFrame("Tic Tac Toe");

 // Create an instance of the applet
 Homework8 applet = new Homework8();

 // Add the applet instance to the frame
 frame.getContentPane().add(applet, BorderLayout.CENTER);

 // Invoke init() and start()
 applet.init();
 applet.start();

 // Display the frame
 frame.setSize(600, 600);
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 frame.setVisible(true);
 }

判断是否满了

// Determine if the cells are all occupied
 public boolean isFull() {
 for (int i = 0; i < SIZE; i++) {
  for (int j = 0; j < SIZE; j++) {
  if (cell[i][j].getToken() == ' ') {
   return false;
  }
  }
 }
 return true;
 }

判断是否赢了

和八皇后有点像,可以考虑那种数组优化四个方向,这里比较懒

// Determine if the player with the specified token wins
 public boolean isWon(char token) {
 int winNum = 5; // define the max num for a rule
 for (int indexX = 0; indexX < SIZE; indexX++) {
  for (int indexY = 0; indexY < SIZE; indexY++){
  // in row check cell[indexX][indexY...indexY+winNum-1] 
  if (indexY+winNum-1<SIZE){
   boolean flag=true;
   for (int y =indexY;y<indexY+winNum;y++)
   if (cell[indexX][y].getToken() != token){
    flag=false; break;
   }
   if (flag==true) return true;
  }
  
  // in row check cell[indexX...indexX+winNum-1][indexY] 
  if (indexX+winNum-1<SIZE){
   boolean flag=true;
   for (int x =indexX;x<indexX+winNum;x++)
   if (cell[x][indexY].getToken() != token){
    flag=false; break;
   }
   if (flag==true) return true;
  }
  
  // check cell[indexX...indexX+winNum-1][indexY...indexY+winNum-1)
  if (indexX+winNum-1<SIZE && indexY+winNum-1<SIZE){
   boolean flag=true;
   for (int x =indexX,y=indexY;x<indexX+winNum;x++,y++)
   if (cell[x][y].getToken() != token){
    flag=false; break;
   }
   if (flag==true) return true;
  }
  
  // check cell[indexX...indexX+winNum-1][indexY...indexY+winNum-1)
  if (indexX+winNum-1<SIZE && indexY-winNum+1>=0){
   boolean flag=true;
   for (int x =indexX,y=indexY;x<indexX+winNum;x++,y--)
   if (cell[x][y].getToken() != token){
    flag=false; break;
   }
   if (flag==true) return true;
  }
  }
 }
 return false;
 }