• 方法与五子棋游戏


    方法:一段用于完成特定功能的代码片段,类似于其他语言的函数。

    方法用于定义该类或该类的失礼行为特征和功能实现。方法是类和对象行为特征的抽象。方法类似于面向过程中的函数。在面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。方法包括方法名与参数。

    方法的调用方式:

    1.形式参数:在方法声明时用于接收外界传入的数据

    2.实参:调用方法时实际传给方法的数据

    3.返回值:方法在执行完毕后返回给调用它的环境的数据

    4.返回值类型:事先约定的返回值的数据类型,如无返回值类型,必须显示指定为void

    练习1•:两个数值的交换与对应的内存分析:

    内存分析:

     

     练习2•:字符串及字符的交换

     内存分析:

    练习3•:数值的改变

    i的值为多少?

      public static void main(String[] args) {
            int i=0;
            fun(i);
            i=i++;//0      ++i为1

    System.out.println("main函数里面的i: "+i);
    } 
    public static void fun1(int i){
    i
    ++
     System.out.println("局部函数里面的i: "+i);

    }

    i++:先把i赋给i,再相加,所以i的值不变,还是0,调用 fun(i) 函数,只是改变了局部函数的i值。

     若为i=++1,main函数里的i输出结果为1.

    练习4:五子棋游戏(控制台版)

    /**
    * 二维数组的应用,实现一个简单的基于控制台应用程序的五子棋对战游戏
    * 软件运行要求如下:
    * 1.输入要生成的棋盘的行列数 m和n
    * 2.显示五子棋盘,每一个位置默认都是0
    * 3.提示黑方下棋:3 4 黑棋显示为1
    * ===》 代码进行逻辑检查
    * 横 竖 斜
    * 4.提示白方下棋:2 5 白棋显示为2
    *
    * 如果哪一方胜出,则打印,程序退出
    */

    逻辑:1.输入(Scanner)要生成棋盘的行列数(m,n),以二维数组的方式显示棋盘chess[m+1][n+1],分别用一行一列显示行列数
    2.将棋盘的数字默认为0(双重for循环),其中二维数组的第0行第0列分别显示列数和行数(chess[0][i]=i,chess[j][0]=j),效果如图

    3.提示下棋,并输入相应坐标,定义一个flag,若为true则黑棋下,黑棋下了后,在坐标处显示1,否则白棋下了显示2,代码如下,效果如图:
    if (flag) {
    System.out.print("黑方下棋:");
    m = in.nextInt();
    n = in.nextInt();
    chess[m][n] = 1;
    } else {
    System.out.print("白方下棋:");
    m = in.nextInt();
    n = in.nextInt();
    chess[m][n] = 2;
    }

    此处,应该设置一个无限循环,直到有一方胜出,再退出程序

    4.判断哪方胜的逻辑,分别从横,竖,斜三个方面

    for (; ; ) {
        // 1.先提示下棋
        if (flag) {
            System.out.print("黑方下棋:");
            m = in.nextInt();
            n = in.nextInt();
            chess[m][n] = 1;
        } else {
            System.out.print("白方下棋:");
            m = in.nextInt();
            n = in.nextInt();
            chess[m][n] = 2;
        }
        if (flag) {
            // 表示黑方(1)下的棋
            // 黑方是否胜利的逻辑判断代码
            if(judge(chess,m,n,1)){
                System.out.println("黑棋赢!");
                return;
            }
            // 该白方下棋了
            flag = false;
        } else {
            // 表示白方(2)下的棋
            // 白方是否胜利的逻辑判断代码
            if (judge(chess, m, n, 2)) {
                System.out.println("白棋赢!");
                return;
            }
        // 2.显示棋盘  i  j  i-1 j-1 i-2
        for (int i = 0; i < chess.length; i++) {
            for (int j = 0; j < chess[i].length; j++) {
                System.out.print(chess[i][j] + " ");
            }
            System.out.println();
        }
        // 3.五子棋下棋以后的逻辑判断   胜出    继续提示白方下棋:
      }
            // 该黑方下棋了
            flag = true;
        }

    5.具体的judge函数的实现

      /**
         * judge函数判断哪个琪赢
         * @param chess 存储所有棋子的二维数组
         * @param m  下棋的行
         * @param n  下棋的列
         * @param data  黑棋1或者白棋2
         * @return  返回true,表示data胜利了,否则返回false则另一方胜利
         */
    
        private static boolean judge(int[][] chess, int m, int n, int data) {
            int count=1;
            int j=0;
            //先判断横向的左边
            for(j=n-1;j>0;j--){    //判断横向的时候,i不变,j改变,从当前位置的左边一直向左边,直到第一列
                if(chess[m][j]==data){   //如果第m行的纵坐标为1或者2,则对应的棋数加1
                    count++;   //棋子数相加
                }
                else{break; }
            }
            //横向的右边
            for(j=n+1;j<chess[0].length;j++){   //棋子一直向右走
                if(chess[m][j]==data){
                    count++;
                }else{break;}
    
                if(count == 5){   //如果横向判断完后count为5,则返回data对应的棋子,true的一方获胜
                    return true;
                }
            }
            count=1;
            int i=0;
            //竖向的上边
            for(i=m-1;i>0;--i){
                if(chess[i][n]==data){
                    count++;
                }else{break;}
            }
            //竖向的下边
            for(i=m+1;i<chess.length;++i){
                if(chess[i][n]==data){
                    count++;
                }else{break;}
            }
            if(count == 5){
                return true;
            }
            count=1;
           //左斜上方
            for(i=m-1,j=n+1;i>0&&j<chess[0].length;--i,++j){
               if(chess[i][j]==data){
                   count++;
                }else{break;}
            }
            //左斜下方
            for(i=m+1,j=n-1;i<chess.length&&j>0;++i,--j){
                if(chess[i][j]==data){
                    count++;
                }else{break;}
            }
    
            //右斜上方
            for(i=m-1,j=n-1;i>0&&j>0;--i,--j){
                if(chess[i][j]==data){
                    count++;
                }else{break;}
            }
            if(count == 5){
                return true;
            }
            count=1;
            //右斜下方
            for(i=m+1,j=n+1;i<chess.length&&j<chess[0].length;--i,--j){
                if(chess[i][j]==data){
                    count++;
                }else{break;}
            }
            if(count == 5){
                return true;
            }
            // 上面检查了各个方向,都没有胜利,直接返回false,表示还又有赢棋
          return false;
    }

     具体整个代码的实现:

    public class WuZiQi{
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            System.out.print("输入五子棋盘的行列数:");
            int row = in.nextInt(); //定义棋盘的行
            int col = in.nextInt(); //定义棋盘的列
    
            // 生成棋盘,包括数字梯子行,列;所以+1
            int [][] chess = new int[row + 1][col + 1];
            // 给第一行填数字
            for (int i = 0; i < chess[0].length; i++) {
                chess[0][i] = i;
            }
            // 给第一列填数字
            for (int i = 0; i < chess.length; i++) {
                chess[i][0] = i;
            }
    
            // 无限循环
            int m, n;  //下棋的时候的横、纵坐标
            boolean flag = true; // true表示黑方下   false表示白方下
    
            // 未下棋的时候的棋盘
            for (int i = 0; i < chess.length; i++) {
                for (int j = 0; j < chess[i].length; j++) {
                    System.out.print(chess[i][j] + " ");
                }
                System.out.println();
            }
            //无限循环,直到有一方胜出
            for (; ; ) {
                // 1.先提示下棋
                if (flag) {
                    System.out.print("黑方下棋:");
                    m = in.nextInt();
                    n = in.nextInt();
                    chess[m][n] = 1;
                } else {
                    System.out.print("白方下棋:");
                    m = in.nextInt();
                    n = in.nextInt();
                    chess[m][n] = 2;
                }
    
                // 2.显示棋盘  i  j  i-1 j-1 i-2
                for (int i = 0; i < chess.length; i++) {
                    for (int j = 0; j < chess[i].length; j++) {
                        System.out.print(chess[i][j] + " ");
                    }
                    System.out.println();
                }
    
                // 3.五子棋下棋以后的逻辑判断   胜出    继续提示白方下棋:
                if (flag) {
                    // 表示黑方(1)下的棋
                    // 黑方是否胜利的逻辑判断代码
                    if(judge(chess,m,n,1)){
                        System.out.println("黑棋赢!");
                        return;
                    }
                    // 该白方下棋了
                    flag = false;
                } else {
                    // 表示白方(2)下的棋
                    // 白方是否胜利的逻辑判断代码
                    if(judge(chess,m,n,2)){
                        System.out.println("白棋赢!");
                        return;
                    }
                    // 该黑方下棋了
                    flag = true;
                }
            }
        }
            /**
         * judge函数判断哪个琪赢
         * @param chess 存储所有棋子的二维数组
         * @param m  下棋的行
         * @param n  下棋的列
         * @param data  黑棋1或者白棋2
         * @return  返回true,表示data胜利了,否则返回false则另一方胜利
         */
    
        private static boolean judge(int[][] chess, int m, int n, int data) {
            int count=1;
            int j=0;
            //先判断横向的左边
            for(j=n-1;j>0;j--){
                if(chess[m][j]==data){
                    count++;
                }
                else{break; }
            }
            //横向的右边
            for(j=n+1;j<chess[0].length;j++){
                if(chess[m][j]==data){
                    count++;
                }else{break;}
    
                if(count == 5){
                    return true;
                }
            }
            count=1;
            int i=0;
            //竖向的上边
            for(i=m-1;i>0;--i){
                if(chess[i][n]==data){
                    count++;
                }else{break;}
            }
            //竖向的下边
            for(i=m+1;i<chess.length;++i){
                if(chess[i][n]==data){
                    count++;
                }else{break;}
            }
            if(count == 5){
                return true;
            }
            count=1;
           //左斜上方
            for(i=m-1,j=n+1;i>0&&j<chess[0].length;--i,++j){
               if(chess[i][j]==data){
                   count++;
                }else{break;}
            }
            //左斜下方
            for(i=m+1,j=n-1;i<chess.length&&j>0;++i,--j){
                if(chess[i][j]==data){
                    count++;
                }else{break;}
            }
    
            //右斜上方
            for(i=m-1,j=n-1;i>0&&j>0;--i,--j){
                if(chess[i][j]==data){
                    count++;
                }else{break;}
            }
            if(count == 5){
                return true;
            }
            count=1;
            //右斜下方
            for(i=m+1,j=n+1;i<chess.length&&j<chess[0].length;--i,--j){
                if(chess[i][j]==data){
                    count++;
                }else{break;}
            }
            if(count == 5){
                return true;
            }
            // 上面检查了各个方向,都没有胜利,直接返回false,表示还又有赢棋
          return false;
    }
    }

     最后的成果控制台展示:




  • 相关阅读:
    Linux/ visual studio 编译使用Poco
    无法安装 golang.org/x/tools/的库
    大牛blog汇总
    Redis整合Spring结合使用缓存实例
    js增加收藏
    iOS学习笔记12-网络(一)NSURLConnection
    Kick the ball!(dfs)湖南省赛第十届
    windows程序设计——飞机大战笔记(Access数据库的使用)
    DataGridView.DataSource= list(Of T)
    面试之SQL(1)--选出选课数量&gt;=2的学号
  • 原文地址:https://www.cnblogs.com/laurarararararara/p/11567499.html
Copyright © 2020-2023  润新知