Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lab5 Code Review #2

Open
lfs1102 opened this issue Oct 25, 2016 · 4 comments
Open

Lab5 Code Review #2

lfs1102 opened this issue Oct 25, 2016 · 4 comments

Comments

@lfs1102
Copy link
Member

lfs1102 commented Oct 25, 2016

在 Code Review 环节,同学们将阅读助教和其他同学的代码,发现他人代码中的优缺点,并和自己的代码作比较,来扩宽视野,提升自己的代码水平。
这个环节中,我们要求同学们写下一些体会、回答一些问题。请同学们将所有的回答写在同个一文档中,并以学号+姓名命名。如 16302010002李云帆.txt16302010063郭涵青.docx 等。并上传之ftp WORK_UPLOAD 目录下的 CodeReview 目录下的 lab5 目录中。

@lfs1102
Copy link
Member Author

lfs1102 commented Oct 25, 2016

首先,请同学们阅读学习一下童仲毅助教的代码:github.com/java-a/lab5/issues/1
找出助教代码2处你认为写的好,可以学习的地方,写一小段体会。

@lfs1102
Copy link
Member Author

lfs1102 commented Oct 25, 2016

接下来是一段同学的代码:

import java.util.Scanner;

public class Tic_tac_toe1 {
    public static void main(String[] args) {
        int[][] Map = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
        final int left = 10000;
        final int right = 1000;
        Scanner scanner = new Scanner(System.in);
        int j = 0, m , n , input;
        //j为偶数,左方先输入;为奇,右先
        do {
            for (int i = 0; i < Map.length; i++) {
                for (int value : Map[i]) {
                    if (value == left) {
                        System.out.print("x");
                    } else if (value == right) {
                        System.out.print("0");
                    } else System.out.print(".");
                }System.out.println();
            }
            System.out.println("next move:");
            input =scanner.nextInt();
            for (m = 0; m < Map.length; m++)
                for (n = 0; n < Map[m].length; n++) {
                    if (Map[m][n] == input) {
                        if (j % 2 == 0) {
                            Map[m][n] = left;
                            j++;
                        } else {
                            Map[m][n] = right;
                            j++;
                        }
                    }
                }
        } while (j <=9);
    }
}

阅读代码并回答以下2个问题:

  1. 这段代码实现了哪些进阶功能(不能重复落子、胜负判断等)?实现的效果怎么样?
  2. 这段代码中的 left 和 right 是作什么用的?这种写法好不好?会出现bug吗?是什么原因使得这个同学采取了这种方法?可以怎样修改?

答案:

  1. 这段代码基本上实现了不能重复落子的功能。
  2. 这道题是本次 code review 中最难的一道,大部分同学都没有答对。

2.1这段代码中的 left 和 right 是作什么用的?
大部分同学都回答了 left 和 right 的作用是实现双方交替下子,但实际上交替下子是变量 j 来控制的。
left 和 right 的作用是在棋盘数组(int[][] Map)中表示双方已经下的子,就像大部分同学的代码中用0X来代替.表示已经下的子一样。

2.2 这种写法好不好?会出现bug吗?
大约有一半同学找出了代码中的bug,这道题曹家俊同学写得很清楚详细,下面是他的回答:

输入1000或者10000可以改变对方棋子(效果如下)
  ...
  ...
  ...
  next move:1
  .x.
  ...
  ...
  next move:10000
  .0.
  ...
  ...
  next move:1000
  .x.
  ...
  ...

这种写法的缺点就在于会出现这样的bug,不过可以通过判断输入的数字范围来避免出现bug。

2.3 是什么原因使得这个同学采取了这种方法?可以怎样修改?
这道题只有个别同学答对。
这里我借用于丰原同学的答案:

由于一开始的int[][] Map = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};设置,要求这样做。
修改的话最好将其重定义int[][] Map = {{'.','.','.'}, {'.','.','.'}, {'.','.','.'}};进行编码(最后可能就类似TA那种简单的方法了)

这段代码最大的区别就在于使用了int[][] Map = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};来表示棋盘,所以写法上会和大部分同学的代码有不少区别,请同学们仔细阅读代码来体会下。

最后,这段代码除去没做全附加功能和存在一个bug的问题之外,是一段写得相当不错的代码。代码中最精彩的地方是条件判断的部分,非常简介有力,没有冗余,希望同学们仔细分析一下这段代码的运行逻辑。

@lfs1102
Copy link
Member Author

lfs1102 commented Oct 25, 2016

最后,我们来试着提升一下下面这段代码:

import javax.swing.*;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        char[][] plate;
        plate = new char[3][3];
        boolean player = true;
        int i = 0 , j = 0 , sum = 1;
        int x = 0 , o = 0;
        while (i < 3){
            while (j < 3){
                plate[i][j] ='.';
                j++;
            }
            j = 0;
            i++;
        }
        i = 0;
        j = 0;
        while (i < 3){
            while (j < 3){
                System.out.print(plate[i][j]);
                j++;
            }
            j = 0;
            i++;
            System.out.print('\n');
        }
        System.out.println("开始游戏");
        while (sum > 0){
            String data = JOptionPane.showInputDialog("下一步行动位置(行列数)");
            String first = data.substring(0, 1);
            String second = data.substring(1, 2);
            int m = Integer.parseInt(first) - 1;
            int n = Integer.parseInt(second) - 1;
            if (m > 2 || n > 2) {
                System.out.println("error");
                continue;
            }else{
                if (plate[m][n] == '.'){
                    if (player == true){
                        plate[m][n] = 'X';
                    }else {
                        plate[m][n] = 'O';
                    }
                }else{
                    System.out.println("error");
                    continue;
                }
            }
            i = 0;
            j = 0;
            while (i < 3){
                while (j < 3){
                    System.out.print(plate[i][j]);
                    j++;
                }
                j = 0;
                i++;
                System.out.print('\n');
            }
            System.out.print("当前步数:");
            System.out.println(sum);
            player =!player;
        }
    }
}
  1. 下面这段代码(第一个while循环)做了什么?可以怎样提升一下?
        while (i < 3){
            while (j < 3){
                plate[i][j] ='.';
                j++;
            }
            j = 0;
            i++;
        }

2.代码中出现了大量的 i=0j=0,是做什么用?这种代码重复性高,并且多一个、少一个都会导致程序错误,怎样改进可以避免这么多的重复?

答案

  1. 这道题其实非常简单,但是却有很多同学答错。

1.1. 下面这段代码(第一个while循环)做了什么?
这段代码的作用是初始化棋盘,将每个位置全部设置为'.'
很多同学都回答的是输出棋盘,但代码中明显没有输出的代码。
希望同学们认真读题,不要想当然地回答。

1.2. 可以怎样提升一下?
这道题很多同学都回答的是使用for循环。但这并不是最好的提升方法。
注意到这段代码的作用是初始化棋盘,我们可以简单地将初始化工作放在定义棋盘的地方:

char[][] plate = new char[][]{{'.','.','.'}, {'.','.','.'}, {'.','.','.'}};

2 这道题比较简单,大部分同学也回答对了。i 和 j 的作用是计数,可以通过改用for循环来避免出现大量的i=0j=0i++等。

@lfs1102
Copy link
Member Author

lfs1102 commented Oct 25, 2016

回答文档提交:请同学们将所有的回答写在同一个文档中,并以学号+姓名命名。如 16302010002李云帆.txt16302010063郭涵青.docx 等。并上传至 FTPWORK_UPLOAD 目录下的 CodeReview 目录下的 lab5 目录中。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant