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。