用Java完成--->五子棋

一、码前分析

  1. 首先得把棋盘打印出来,使用二维数组储存棋盘信息,和每行每列的标号,这里让棋盘有14行14列
    (这里用搜狗输入法里的符号"十"与"⒈","⒉"来表示,因为他们只占一个字符)
  2. 这里用"○"与"●"来分别表示白棋子,与黑棋子,下棋的过程就是棋子覆盖棋盘"十"的过程
  3. 判断下棋子的位置是否符合规范
  4. 要有判断输赢的方法
    二、代码演示
public class Homework {
    static String[][] qp = new String[15][15];//由于棋盘最后一行与最后一列要放行列编号,所以此处要15*15的二维数组
    static String line = "十";
    static String black = "●";
    static String white = "○";
    static String [] num = new String[]{"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖"};
    static Scanner sr = new Scanner(System.in);
    public static void main(String[] args) {
        Homework.initQp();
        Homework.printQp();
        Homework.startXiaQi();
    }
    //初始化棋盘的代码
    public static void initQp(){
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                if(i==14){//棋盘的最后一行是列的标号,所以此行赋num里的标号
                    qp[i][j] = num[j];
                }
                else{           //注意此处的if _else的嵌套
                    if(j==14){
                        qp[i][j] = num[i];//棋盘最后一列是行的标号
                    }
                    else {
                        qp[i][j] = line;//其他行列是棋盘符号
                    }
                }
            }
        }
    }
    //打印棋盘的代码
    public static void printQp(){
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                System.out.print(qp[i][j]);//打印每个棋盘符号
                if(j==14) System.out.println();//当列等于14时候要换行操作
            }
        }
    }
    //开始下棋的代码
    public static void startXiaQi(){
        int flag = 0;//定义一个变量,来下黑白棋之间的
        while(true){
            int row,list;
            if(flag==0) {
                System.out.println("请黑方落子");
                row = sr.nextInt()-1;
                list = sr.nextInt()-1;
                if(check(row,list)){
                    qp[row][list] = black;
                    printQp();
                    if(isWin(row,list,black)){
                        System.out.println("黑方胜利");
                        break;
                    }
                    flag = 1;
                }
                else{
                    continue; 
                }
            }
            else {
                System.out.println("请白方落子");
                row = sr.nextInt()-1;
                list = sr.nextInt()-1;
                if(check(row,list)){
                    qp[row][list] = white;
                    printQp();
                    if(isWin(row,list,white)){
                        System.out.println("白方胜利");
                        break;
                    }
                    flag = 0;
                }
                else{
                    continue;
                }
            }
        }
    }
    //判断棋子位置是否符合规范的代码
    public static boolean check(int x,int y){
        if(x<0||x>13||y<0||y>13){
            System.out.println("棋子已越界,请重新下");
            return false;
        }
        if(!qp[x][y].equals(line)){
            System.out.println("棋子重复,请重新下");
            return false;
        }
        else return true;
    }
    //判断输赢
    public static boolean isWin(int x,int y,String qz){
        int count = 1;
        //横着判断
        for (int i = y-1; i >= 0 ; i--) {//向左
            if (qp[x][i].equals(qz)) {
                count++;                 //判断如果是该棋子则计数器+1
                if(count >= 5){          //每次计数器+1要判断是否成5个棋子 
                    return true;
                }
            }
            else{
                break;
            }
        }
        for (int i = y+1; i < 14 ; i++) {//向右
            if (qp[x][i].equals(qz)) {
                count++;
                if(count >= 5){
                    return true;
                }
            }
            else{
                count = 1;            //当一个方向判断完毕后要给计数器归零,不然会引起其他判断的失误
                break;
            }
        }
        //竖着判断
        for (int i = x-1; i >= 0; i--) {//向上判断
            if (qp[i][y].equals(qz)) {
                count++;
                if(count >= 5){
                    return true;
                }
            }
            else{
                break;
            }
        }
        for (int i = x+1; i <14 ; i++) {//向下判断
            if(qp[i][y].equals(qz)){
                count++;
                if(count >= 5){
                    return true;
                }
            }
            else{
                count = 1;
                break;
            }
        }
        //左上右下判断
        for (int i = x-1,j = y-1; i >=0&&j>=0 ; i--,j--) {//左上
            //此处的for循环要定义两个变量,因为寻找的那个棋子的行和列都变了
            if(qp[i][j].equals(qz)){
                count++;
                if(count >= 5){
                    return true;
                }
            }
            else{
                break;
            }
        }
        for (int i = x+1,j = y+1; i <14&&j<14 ; i++,j++) {//右下
            if(qp[i][j].equals(qz)){
                count++;
                if(count >= 5){
                    return true;
                }
            }
            else{
                count = 1;
                break;
            }
        }
        //右上左下判断
        for (int i = x-1,j = y+1; i >=0&&j<14 ; i--,j++) {//右上
            if(qp[i][j].equals(qz)){
                count++;
                if(count >= 5){
                    return true;
                }
            }
            else{
                break;
            }
        }
        for (int i = x+1,j = y-1; i <14&&j>=0 ; i++,j--) {//左下
            if(qp[i][j].equals(qz)){
                count++;
                if(count >= 5){
                    return true;
                }
            }
            else{
                count = 1;
                break;
            }
        }
        return false;
    }
}
                                  *如果有不足需要改进的地方欢迎指出
                                                有不理解的随时私信*
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的五子棋 Java 代码,使用了 Swing 图形库实现了 GUI 界面: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Gobang extends JFrame { private static final long serialVersionUID = 1L; private int ROWS = 15; private int COLS = 15; private int CELL_SIZE = 30; private int[][] board = new int[ROWS][COLS]; private boolean isBlack = true; public static void main(String[] args) { Gobang game = new Gobang(); game.init(); } public void init() { JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); GobangBoard boardPanel = new GobangBoard(); mainPanel.add(boardPanel, BorderLayout.CENTER); this.setContentPane(mainPanel); this.setTitle("五子棋"); this.setSize(ROWS * CELL_SIZE, COLS * CELL_SIZE); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } class GobangBoard extends JPanel { private static final long serialVersionUID = 1L; public GobangBoard() { addMouseListener(new GobangListener()); } public void paint(Graphics g) { g.setColor(Color.WHITE); g.fillRect(0, 0, ROWS * CELL_SIZE, COLS * CELL_SIZE); g.setColor(Color.BLACK); for (int i = 0; i < ROWS; i++) { g.drawLine(0, i * CELL_SIZE, ROWS * CELL_SIZE, i * CELL_SIZE); } for (int i = 0; i < COLS; i++) { g.drawLine(i * CELL_SIZE, 0, i * CELL_SIZE, COLS * CELL_SIZE); } for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (board[i][j] == 1) { g.setColor(Color.BLACK); g.fillOval(i * CELL_SIZE + 2, j * CELL_SIZE + 2, CELL_SIZE - 4, CELL_SIZE - 4); } else if (board[i][j] == 2) { g.setColor(Color.WHITE); g.fillOval(i * CELL_SIZE + 2, j * CELL_SIZE + 2, CELL_SIZE - 4, CELL_SIZE - 4); } } } } class GobangListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { int x = e.getX() / CELL_SIZE; int y = e.getY() / CELL_SIZE; if (x < 0 || x >= ROWS || y < 0 || y >= COLS) { return; } if (board[x][y] != 0) { return; } board[x][y] = isBlack ? 1 : 2; isBlack = !isBlack; repaint(); } } } } ``` 这个程序包含一个 `Gobang` 类和一个 `GobangBoard` 类。`Gobang` 类负责初始化界面,包括设置标题、大小、关闭操作等;`GobangBoard` 类继承自 `JPanel`,负责绘制棋盘和处理用户的鼠标事件。在 `GobangBoard` 类中,`paint` 方法用于绘制棋盘和棋子,`GobangListener` 类用于处理用户的鼠标点击事件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值