Java 一个简单游戏的面向对象方法

Java 一个简单游戏的面向对象方法,java,Java,我正在制作这个游戏的简化版本。问题是,你可以拥有一台聪明或愚蠢的计算机,但我决定暂时排除这一功能,并决定只使用一台随机挑选大量对象的计算机。我早些时候发布了一个问题,并着手解决。() 所以最初我只设计了一个类。但是现在我已经设计了3个类,如问题所述。我有一个桩类,一个玩家类和一个游戏类(也是我的主要类) 到目前为止,我已经对桩和玩家类进行了编码。我也开始编写游戏类,但是我现在被卡住了,因为我不知道如何使游戏类与玩家和堆类交互。我基本上是先确定轮到谁,然后旋转轮次,直到一堆对象完成并宣布获胜……我

我正在制作这个游戏的简化版本。问题是,你可以拥有一台聪明或愚蠢的计算机,但我决定暂时排除这一功能,并决定只使用一台随机挑选大量对象的计算机。我早些时候发布了一个问题,并着手解决。()

所以最初我只设计了一个类。但是现在我已经设计了3个类,如问题所述。我有一个桩类,一个玩家类和一个游戏类(也是我的主要类)

到目前为止,我已经对桩和玩家类进行了编码。我也开始编写游戏类,但是我现在被卡住了,因为我不知道如何使游戏类与玩家和堆类交互。我基本上是先确定轮到谁,然后旋转轮次,直到一堆对象完成并宣布获胜……我不知道如何使不同的类相互交互。因此,如果有人能进一步指导我,帮助我完成这个简单的游戏,我将不胜感激

如果我问了一个糟糕的问题,我真诚地道歉。这是我用java编写的第一个这样的程序,它处理多个类,所以有点混乱。我不想任何人写代码,但即使提到或告诉我,我应该使某某方法等将是伟大的

这是我到目前为止的代码

桩类

package Nim;

import java.util.Random;

public class Pile {

    private int initialSize;

    public Pile() {

    }

    Random rand = new Random();

    public void setPile() {

        initialSize = (rand.nextInt(100 - 10) + 10);
    }

    public void reducePile(int x) {

        initialSize = initialSize - x;

    }

    public int getPile() {

        return initialSize;
    }

    public boolean hasStick() {

        if (initialSize > 0) {

            return true;
        }

        else {
            return false;
        }
    }

}
package Nim;

import java.util.Scanner;
import java.util.Random;

public class Player {

    public static final int HUMAN = 0;
    public static final int COMPUTER = 1;
    private int type;

    public Player(int theType) {

        type = theType;

    }

    Scanner in = new Scanner(System.in);

    // n is number of marbles left in the pile

    public int makeMove(int n) {

        int max = n / 2;
        int grab;

        if (type == HUMAN) {

            System.out.println("There are " + n
                    + " marbles in total. However you can only"
                    + "grab no more than " + max + " marbles");
            System.out.println("Please Enter the number of marbles to grab: ");
            grab = in.nextInt();

            while (grab > max || grab < 0) {

                System.out.println("You have entered a illelgal value. Please enter a legal value: ");
                grab = in.nextInt();

            }

            return grab;

        }

        else {
            Random rand = new Random();

            grab = (rand.nextInt(n / 2 - 1) + 1);

            System.out.println("Computer has grabbed: " + grab + " marbles");

            return grab;

        }
    }

    public void updateTurn(int n) {

        type = n;

    }

}
玩家等级

package Nim;

import java.util.Random;

public class Pile {

    private int initialSize;

    public Pile() {

    }

    Random rand = new Random();

    public void setPile() {

        initialSize = (rand.nextInt(100 - 10) + 10);
    }

    public void reducePile(int x) {

        initialSize = initialSize - x;

    }

    public int getPile() {

        return initialSize;
    }

    public boolean hasStick() {

        if (initialSize > 0) {

            return true;
        }

        else {
            return false;
        }
    }

}
package Nim;

import java.util.Scanner;
import java.util.Random;

public class Player {

    public static final int HUMAN = 0;
    public static final int COMPUTER = 1;
    private int type;

    public Player(int theType) {

        type = theType;

    }

    Scanner in = new Scanner(System.in);

    // n is number of marbles left in the pile

    public int makeMove(int n) {

        int max = n / 2;
        int grab;

        if (type == HUMAN) {

            System.out.println("There are " + n
                    + " marbles in total. However you can only"
                    + "grab no more than " + max + " marbles");
            System.out.println("Please Enter the number of marbles to grab: ");
            grab = in.nextInt();

            while (grab > max || grab < 0) {

                System.out.println("You have entered a illelgal value. Please enter a legal value: ");
                grab = in.nextInt();

            }

            return grab;

        }

        else {
            Random rand = new Random();

            grab = (rand.nextInt(n / 2 - 1) + 1);

            System.out.println("Computer has grabbed: " + grab + " marbles");

            return grab;

        }
    }

    public void updateTurn(int n) {

        type = n;

    }

}

所以我要退一步,看看你们的类图

您有三个类:桩、玩家和游戏。桩可以表示中心的桩。游戏可以是管理一切的主要方法的类。球员呢?好吧,因为您有一个用于所有三种(或两种)可能状态(人类、哑和智能)的Player类,所以它应该很容易实现

让我们从游戏开始。它需要包含两个Player实例(human和computer)和一个Pile实例。它还需要一个循环,直到游戏结束。因此,让我们开始提出一个基本的实现:

从桩开始:

private int size;

public Pile(int newSize) {
    size = newSize;
}

public boolean takeMarbles(int amount) {
    size -= amount;
    if (size < 1)
        return false;
    return true;
}
这两个静态场可能看起来有点不合适,但它会在一秒钟内结合在一起。关于游戏类:

Pile pile = new Pile(size);
Player human = new Player(Player.HUMAN);
Player computer = new Player(Player.COMPUTER);
现在我们有了一堆一定大小的棋子,还有两个不同类型的棋手。这就是我们使用这些类的方式

现在我们需要让主游戏循环工作。基本上,只需向播放器添加一个
update()
方法,该方法取决于播放器的类型(即如果播放器提示输入,随机决定计算机是否输入)。update方法应该返回要获取的大理石数量。然后在游戏的主方法中创建一个循环。循环将反复调用播放器和计算机的更新,直到有人丢失(
takeMarbles
返回false)。然后它将跳出循环并打印输出


这是基本的想法,祝你好运,请随时提问

你为什么用两倍行距写代码?对不起,我的习惯不好。我仍在学习我们称之为“良好编码实践”的过程中,因此我为任何此类错误道歉@JonathonReinhart如果您能提出建议,我将不胜感激,因为我可以看到您经验丰富的开发人员。我建议您确保您的代码格式正确。不要把它隔开两倍,让你所有的缩进和换行保持一致。格式很好!另外,我现在正在撰写一个答案,来这里寻求真正帮助的人是应该得到答案的人:)我一直很感谢您的评论,这将帮助我成为一个更好的开发人员:)嘿,感谢您的澄清,我正在尝试吸收您的答案并完成我的编码。所以从我所看到的来看,我的pile和player类似乎有正确的方法,我现在必须在game类中创建一个更新方法,在两个玩家之间交替轮换,并接受他们的输入,直到pile为空。我可能有一两个问题,所以当我陷入困境时我会问你。谢谢again@user2733436放心吧,很高兴我能帮上忙!很高兴看到那些没有发布“给我代码pls”问题的人,他们真的很感兴趣,也很有动力:)嘿,我刚刚有一个关于玩家类更新方法的问题。所以在我的例子中,我从掷硬币开始,说计算机赢得了掷硬币,我必须使用更新方法将类型设置为计算机,对吗?是的,你有两个玩家对象,对吗?你必须按顺序去做。。。可以根据顺序将它们放入数组中,也可以在循环中使用if语句。你不需要一个完全不同的方法。嗨,我让玩家交替轮换,但当对象小于n时,我似乎有一个问题,它会抛出一个异常。我大概95%接近终点线了。有没有可能让我向你展示我目前得到的代码?所以你可以指引我