zoukankan      html  css  js  c++  java
  • 方法与简单的控制台五子棋程序

    方法就是一段可以被重复调用的方法块。在Java中要想进行方法的定义,则可以使用如下的语法完成。

    public static 返回类型 方法名称([参数类型 变量, ......]) {
        方法体代码;
        [return [返回值];]
    }

    1.其返回类型为void 时:么有返回值

    2.返回值为数据类型:基本类型和引用类型

    定义一个无返回值无实参的方法:

    public class TestDemo {
        public static void main(String[] args) {
            print();    //主方法里面直接调用方法
        }
        public static void print() {
            System.out.println("Hello    World!"); //定义方法
        }
    }

    定义一个无返回值有参数的方法:

    public class TestDemo {
        public static void main(String[] args) {
            print("Hello");    //主方法里面直接调用方法
            print("    world");
        }
        public static void print(String msg) {    //定义方法
            System.out.print(msg); 
        }

    }

    定义有参数有返回值有参数的方法:

    public class TestDemo {
        public static void main(String[] args) {
            int result = add(10, 20);
            System.out.println(result);
            //将返回值输出
            System.out.println(add(100, 200));
        }
        public static int add(int x, int y) {    //定义方法
            return x + y;
        }
    }

    方法的重载:

          就好比一个班里有多个名字叫“张三”的同学,老师也无法通过姓名来区分他们,为了达到区分不同同学的目的,老师还需要用到这些同学别的信息(如面部信息,身高,声音等),同样,编译器为了区分这些函数,除了用方法名这个特征外,还会用到这个方法的参数列表来区分不同的方法。即方法的名称及其参数列表(参数类型+参数个数)一起构成方法的签名。

    重载方法println的使用:

    public class ShowPrintlnOverload {
        public static void main(String[] args) {
            System.out.println(123);//输出整形int
            System.out.println(12.3);//输出双精度double
            System.out.println('a');//输出字符char类型
            System.out.println("A");//输出字符串类型String
            System.out.println(false);//输出布尔类型boolean
        }
    }

    System是在java.lang包中定义了一个内置类,在该类中定义了一个静态对象out,由于静态成员属于类成员的,所以他的访问方式是“类名.成员名”-----System.out。在本质上,out是PrintStream类的实例对象,println()则是PrintStream类中定义的方法。

    上述代码可以输出不同的数据类型,相同的方法名+不同的参数列表是典型的方法重载的特征。

    构成重载:

    a.方法名称相同

    b.方法的参数列表不同(包括参数个数,参数类型,参数顺序,至少有一项不同)

    c.方法的返回值和修饰符可以相同,也可以不同。

    注意!!!!方法的签名仅包括方法名称和方法参数,因此方法重载不能够根据方法的不同返回值来区分不同的方法,因为返回值不属于方法签名的一部分。例如,int add(int ,int )和void add(int ,int )的方法签名是相同的,编译器会认为这两个方法完全相同而无法区分,因此达不到重载的目的。

    控制台五子棋:

    由用户手动输入一个数字,来控制棋盘的大小,黑方和白方分别用1,2表示,当五子连线则胜利,打印出胜利方。

    生成棋盘:

    Scanner in = new Scanner(System.in);
            System.out.print("请输入棋盘大小");
            int row = in.nextInt();
            int col = in.nextInt();
            //        生成棋盘
            int[][] arr = new int[row + 1][col + 1];//方便输入行列的坐标
            for (int i = 0; i < arr[0].length; i++) {
                arr[0][i] = i;
            }
            for (int i = 0; i < arr.length; i++) {
                arr[i][0] = i;
    }

    开始下棋的逻辑:

    int m, n;
            boolean flag = true;
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    System.out.print(arr[i][j] + " ");
                }
                System.out.println();
            }
            for (; ; ) {
                if (flag) {
                    System.out.print("黑方下棋");
                    m = in.nextInt();
                    n = in.nextInt();
                    arr[m][n] = 1;
                } else {
                    System.out.print("白方下棋");
                    m = in.nextInt();
                    n = in.nextInt();
                    arr[m][n] = 2;
                }
    
                for (int i = 0; i < arr.length; i++) {
                    for (int j = 0; j < arr[i].length; j++) {
                        System.out.print(arr[i][j] + " ");
                    }
                    System.out.println();
                }
    //五子棋下棋以后的逻辑判断
                if (flag) {
                    //表示黑方(1)下的棋
                    //黑方是否胜利的逻辑判断
                    //judge返回true,就表示赢了;返回false就表示没赢
                    if (judge(arr, m, n, 1)) {
                        System.out.println("黑方胜利!");
                        return;
                    }
                    flag = false;
                } else {
    
                    if (judge(arr, m, n, 2)) {
                        System.out.println("白方胜利!");
                        return;
                    }
                    flag = true;
                }
            }
        }

    下棋的逻辑判断:

    /**
         * 判断下棋的逻辑
         * @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;
    
            // 先判断横向的左边
            //   ...   [m,n-1] [m,n] [m,n+1]
            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;
                }
            }
    
            // 判断count
            if(count == 5){
                return true;
            }
    
            // 给count要重置一下
            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;
                }
            }
    
            // 判断count
            if(count == 5){
                return true;
            }
    
            // count需要重置一下
            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;
                }
            }
            // 判断count
            if(count == 5){
                return true;
            }
    
            // count需要重置一下
            count = 1;
            // 判断右斜上方向
            for(i=m-1, j=n-1; i>0 && j>0; --i, --j){
                if(chess[i][j] == data){
                    count++;
                } else {
                    break;
                }
            }
            // 判断右斜下方向
            for(i=m+1, j=n+1; i<chess.length && j<chess[0].length; ++i, ++j){
                if(chess[i][j] == data){
                    count++;
                } else {
                    break;
                }
            }
            // 判断count
            if(count == 5){
                return true;
            }
    
            // 上面检查了各个方向,都没有胜利,直接返回false,表示还又有赢棋
            return false;
        }
    
    
    }

    运行结果:

  • 相关阅读:
    python-flask-SQLAlchemy
    python-flask-script定制manage命令
    python-flask框架
    python-flask-wtforms
    python-思路整理-虚拟环境
    python--django-admin定制页面流程:
    友盟iOS微信登陆没有回调的原因
    用同一个工程创建两个不同版本的应用
    简单方法实现手势解锁
    iOS开发中地图开发的简单应用
  • 原文地址:https://www.cnblogs.com/128-cdy/p/11737556.html
Copyright © 2011-2022 走看看