java實現單機版五子棋小遊戲

簡單的java小遊戲–單機版五子棋

學瞭java有一段時間瞭,今天就來搞一個簡單的單機版五子棋遊戲。

實現功能:那必須能進行基礎的輸贏判斷。還有重新開始的功能,悔棋的功能,先手設置的功能和退出的功能。在右上角能夠顯示目前輪到哪個棋種下棋。右下角還有一個記錄信息框,記錄行為,當信息量過多時,可以清除信息內容。

成果:

初始界面:

遊戲(獲勝)界面:

附上代碼:

Chessframe.java

package firstgobang;

import javax.swing.JFrame;
import javax.swing.WindowConstants;


public class ChessFrame extends JFrame{
 public ChessBoard chessboard;
 
 public ChessFrame(String title){
 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setTitle(title);
    setVisible(true);
    setLocationRelativeTo(null);
 chessboard = new ChessBoard();
 add(chessboard);
 pack();
 }
 
 public static void main(String[] args) {
 ChessFrame chessframe = new ChessFrame("單機版五子棋遊戲");
 }
}

ChessBoard.java

package firstgobang;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import java.util.Stack;
import javax.swing.*;

public class ChessBoard extends JComponent{
 /*
 *board為1時是白棋,為2時是黑棋,為0時是空
 *whitenow為true時,到白棋下,為false時,到黑棋下
 *empty為true時,該位置為空,為false,該位置不為空
 *win為true,某方勝利,為false,無勝利
 *information用來儲存消息
 */
 public static int x_start = 30;
 public static int y_start = 60;
 public static int size = 30;
 public static int radius = 10;
 private int[][] board = new int[19][19];
 private boolean whitenow = false;
 private boolean empty = true;
 private boolean win = false; 
 private JTextArea area;
 private String information="";
 private static Stack<Chess> chessstack; //棧
  class Chess{ //棋類,用於儲存棋子的x,y坐標
    int x;
    int y;
    public Chess(int x,int y) {
      this.x=x;
      this.y=y;
    }
  }
 public ChessBoard() {
 chessstack = new Stack<>();
 area = new JTextArea(5,5);
    JButton button1 = new JButton("重新開始");
    JButton button2 = new JButton("悔棋");
    JButton button3 = new JButton("退出");
    JButton button4 = new JButton("先手設置");
    JButton button5 = new JButton("清空消息");
    JPanel panel = new JPanel();
    JScrollPane js = new JScrollPane();
    button1.setBounds(620,60,100,30);
    button2.setBounds(620,110,100,30);
    button3.setBounds(620,160,100,30);
    button4.setBounds(620,210,100,30);
    button5.setBounds(620,260,100,30);
    panel.setBounds(600,310,140,300);
    js.setBounds(600,310,140,300);
    panel.setLayout(new BorderLayout());
    add(button1);
    add(button2);
    add(button3);
    add(button4);
    add(button5);
    panel.add(area);
    js.getViewport().add(panel);
    js.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    add(js);
    button1.addMouseListener(new b1Action());
    button2.addMouseListener(new b2Action());
    button3.addMouseListener(new b3Action());
    button4.addMouseListener(new b4Action());
    button5.addMouseListener(new b5Action());
 addMouseListener(new theMouseListener());
 }
 public void paint(Graphics g) {
 super.paint(g);
 g.setColor(Color.orange);
 g.fillRect(x_start-size/2,y_start-size/2, size*19, size*19);
 g.setColor(Color.black);
 // 橫
 for (int i = 0; i < 19; i++) {
  g.drawLine(x_start, y_start + i * size, x_start+18*size, y_start + i * size);
  g.drawString(((Integer)i).toString(),x_start/2-radius,y_start + i * size);
 }
 // 豎
 for (int i = 0; i < 19; i++) {
  g.drawLine(x_start + i * size, y_start, x_start + i * size, y_start+18*size);
  g.drawString(((Integer)i).toString(),x_start + i * size,y_start/2+radius);
 }
 for (int i = 0; i < 19; i++) {
  for (int j = 0; j < 19; j++) {
  if (board[i][j] == 1) {
   g.setColor(Color.white);
   g.fillOval(x_start-radius + i * size, y_start-radius + j * size, radius*2,radius*2);
   g.setColor(Color.black);
   g.drawOval(x_start-radius + i * size, y_start-radius + j * size, radius*2,radius*2);
  }
  if (board[i][j] == 2) {
   g.setColor(Color.black);
   g.fillOval(x_start-radius + i * size, y_start-radius + j * size, radius*2,radius*2);
  }
  }
 }
 g.setFont(new Font("微軟雅黑",Font.BOLD,15));
 g.drawString("現在輪到", 600, 35);
 if(whitenow==true) {
  g.setColor(Color.white);
  g.fillOval(680, 20, 20,20);
  g.setColor(Color.black);
  g.drawOval(680, 20, 20,20);
 }
 if(whitenow==false) {
  g.setColor(Color.black);
  g.fillOval(680, 20, 20,20);
 }
 }
 
  public Dimension getPreferredSize() {
    return new Dimension(750,650);
  }
  
  public class theMouseListener implements MouseListener{ //下棋
 public void mouseClicked(MouseEvent e) {
 }
 public void mousePressed(MouseEvent e) {  
  int x=getx(e.getX());
  int y=gety(e.getY());
  try {
  if(board[x][y] !=0)empty = false;
  } catch (Exception e1) {
  }
  if (e.getX() > x_start-size/2 && e.getX() < x_start+size/2+18*size && e.getY() > y_start-size/2 && e.getY() < y_start+size/2+18*size) {
  if(empty == true) {
   Chess chess = new Chess(x,y);
       chessstack.push(chess);
   if (whitenow == true) {
   writeinformation("白棋下瞭"+"("+x+","+y+")"+"的位置");
   board[x][y]=1;
   repaint();
   }
   if (whitenow == false){
   writeinformation("黑棋下瞭"+"("+x+","+y+")"+"的位置");
   board[x][y]=2;
   repaint();
   }
   iswin(whitenow,x,y);
   if(win==true) {
   if(whitenow==true) {
    writeinformation("白棋獲勝!");
    JOptionPane.showInternalMessageDialog(null, "白棋獲勝",
          "提示框", JOptionPane.INFORMATION_MESSAGE); 
   }
   else {
    writeinformation("黑棋獲勝!");
    JOptionPane.showInternalMessageDialog(null, "黑棋獲勝",
          "提示框", JOptionPane.INFORMATION_MESSAGE); 
   }
   }
   if(chessstack.size()==361) {
   writeinformation("和局");
   JOptionPane.showInternalMessageDialog(null, "和局",
         "提示框", JOptionPane.INFORMATION_MESSAGE);
   }
   whitenow=!whitenow;
  }
  else {
   JOptionPane.showInternalMessageDialog(null, "該位置已有棋子!",
         "提示框", JOptionPane.INFORMATION_MESSAGE); 
   empty=true;
  }
  } 
 }
 public void mouseReleased(MouseEvent e) { 
 }
 public void mouseEntered(MouseEvent e) { 
 }
 public void mouseExited(MouseEvent e) {
 } 
  }
  
 class b1Action implements MouseListener{  //重新開始按鈕
 public void mouseClicked(MouseEvent e) {
   int a = JOptionPane.showConfirmDialog(null,
        "你確定重新開始?", "提示框", JOptionPane.YES_NO_OPTION); 
   if(a==0) cleanstart();
 }
 public void mousePressed(MouseEvent e) {
 }
 public void mouseReleased(MouseEvent e) {
 }
 public void mouseEntered(MouseEvent e) {
 }
 public void mouseExited(MouseEvent e) {
 }
 }

 class b2Action implements MouseListener{  //悔棋按鈕
 public void mouseClicked(MouseEvent e) {
   int a = JOptionPane.showConfirmDialog(null,
        "你確定悔棋?", "提示框", JOptionPane.YES_NO_OPTION); 
   if(a==0) {
   if(chessstack.size()>0) {
    Chess chess1 = chessstack.pop();
    if(whitenow)writeinformation("黑棋悔棋,坐標"+"("+chess1.x+","+chess1.y+")");
    if(!whitenow)writeinformation("白棋悔棋,坐標"+"("+chess1.x+","+chess1.y+")");
    board[chess1.x][chess1.y]=0;
    whitenow=!whitenow;
    repaint();
   }
   else {
   JOptionPane.showInternalMessageDialog(null, "不能在悔棋瞭!",
         "提示框", JOptionPane.INFORMATION_MESSAGE); 
   }
   }
 }
 public void mousePressed(MouseEvent e) {
 }
 public void mouseReleased(MouseEvent e) {
 }
 public void mouseEntered(MouseEvent e) {
 }
 public void mouseExited(MouseEvent e) {
 }
 }
 
 class b3Action implements MouseListener{  //退出按鈕
 public void mouseClicked(MouseEvent e) {
   int a = JOptionPane.showConfirmDialog(null,
        "你確定退出遊戲?", "提示框", JOptionPane.YES_NO_OPTION); 
   if(a==0) {
   System.exit(0);
   }
 }
 public void mousePressed(MouseEvent e) {
 }
 public void mouseReleased(MouseEvent e) {
 }
 public void mouseEntered(MouseEvent e) {
 }
 public void mouseExited(MouseEvent e) {
 }
 }
 
 class b4Action implements MouseListener{  //先手設置按鈕
 public void mouseClicked(MouseEvent e) {
  if(chessstack.size()==0) {
  Object[] possibleValues = { "白棋", "黑棋", "隨機" };
  Object a = JOptionPane.showInputDialog(null,
   "選擇先手的棋子", "提示框",
   JOptionPane.INFORMATION_MESSAGE, null,
   possibleValues, possibleValues[0]); 
  if(a=="白棋") whitenow=true;
  if(a=="黑棋") whitenow=false;
  if(a=="隨機") {
   Random random = new Random();
   int b =random.nextInt(2);
   if(b==0)whitenow=true;
   if(b==1)whitenow=false;
  }
  repaint();
  }
  else {
  JOptionPane.showInternalMessageDialog(null, "戰局已經開始,不能設置",
        "提示框", JOptionPane.INFORMATION_MESSAGE); 
  }
 }
 public void mousePressed(MouseEvent e) {
 }
 public void mouseReleased(MouseEvent e) {
 }
 public void mouseEntered(MouseEvent e) {
 }
 public void mouseExited(MouseEvent e) {
 }
 }
 
 class b5Action implements MouseListener{  //清空消息按鈕
 public void mouseClicked(MouseEvent e) {
   int a = JOptionPane.showConfirmDialog(null,
        "你確定清空所有消息?", "提示框", JOptionPane.YES_NO_OPTION); 
   if(a==0) {
   information="";
   area.setText(information);
   }
 }
 public void mousePressed(MouseEvent e) {
 }
 public void mouseReleased(MouseEvent e) {
 }
 public void mouseEntered(MouseEvent e) {
 }
 public void mouseExited(MouseEvent e) {
 }
 }
 
 public void writeinformation(String infor){  //消息寫入
 information +=infor+"\n";
 area.setText(information);
 }

  
 public boolean iswin(boolean whitenow,int startx,int starty) {  //勝利判斷
 int color = whitenow?1:2;
 int count = 1;
 int x=1;
 int y=1;
 //橫
 while((startx-x)>-1 && board[startx-x][starty]==color) {
  count++;
  x++;
 }
 x=y=1;
 while((startx+x)<19 && board[startx+x][starty]==color) {
  count++;
  x++;
 }
 if(count>=5) {
  return win = true;
 }
 count=x=y=1;
 //豎
 while((starty-y)>-1 && board[startx][starty-y]==color) {
  count++;
  y++;
 }
 x=y=1;
 while((starty+y)<19 && board[startx][starty+y]==color) {
  count++;
  y++;
 }
 if(count>=5) {
  return win = true;
 }
 count=x=y=1;
 //45右斜
 while((startx+x)<19 && (starty-y)>-1 && board[startx+x][starty-y]==color) {
  count++;
  x++;
  y++;
 }
 x=y=1;
 while((startx-x)>-1 && (starty+y)<19 && board[startx-x][starty+y]==color) {
  count++;
  x++;
  y++;
 }
 if(count>=5) {
  return win = true;
 }
 count=x=y=1;
 //135左斜
 while((startx-x)>0 && (starty-y)>0 && board[startx-x][starty-y]==color) {
  count++;
  x++;
  y++;
 }
 x=y=1;
 while((startx+x)<19 && (starty+y)<19 && board[startx+x][starty+y]==color) {
  count++;
  x++;
  y++;
 }
 if(count>=5) {
  return win = true;
 }
 return false;
 }
 private void cleanstart() { //清理棋盤
 for(int i=0;i<19;i++) {
  for(int j=0;j<19;j++) {
  board[i][j]=0;
  }
 }
 win=false;
 chessstack.clear();
 writeinformation("重新開始戰局!");
 repaint();
 }
 
 private int getx(int x) { //x歸位
 x -=x_start;
 if(x%size<(size/2)) {
  return x/size;
 }
 else {
  return x/size+1;
 }
 }
 private int gety(int y) { //y歸位
 y -=y_start;
 if(y%size<(size/2)) {
  return y/size;
 }
 else {
  return y/size+1;
 }
 }
}

End!

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: