我需要帮助将我的代码从 c++ 转换为 java
I need help converting my code from c++ to java
我的任务之一是使用三种不同的方法将一个名为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();
}
}
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++