Java练习题2 五子棋

主要应用二维数组,循环的知识

import java.util.Scanner;
public class Wuziqi {
    public static void main(String[] args) {
        String white = "☆";
        String black = "★";
        int m = 15, n = 15;
        String[][] qp = new String[16][16];
        String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖", "⒗"};
        String line = "十";
        arrayList(m, n, qp, num, line);
        start(black, white, qp,line);
    }

先应用二维数组建棋盘

    //15*15棋盘的创建
    public static void arrayList(int m, int n, String[][] qp, String[] num, String line) {
        for (int i = 0; i < qp.length; i++) {
            for (int j = 0; j < qp[i].length; j++) {
                if (i == m) {       //当变量i的值相等于m时,将num数组的值赋给二维数组的最后一列
                    qp[m][j] = num[j];
                } else if (j == n) { //当变量j的值相等于n时,将num数组的值赋给二维数组的最后一行
                    qp[i][n] = num[i];
                } else {
                    qp[i][j] = line;  //将十赋给剩余二维数组的位置  
                }
            }
        }
        print(qp);    //此时棋盘创建好
    }

运行结果:

 打印二维数组,即打印生成的棋盘

//打印棋盘  
    public static void print(String[][] qp) {
        for (int i = 0; i < qp.length; i++) {    //双重循环来打印二维数组
            for (int j = 0; j < qp[i].length; j++) {
                System.out.print(qp[i][j]);
            }
            System.out.println();
        }
    }

完成之后就到下棋环节:

public static void start(String black, String white, String[][] qp,String line) {
        Scanner scanner = new Scanner(System.in);
        boolean flag = true; //用来判断哪一方下棋
        while (true) {
            if (flag == true) {
                System.out.println("黑子下棋:");
                System.out.print("请输入x坐标:");
                int x = scanner.nextInt();
                System.out.print("请输入y坐标:");
                int y = scanner.nextInt();
                //判断下棋的位置是否正确
                boolean a=position(x,y,qp,line);
                if(a==false){
                    System.out.print("输入有误或者已经用过");
                    continue;
                }
                qp[x - 1][y - 1] = black;
                boolean b=win(x,y,qp,line);
                if(b==true){
                    print(qp);
                    System.out.println("恭喜黑方获胜!!");
                    break;
                }
                flag = false;

            } else {
                System.out.println("白子下棋:");
                System.out.print("请输入x坐标:");
                int x = scanner.nextInt();
                System.out.print("请输入y坐标:");
                int y = scanner.nextInt();
                //判断下棋的位置是否正确
                boolean a=position(x,y,qp,line);
                if(a==false){
                    System.out.print("输入有误或者已重复");
                    continue;
                }
                qp[x - 1][y - 1] = white;
                boolean b=win(x,y,qp,line);
                if(b==true){
                    print(qp);
                    System.out.println("恭喜白方获胜!!");
                    break;
                }
                flag = true;
            }
            print(qp);
        }
    }

下棋时需要判断输入的是否越界和重复,位置正确返回true,不正确返回false

//判断下棋的位置是否正确
    public static boolean position(int a, int b,String[][] qp,String line) {
        //判断是否越界,输入有误
        if (a <= 0 || a > 15 || b <= 0 || b > 15) {
            return false;
        }
        //判断是否重复输入
        if(qp[a-1][b-1]!=line){
            return false;
        }
        return true;
    }

//  ==   引用类型比较比较的是地址,比较内容时用   equals()

接下来判断输赢

五子棋五个相连就胜利

可以每次将每次输入的棋子作为看为原点,分为左右、上下、向左上下,向右上下。

左右可以直接固定输入的x值,用i进行遍历,为五个就返回true,否则就跳出循环,进行下一个判断,上下固定输入的y值,同样用i进行遍历,与左右相同。

向左上下,先进行向左上,如果不满足五个点,回到输入的原点,不初始化计数器的值,再向左下进行遍历,计数器值相加,若为五个就返回true,向右上下同理。
 

   //判断输赢
    public static boolean win(int a,int b,String[][] qp,String line){
        //判断左右  上下  左上左下  右上右下  是否连成五个用count计数  count>=4时,返回true
        int count=0;

        //判断左右  行不变,输入的a不变,已输入的为原点,进行查找
        for(int i=0;i<qp.length-1;i++){      
            if(qp[a-1][i]!=line){    
                if(qp[a-1][i]==qp[a-1][i+1]){
                    count++;
                }else{
                    break;   //不连续结束循环
                }
            }
        }

        //判断上下  输入的b不变,已输入的为原点,进行查找
        for (int i=0;i<qp.length-1;i++){
            if(qp[i][b-1]!=line){
                if(qp[i][b-1]==qp[i+1][b-1]){
                    count++;
                }else{
                    break;    //不连续结束循环
                }
            }
        }

        //判断左上左下
        //左上    a-1  b-1  
        int j=b-1;
        for(int i=a-1;i>0;i--){
            if(i==0||j==0){    
                break;
            }
            if(qp[i][j]!=line){
                if(qp[i][j]==qp[i-1][j-1]){
                    count++;
                }else{
                    break;
                }
            }
            j--;
        }
        //左下   a+1  b-1    
        j=b-1;    
        for(int i=a-1;i<qp.length-1;i++){
            if(i==qp.length-1||j== 0){
                break;
            }
            if(qp[i][j]!=line){
                if(qp[i][j]==qp[i+1][j-1]){
                    count++;
                }else{
                    break;
                }
            }
            j--;
        }

        //判断右上右下
        //右上   a--  b++    
        j=b-1;
        for(int i=a-1;i>0;i--){
            if(i==0||j==qp.length-1){
                break;
            }
            if(qp[i][j]!=line){
                if(qp[i][j]==qp[i-1][j+1]){
                    count++;
                }else{
                    break;
                }
            }
            j++;
        }
        //右下  a++  b++  
        for(int i=a-1;i<qp.length-1;i++){
            if(i==qp.length-1||j==qp.length-1){
                break;
            }
            if(qp[i][j]!=line){
                if(qp[i][j]==qp[i+1][j+1]){
                    count++;
                }else{
                    break;
                }
            }
            j++;
        }

        if(count>=4){
            return true;
        }else{
            count=0;     //更新计数
        }
        return false;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值