Java编写的五子棋小游戏

看书的时候看到一个不完整的Java编写的一个五子棋小游戏,为了恢复一下编程能力刚刚把这个小程序完成了。

实现的功能很简单,两人对下五子棋,程序自动回判断输赢。在ubuntu下搞得,没有装什么高端的输入法的程序,所以用“*”和“X”来代表两个不同的棋子。

这个程序虽然简单但是还是有很多值得学习的地方。


首先,整个棋盘用二维数组表示。在Java中声明一个二维数组使用 type[][] arrName;的语句。

其次,我们需要给数组赋值,开始的时候是画棋盘使用的是“+”,给二维数组开辟空间和一维数组差不多。e.g.: arrName= new type[len1][len2];

判断游戏时候结束我们需要判断四个方向的棋子是不是连成了5个棋子。是的话游戏继续,否则退出。

整个代码的主要架构如下图所示:


其中initBoard负责初始化,printBoard负责打印更新整个面板,main做点常规操作赋值之类的,WinOrLose则负责判断游戏时候结束。

比较有价值的代码是输入这部分,可以根据特定符号分割输入的数据,值得收藏的代码:


 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String inputStr = null;
  inputStr=br.readLine();
  String[] str = inputStr.split(",");


以下为完整的代码。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Gobang {
    private String[][] board;
    
    private static int BOARD_SIZE = 15;
    
    private void initBoard(){
        board = new String[BOARD_SIZE][BOARD_SIZE];
        for (int i = 0; i<BOARD_SIZE; i++)
        {
            for (int j = 0; j<BOARD_SIZE; j++)
            {
                board[i][j]="十";
            }
        }
    }
   public void printBoard(){
       for (int i = 0 ; i < BOARD_SIZE;i++)
       {
           for(int j = 0; j< BOARD_SIZE; j++)
           {
                  System.out.print(board[i][j]);
           }
             System.out.print("\n");
       }
   }
   
   public int winOrLose(int x, int y, String star){
       int end = 0; 
       int xPos=x,yPos=y;
       int s1=0,s2=0,sum=0,time = 4;
       star = board[x][y];
       
       while(time !=0)
       {   
           //左斜
           for(int i = x-1,j=y-1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i--,j--)
           {
                  s1++;
           }
           for (int i=x+1,j=y+1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i++, j++)
           {
               s2++;
           }  
           sum = s1 + s2;
           if(sum==5)
           {
               end = 1;
               break;
           }
           else
           {
               s1=0; s2 = 0; sum = 0;
           }
           //右斜
           for(int i = x-1,j=y-1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i++,j--)
           {
                  s1++;
           }
           for (int i=x+1,j=y+1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i--, j++)
           {
               s2++;
           }  
           sum = s1 + s2;
           if(sum==5)
           {
               end = 1;
               break;
           }
           else
           {
               s1=0; s2 = 0; sum = 0;
           }
           //north and south
           for(int i = x-1,j=y-1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); j--)
           {
                  s1++;
           }
           for (int i=x+1,j=y+1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); j++)
           {
               s2++;
           }  
           sum = s1 + s2;
           if(sum==5)
           {
               end = 1;
               break;
           }
           else
           {
               s1=0; s2 = 0; sum = 0;
           }
           //we
           for(int i = x-1,j=y-1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i++)
           {
                  s1++;
           }
           for (int i=x+1,j=y+1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i--)
           {
               s2++;
           }  
           sum = s1 + s2;
           if(sum==5)
           {
               end = 1;
               break;
           }
           else
           {
               s1=0; s2 = 0; sum = 0;
           }
       }
       
       
       return end;
   }

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
           Gobang gb = new Gobang();
           gb.initBoard();
           gb.printBoard();
           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           String inputStr = null;
           int flag=0;
           int end=0;
           while ((inputStr = br.readLine()) != null )
           {
               String[] posStrArr = inputStr.split(",");
               
               int xPos = Integer.parseInt(posStrArr[0]);
               int yPos = Integer.parseInt(posStrArr[1]);
               if(flag==0)
               {
                   gb.board[xPos-1][yPos-1] = "*";
               }
               else
               {
                   gb.board[xPos-1][yPos-1] = "X"; 
               }
               flag++;
               gb.printBoard();
               end=gb.winOrLose(xPos-1, yPos-1, gb.board[xPos-1][yPos-1]);
               if(end ==1)
               {
                   break;
               }
           }
    }

}

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为你提供一个简单Java五子棋小游戏的代码示例,以供参考: ```java import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; public class GobangGame extends JFrame { private static final long serialVersionUID = 1L; private final int MARGIN = 30; // 棋盘边距 private final int GRID_SPAN = 35; // 网格间距 private final int ROWS = 15; // 棋盘行数 private final int COLS = 15; // 棋盘列数 private final int MAX_STEPS = ROWS * COLS; // 最大步数 private int[][] chessBoard = new int[ROWS][COLS]; // 棋盘数组 private boolean isBlack = true; // 黑棋先手 private boolean gameOver = false; // 游戏结束标志 private int xIndex = -1, yIndex = -1; // 当前下子的位置 public GobangGame() { setTitle("Java五子棋小游戏"); setSize(600, 600); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); setResizable(false); ChessBoard chessBoardPanel = new ChessBoard(); add(chessBoardPanel); setVisible(true); } // 重写paint方法,绘制棋盘和棋子 public void paint(Graphics g) { super.paint(g); // 绘制棋盘 for (int i = 0; i < ROWS; i++) { g.drawLine(MARGIN, MARGIN + i * GRID_SPAN, MARGIN + (COLS - 1) * GRID_SPAN, MARGIN + i * GRID_SPAN); g.drawLine(MARGIN + i * GRID_SPAN, MARGIN, MARGIN + i * GRID_SPAN, MARGIN + (ROWS - 1) * GRID_SPAN); } // 绘制棋子 for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (chessBoard[i][j] == 1) { g.setColor(Color.BLACK); g.fillOval(MARGIN + i * GRID_SPAN - 15, MARGIN + j * GRID_SPAN - 15, 30, 30); } else if (chessBoard[i][j] == 2) { g.setColor(Color.WHITE); g.fillOval(MARGIN + i * GRID_SPAN - 15, MARGIN + j * GRID_SPAN - 15, 30, 30); } } } } // 判断是否胜利 private boolean checkWin(int[][] arr, int x, int y) { int count = 1; // 水平方向 for (int i = x - 1; i >= 0; i--) { if (arr[i][y] == arr[x][y]) { count++; } else { break; } } for (int i = x + 1; i < ROWS; i++) { if (arr[i][y] == arr[x][y]) { count++; } else { break; } } if (count >= 5) { return true; } // 垂直方向 count = 1; for (int i = y - 1; i >= 0; i--) { if (arr[x][i] == arr[x][y]) { count++; } else { break; } } for (int i = y + 1; i < COLS; i++) { if (arr[x][i] == arr[x][y]) { count++; } else { break; } } if (count >= 5) { return true; } // 左上到右下方向 count = 1; for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) { if (arr[i][j] == arr[x][y]) { count++; } else { break; } } for (int i = x + 1, j = y + 1; i < ROWS && j < COLS; i++, j++) { if (arr[i][j] == arr[x][y]) { count++; } else { break; } } if (count >= 5) { return true; } // 右上到左下方向 count = 1; for (int i = x - 1, j = y + 1; i >= 0 && j < COLS; i--, j++) { if (arr[i][j] == arr[x][y]) { count++; } else { break; } } for (int i = x + 1, j = y - 1; i < ROWS && j >= 0; i++, j--) { if (arr[i][j] == arr[x][y]) { count++; } else { break; } } if (count >= 5) { return true; } return false; } // 内部类,表示棋盘面板 class ChessBoard extends JPanel { private static final long serialVersionUID = 1L; public ChessBoard() { setBackground(new Color(255, 216, 185)); addMouseListener(new ChessBoardListener()); } // 重写paintComponent方法,绘制棋盘和棋子 public void paintComponent(Graphics g) { super.paintComponent(g); // 绘制棋盘 for (int i = 0; i < ROWS; i++) { g.drawLine(MARGIN, MARGIN + i * GRID_SPAN, MARGIN + (COLS - 1) * GRID_SPAN, MARGIN + i * GRID_SPAN); g.drawLine(MARGIN + i * GRID_SPAN, MARGIN, MARGIN + i * GRID_SPAN, MARGIN + (ROWS - 1) * GRID_SPAN); } // 绘制棋子 for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (chessBoard[i][j] == 1) { g.setColor(Color.BLACK); g.fillOval(MARGIN + i * GRID_SPAN - 15, MARGIN + j * GRID_SPAN - 15, 30, 30); } else if (chessBoard[i][j] == 2) { g.setColor(Color.WHITE); g.fillOval(MARGIN + i * GRID_SPAN - 15, MARGIN + j * GRID_SPAN - 15, 30, 30); } } } } } // 内部类,表示棋盘鼠标监听器 class ChessBoardListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { if (gameOver) { return; } int xPos = e.getX(); int yPos = e.getY(); int xIndex = Math.round((float) (xPos - MARGIN) / GRID_SPAN); int yIndex = Math.round((float) (yPos - MARGIN) / GRID_SPAN); if (xIndex < 0 || xIndex >= ROWS || yIndex < 0 || yIndex >= COLS) { return; } if (chessBoard[xIndex][yIndex] != 0) { return; } chessBoard[xIndex][yIndex] = isBlack ? 1 : 2; if (checkWin(chessBoard, xIndex, yIndex)) { gameOver = true; String msg = String.format("%s赢了!", isBlack ? "黑棋" : "白棋"); JOptionPane.showMessageDialog(null, msg); } else if (++xIndex * ++yIndex >= MAX_STEPS) { // 判断是否平局 gameOver = true; JOptionPane.showMessageDialog(null, "平局!"); } isBlack = !isBlack; repaint(); } } public static void main(String[] args) { new GobangGame(); } } ``` 该示例代码使用了Java的Swing GUI库,实现了一个简单五子棋小游戏。在此示例中,我们使用了一个`JFrame`窗口,将一个自定义的`JPanel`面板添加到窗口中,并在面板中绘制棋盘和棋子。同时,我们还为面板添加了一个鼠标监听器,用于处理玩家下棋的事件,并实现了判断胜负的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值