我需要帮助将我的代码从 c++ 转换为 java

I need help converting my code from c++ to java

本文关键字:c++ 转换 java 代码 我的 帮助      更新时间:2023-10-16

我的任务之一是使用三种不同的方法将一个名为NIM的著名编码游戏从C++转换为Java。我在将其从C++转换为 Java 时遇到问题。谁能帮我解决问题?

这是他们在C++给我的:

#include <iostream.h>
#include <lvprandom.h>
#include <lvpbool.h>
//-----------------------------------------------------------------------------
void UserMove(int &NumStones)
/* Pre: NumStones > 0
Post: User has taken 1, 2, or 3 stones from pile */
{
cout << "How many would you like? ";
int TakeStones;
cin >> TakeStones;
while (TakeStones<1 || TakeStones>3 || TakeStones>NumStones) {
cout << "Value must be between 1 and 3" << endl;
cout << "How many would you like? ";
cin >> TakeStones;
}
NumStones-=TakeStones;
}
//-----------------------------------------------------------------------------
void ComputerMove(int &NumStones)
/* Pre: NumStones > 0
Post: Computer has taken 1, 2, or 3 stones from pile */
{
int TakeStones;
do {
TakeStones=1+random(3);
} while (TakeStones<1 || TakeStones>3 || TakeStones>NumStones);
cout << "The computer takes " << TakeStones << "." << endl;
NumStones-=TakeStones;
}
//-----------------------------------------------------------------------------
void PlayNim(NumStones)
/* Post: A game of Nim played with NumStones stones */
{
while (true) {
if (NumStones>0) {
cout << "There are " << NumStones << " stones. ";
UserMove(NumStones);
}
else {
cout << "You win!";
break; 
}
if (NumStones>0) {
cout << "There are " << NumStones << " stones. ";
ComputerMove(NumStones);
}
else {
cout << "Computer wins!";
break;
}
}
}
//-----------------------------------------------------------------------------
int main()
{
randomize();
int NumStones=15+random(16);
PlayNim(NumStones);
return(0);
} 

这就是我从将其转换为 Java 中得到的:

import java.lang.Math;
import java.util.Scanner;
import java.util.Random;
public class Nim {
public static void Usermove(int numstones) {
Scanner input = new Scanner(System.in);
numstones = 0;
int takestones;
System.out.println("How many would you like: ");
takestones = input.nextInt();
while (takestones > numstones) {
System.out.println("Value must be between 1 and 3");
System.out.println("How many would you like? ");
takestones = input.nextInt();
}
numstones-=takestones;
}
public static void Computermove(int numstones) {
Random rand = new Random();
int takestones;
int random = rand.nextInt(3);
do {
takestones=1 + random;
} while (takestones > numstones);
System.out.println("The computer takes" + takestones + ".");
numstones-=takestones;
}
public static void PlayNim(int numstones) {
while(true){
if (numstones>0) {
System.out.println("There are" + numstones + "stones");
Usermove(numstones);
}
else {
System.out.print("You Win!");
break;
}
if (numstones>0) {
System.out.println("There are" + numstones + "stones");
Computermove(numstones);
break;
}
}
}
public static void main(String[] args) {
Random rand = new Random();
int random = rand.nextInt(16);
int NumStones=15+random;
PlayNim(NumStones);
return(1);
}
}

我看到你的 Java 代码有几个问题。

Java 代码中的UserMove()在输入时设置numstones=0,而C++代码中的UserMove()则不这样做。 您不希望UserMove()在修改输入之前将其清零。

Java 代码中UserMove()while循环与C++代码中UserMove()while循环不匹配。 您没有检查用户的输入以确保它介于 1..3(含 1..3(之间。

Java 代码中ComputerMove()do..while循环与C++代码中ComputerMove()do..while循环不匹配。 C++代码在每次循环迭代时生成一个新的随机数,但 Java 代码在循环之前生成一个随机数,然后在每次迭代中重用它。

但是,最重要的是,在C++代码中,UserMove()ComputerMove()(可能也是PlayNim()(通过引用获取int参数,这允许函数对其参数值所做的任何修改都反映回调用方中的变量。 但是,在 Java 代码中,相同的函数改为按值获取int参数,因此对其参数值所做的任何修改都不会反映回调用方。

Java 不支持按引用传递语义,因此您必须稍微重写一下逻辑。 有几种方法可以做到这一点。

您可以将int包装在可变类包装器中,例如 Java 的AtomicInteger或 Apache 的MutableInt,并传递该类的实例,例如:

import java.lang.Math;
import java.util.Scanner;
import java.util.Random;
import org.apache.commons.lang3.mutable;
public class Nim {
public static void Usermove(MutableInt numstones) {
Scanner input = new Scanner(System.in);
int takestones;
System.out.println("How many would you like: ");
takestones = input.nextInt();
while ((TakeStones < 1) || (TakeStones > 3) || (TakeStones > NumStones)) {
System.out.println("Value must be between 1 and 3");
System.out.println("How many would you like? ");
takestones = input.nextInt();
}
numstones.subtract(takestones);
}
public static void Computermove(MutableInt numstones) {
Random rand = new Random();
int takestones;
do {
takestones = 1 + rand.nextInt(3);
}
while ((TakeStones < 1) || (TakeStones > 3) || (TakeStones > NumStones));
System.out.println("The computer takes " + Integer.toString(takestones) + ".");
numstones.subtract(takestones);
}
public static void PlayNim(MutableInt numstones) {
while (true) {
if (numstones.intValue() > 0) {
System.out.println("There are " + numstones.toString() + " stones");
Usermove(numstones);
}
else {
System.out.print("You Win!");
break;
}
if (numstones.intValue() > 0) {
System.out.println("There are " + numstones.toString() + " stones");
Computermove(numstones);
break;
}
}
}
public static void main(String[] args) {
Random rand = new Random();
MutableInt NumStones = new MutableInt(15 + rand.nextInt(16));
PlayNim(NumStones);
}
}

您可以使用返回值而不是按引用传递参数,例如:

import java.lang.Math;
import java.util.Scanner;
import java.util.Random;
public class Nim {
public static int Usermove(int numstones) {
Scanner input = new Scanner(System.in);
int takestones;
System.out.println("How many would you like: ");
takestones = input.nextInt();
while ((TakeStones < 1) || (TakeStones > 3) || (TakeStones > NumStones)) {
System.out.println("Value must be between 1 and 3");
System.out.println("How many would you like? ");
takestones = input.nextInt();
}
return numstones - takestones;
}
public static int Computermove(int numstones) {
Random rand = new Random();
int takestones;
do {
takestones = 1 + rand.nextInt(3);
}
while ((TakeStones < 1) || (TakeStones > 3) || (TakeStones > NumStones));
System.out.println("The computer takes " + takestones + ".");
return numstones - takestones;
}
public static int PlayNim(int numstones) {
while (true) {
if (numstones > 0) {
System.out.println("There are " + Integer.toString(numstones) + " stones");
numstones = Usermove(numstones);
}
else {
System.out.print("You Win!");
break;
}
if (numstones > 0) {
System.out.println("There are " + Integer.toString(numstones) + " stones");
numstones = Computermove(numstones);
break;
}
}
}
public static void main(String[] args) {
Random rand = new Random();
int NumStones = 15 + rand.nextInt(16);
PlayNim(NumStones);
}
}

您可以将int移动到Nim类本身,并从类方法中删除static,例如:

import java.lang.Math;
import java.util.Scanner;
import java.util.Random;
public class Nim {
int numstones;
Random rand;
public Nim() {
rand = new Random();
numstones = 15 + rand.nextInt(16);
}
public void Usermove() {
Scanner input = new Scanner(System.in);
int takestones;
System.out.println("How many would you like: ");
takestones = input.nextInt();
while ((TakeStones < 1) || (TakeStones > 3) || (TakeStones > NumStones)) {
System.out.println("Value must be between 1 and 3");
System.out.println("How many would you like? ");
takestones = input.nextInt();
}
numstones -= takestones;
}
public void Computermove() {
int takestones;
do {
takestones = 1 + rand.nextInt(3);
}
while ((TakeStones < 1) || (TakeStones > 3) || (TakeStones > NumStones));
System.out.println("The computer takes " + Integer.toString(takestones) + ".");
numstones -= takestones;
}
public void PlayNim() {
while (true) {
if (numstones > 0) {
System.out.println("There are " + Integer.toString(numstones) + " stones");
Usermove();
}
else {
System.out.print("You Win!");
break;
}
if (numstones > 0) {
System.out.println("There are " + Integer.toString(numstones) + " stones");
Computermove();
break;
}
}
}
public static void main(String[] args) {
Nim game = new Nim();
game.PlayNim();
}
}