首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >游戏除以10

游戏除以10
EN

Code Review用户
提问于 2013-11-30 14:54:46
回答 1查看 412关注 0票数 5
代码语言:javascript
运行
复制
import javax.swing.JOptionPane;

public class DividedBy10v2{

    public static void main( String[] args ){
        int block[][] = new int[3][3];
        int DetermineRow = 0;   // The variable assigned for counting rows
        int DetermineColumn = 0; // The variable assigned for counting columns
        int blockRow,blockColumn;
        int score = 0;
        String inputRow, inputColumn;

        //random a set of number
        int randomSet[] = new int[100];
        for(int i=0;i<randomSet.length;i++){
            randomSet[i] = (int) (Math.random() * 9) + 1;
        }

        int round = 0 ;//for counting the round of the game
        while( true ){
            ++round;

            //print out the title and score
            System.out.println( "-------------------------" );
            System.out.println( "Divided by 10 - Mini Game" );
            System.out.printf( "----  Score:%8d  ----\n\n", score );

            //show game board
            System.out.println( "  0 1 2 " );
            for(DetermineRow=0;DetermineRow<block.length;DetermineRow++){
                System.out.print( DetermineRow + " ");
                for(DetermineColumn=0;DetermineColumn<block.length;DetermineColumn++){
                    if(block[DetermineRow][DetermineColumn]!=0){
                        System.out.print( block[DetermineRow][DetermineRow] + " " );
                    }else{
                        System.out.print( "_ " );
                    }
                }
                System.out.println();
            }


            //display the coming value
            System.out.printf( "Coming value : %d > %d > %d \n\n", randomSet[round], randomSet[(round + 1)], randomSet[(round + 2)] );

            //check over checking
            if(block[0][0]>0&&block[0][1]>0&&block[0][2]>0){
                if(block[1][2]>0&&block[1][1]>0&&block[1][2]>0){
                    if(block[2][0]>0&&block[2][1]>0&&block[2][2]>0){
                        System.out.println( "------  Game Over  ------" );
                        //continue check
                        int ContinueCheck = JOptionPane.showConfirmDialog(null, "Do you want to continue ?", "Continue?", JOptionPane.YES_NO_OPTION);
                        if( ContinueCheck == JOptionPane.YES_OPTION){
                            //initialize the game board
                            for(DetermineRow=0;DetermineRow<block.length;DetermineRow++)
                                for(DetermineColumn=0;DetermineColumn<block.length;DetermineColumn++)
                                block[DetermineRow][DetermineColumn]=0;
                            continue;
                        }else{if(ContinueCheck == JOptionPane.NO_OPTION){
                            System.out.println( "-------------------------" );
                            System.out.println("Good Bye !");
                            break;}
                        }
                    }
                }
            }

            //input value
            while(true){
                inputRow = JOptionPane.showInputDialog( "The number of row you want to put the number" );
                blockRow = Integer.parseInt(inputRow);
                inputColumn = JOptionPane.showInputDialog( "The number of column you want to put the number" );
                blockColumn = Integer.parseInt(inputColumn);
                if(blockRow>=block.length || blockRow<0 || blockColumn>=block.length || blockColumn<0){
                    JOptionPane.showMessageDialog(null , "The block you want to enter the number does not exist." , "Error" , JOptionPane.ERROR_MESSAGE );
                    continue;
                }else{
                    if(block[blockRow][blockColumn]!=0){
                        JOptionPane.showMessageDialog(null , "The block you want to enter the number has been entered an number." , "Error" , JOptionPane.ERROR_MESSAGE );
                        continue;
                    }else{
                        block[blockRow][blockColumn] = randomSet[round];
                        break;
                    }
                }
            }

            //score got check
            int modSumBlock[] = {-1,-1,-1,-1,-1,-1,-1,-1};//to store the remainder of the sum of 3 block
            if(block[0][0] != 0 && block[0][1] != 0 && block[0][2] != 0)
                modSumBlock[0] = (block[0][0] + block[0][1] + block[0][2]) % 10;
            if(block[1][0] != 0 && block[1][1] != 0 && block[1][2] != 0)
                modSumBlock[1] = (block[1][0] + block[1][1] + block[1][2]) % 10;
            if(block[2][0] != 0 && block[2][1] != 0 && block[2][2] != 0)
                modSumBlock[2] = (block[2][0] + block[2][1] + block[2][2]) % 10;
            if(block[0][0] != 0 && block[1][0] != 0 && block[2][0] != 0)
                modSumBlock[3] = (block[0][0] + block[1][0] + block[2][0]) % 10;
            if(block[0][1] != 0 && block[1][1] != 0 && block[2][1] != 0)
                modSumBlock[4] = (block[0][1] + block[1][1] + block[2][1]) % 10;
            if(block[0][2] != 0 && block[1][2] != 0 && block[2][2] != 0)
                modSumBlock[5] = (block[0][2] + block[1][2] + block[2][2]) % 10;
            if(block[0][0] != 0 && block[1][1] != 0 && block[2][2] != 0)
                modSumBlock[6] = (block[0][0] + block[1][1] + block[2][2]) % 10;
            if(block[0][2] != 0 && block[1][1] != 0 && block[2][0] != 0)
                modSumBlock[7] = (block[0][2] + block[1][1] + block[2][0]) % 10;
            //all 'if' is used for checking if all block in the same row/column/diagonal are filled in number

            //counting how many score got and where should be cleared by 8bit (in decimal)
            int scoreCount = 0;
            for(int n=0;n<8;n++){
                if(modSumBlock[n]==0){
                    score += 10;
                    scoreCount += (int) Math.pow(2,n);
                }else{
                    continue;
                }
            }

            //start clear game board
            if(scoreCount>=128){
                block[0][2] = 0;
                block[1][1] = 0;
                block[2][0] = 0;
                scoreCount -= 128;
            }
            if(scoreCount>=64){
                block[0][0] = 0;
                block[1][1] = 0;
                block[2][2] = 0;
                scoreCount -= 64;
            }
            if(scoreCount>=32){
                block[0][2] = 0;
                block[1][2] = 0;
                block[2][2] = 0;
                scoreCount -= 32;
            }
            if(scoreCount>=16){
                block[0][1] = 0;
                block[1][1] = 0;
                block[2][1] = 0;
                scoreCount -= 16;
            }
            if(scoreCount>=8){
                block[0][0] = 0;
                block[1][0] = 0;
                block[2][0] = 0;
                scoreCount -= 8;
            }
            if(scoreCount>=4){
                block[2][0] = 0;
                block[2][1] = 0;
                block[2][2] = 0;
                scoreCount -= 4;
            }
            if(scoreCount>=2){
                block[1][0] = 0;
                block[1][1] = 0;
                block[1][2] = 0;
                scoreCount -= 2;
            }
            if(scoreCount>=1){
                block[0][0] = 0;
                block[0][1] = 0;
                block[0][2] = 0;
                scoreCount -= 1;
            }
        }
    }
}

上面的代码是我制作的一个迷你游戏,它由一个3x3的棋盘组成。整数值范围为1-9,由系统生成并存储在数组中。如果已经使用了所有的值,它将从数组的第一个元素重新启动。在每一轮,接下来的三个数字显示给球员,所以球员知道的价值,不仅将在当前一轮,但也在接下来的两轮。

请注意,游戏板中的每个位置只允许一个值。程序应该检查输入位置是否已经分配。如果是这样的话,应该提示玩家再次输入。在一轮结束时,系统将检查棋盘的三行、三列和两条对角线;如果一组的和可被10整除,则可以将和加到分数中,并且可以将值从棋盘中移除。空槽计算为0,当棋盘满时,游戏结束。

我想简化代码,因为它看起来太混乱和复杂。有没有其他方法缩短代码的方法?我如何也允许玩家从不同大小的棋盘中进行选择(例如,游戏开始时会问玩家是想玩3vs3vs4还是5vs5)?您可以尝试编译代码并玩游戏,看看它是如何工作的。

EN

回答 1

Code Review用户

发布于 2013-11-30 16:24:43

我认为,当我运行您的程序时,文本控制台和swing用户输入的结合会导致糟糕的体验。

实际上,既然您有GUI输入框,为什么我必须键入要输入的行/列?为什么不给我一个按钮网格,我有一个可以添加到网格中的数字,我只需点击数字应该去的地方?

这样的网格操作甚至可能比您放在控制台上的文本输出更容易。

尽管如此,我还是很欣赏这段代码是可运行的,并且可以工作.直到我按下“取消”按钮,代码才会抛出一个NumberFormatException

至于代码风格,它看起来非常复杂,有大量的代码重复和“幻数”。改变电网的大小将是非常令人沮丧的.都是硬编码的。

因此,您应该设置一个常量,例如“网格大小”,并在许多地方使用它:

代码语言:javascript
运行
复制
final int gridsize = 3;

然后你可以修复很多你有神奇数字的地方:

代码语言:javascript
运行
复制
int block[][] = new int[gridsize][gridsize];
....
    randomSet[i] = (int) (Math.random() * gridsize * gridsize) + 1;

诸若此类。

展示-游戏板将成为某种形式的循环:

代码语言:javascript
运行
复制
StringBuilder sb = new StringBuilder();
for (int i = 0; i < gridsize; i++) {
    sb.append(String.format("%4d", i));
}

而且,使用大写字母的变量名也不是很好的java编码约定.这句话:

代码语言:javascript
运行
复制
for(DetermineRow=0;DetermineRow<block.length;DetermineRow++){ ....

对Java的“常客”来说是非常讨厌的。对于像这样的小循环,一些简单的东西,比如:

代码语言:javascript
运行
复制
for (int row = 0; row < gridsize; row++) { ...

会更容易理解。注意,我在for循环(int row = 0)中声明了行变量。这是在for循环中定义变量的正常方法。它不是必需的,但当循环变量完全包含在循环中时,它实际上会导致更少的错误.(即row在循环之外不可见)。

现在,在那个显示循环中,因为你有复杂的名字,所以很难看到.这是你的代码:

代码语言:javascript
运行
复制
        for(DetermineRow=0;DetermineRow<block.length;DetermineRow++){
            System.out.print( DetermineRow + " ");
            for(DetermineColumn=0;DetermineColumn<block.length;DetermineColumn++){
                if(block[DetermineRow][DetermineColumn]!=0){
                    System.out.print( block[DetermineRow][DetermineRow] + " " );
                }else{
                    System.out.print( "_ " );
                }
            }
            System.out.println();
        }

我只会重命名你的变量..。我们可以更容易地看到一个bug:

代码语言:javascript
运行
复制
            for(row=0;row<block.length;row++){
                System.out.print( row + " ");
                for(column=0;column<block.length;column++){
                    if(block[row][column]!=0){
                        System.out.print( block[row][row] + " " );
                    }else{
                        System.out.print( "_ " );
                    }
                }
                System.out.println();
            }

你现在能看到窃听器了吗?

代码语言:javascript
运行
复制
System.out.print( block[row][row] + " " );

应:

代码语言:javascript
运行
复制
System.out.print( block[row][column] + " " );

同样,由于游戏检查中有复杂的if-语句,因此还有另一个bug:

代码语言:javascript
运行
复制
       if(block[0][0]>0&&block[0][1]>0&&block[0][2]>0){
            if(block[1][2]>0&&block[1][1]>0&&block[1][2]>0){
                if(block[2][0]>0&&block[2][1]>0&&block[2][2]>0){

在第二行中,应该是0(我用‘^’标记了位置):

代码语言:javascript
运行
复制
       if(block[0][0]>0&&block[0][1]>0&&block[0][2]>0){
            if(block[1][2]>0&&block[1][1]>0&&block[1][2]>0){
                        ^
                if(block[2][0]>0&&block[2][1]>0&&block[2][2]>0){

使用循环(最好是在一种方法中)会更好:

代码语言:javascript
运行
复制
private static final boolean isComplete(int[][] grid) {
    for (int row = 0; row < grid.length; row++) {
        for (int col = 0; col < grid[row].length; col++) {
            if (grid[row][col] == 0) {
                return false;
            }
        }
    }
    return true; // all celss have values.
}

然后,你可以打电话给:

代码语言:javascript
运行
复制
        //check over checking
        if(isComplete(block)){
                    int ContinueCheck = JOptionPane.showConfirmDialog(null, "Do you want to continue ?", "Continue?", JOptionPane.YES_NO_OPTION);
                    if( ContinueCheck == JOptionPane.YES_OPTION){
                        ...
                        continue;
                    }else if(ContinueCheck == JOptionPane.NO_OPTION) {
                        System.out.println( "-------------------------" );
                        System.out.println("Good Bye !");
                        break;
                    }
        }    

Note

注意,在这一点上,我从来没有引用网格的实际大小为3.?因此,到目前为止,我更改的所有代码都将用于任何大小的网格.

最后的部分,就是得到分数……这个部分有点挑战性,但是,可以用几个循环来完成.首先,int modSumBlock[] = {-1,-1,-1,-1,-1,-1,-1,-1}是另一个“幻数”(8),应该是:

代码语言:javascript
运行
复制
int modSumBlock[] = new int[gridsize + gridsize + 2]; // rows, columns, and diagonals

那么你的循环是:

代码语言:javascript
运行
复制
for (int row = 0; row < gridsize; row++) {
    modSumBlock[       0 + row] = getRowScore(block, row);
}
for (int col = 0; col < gridsize; col++) {
    modSumBlock[gridsize + col] = getColumnScore(block, col);
}
modSumBlock[gridsize + gridsize]     = getSlashDiagonalScore(block);
modSumBlock[gridsize + gridsize + 1] = getBackslashDiagonalScore(block);

此时,你应该对你应该做的其他改变有一些想法.

玩得开心!

票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/36409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档