- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我已经编写了游戏。你轮流与电脑对抗,挑选 1-3 根吸管,游戏的重点是留给对手 1 根吸管。整个部分都有效,但现在我必须对计算机进行编程,以便通过连续播放变得更聪明。
但是,我并不完全确定这是如何完成的。向我解释的方式是你有 4 个“杯子”,我认为它们是数组。每个杯子包含 Action (1, 2, 3)。在计算机回合期间,它随机挑选一个杯子并随机选择三个 Action 之一。如果该 Action 不起作用,则会将其从杯子中移除。
经过几场比赛后,计算机应该变得无与伦比。我将继续努力,但我遇到了很多麻烦。我已经研究了几个小时了,所以我只会发布原始代码,而不包含损坏的部分。
编辑:我在底部添加了 Cup 类。
import java.util.*;
public class Nim
{
public static void main(String[] args)
{
Random r = new Random();
Scanner kb = new Scanner(System.in);
String reply;
int straws, cupNum, prevCupNum, prevComputerMove,
computerMove, humanMove, gameNumber = 0, humanWin = 0;
// create an array of four cups
Cup[] cup = new Cup[4];
for (int i = 0; i < cup.length; i++)
cup[i] = new Cup();
System.out.println("Let's play Nim");
System.out.println();
do
{
gameNumber++;
straws = r.nextInt(11) + 10;
// add 1 if necessary so computer nevers starts in losing config
if (straws%4 == 1)
straws++;
System.out.println("Straws to start = " + straws);
System.out.println();
// set to -1 to indicate just starting so no previous move
prevCupNum = -1; // no prev move so init to -1
prevComputerMove = -1;
do
{
cupNum = straws%4; // get cup number
// if cup is empty, then use 1 for move
if (cup[cupNum].count() == 0) // cup empty then move = 1
computerMove = 1;
else
computerMove = cup[cupNum].select(); // get move from cup
/*MISSING CODE
If cup is cup number 1, then remove the previous move
from the previous cup unless already empty*/
System.out.println
("Computer picks up " + computerMove + " straws");
straws = straws - computerMove;
if (straws < 0)
straws = 0;
System.out.println(straws + " left");
System.out.println();
// save this move so it can be removed later if necessary
prevCupNum = cupNum;
prevComputerMove = computerMove;
if (straws == 0)
{
System.out.println("Wow. You win!");
humanWin++;
/* MISSING CODE
Remove last move computer made from cup*/
}
else // get move from human
{
System.out.println();
do
{
System.out.print("Your move: enter ");
if (straws == 1)
System.out.println("1");
else
if (straws == 2)
System.out.println("1 or 2");
else
if (straws >= 3)
System.out.println("1, 2, or 3");
humanMove = kb.nextInt();
} while
(humanMove > 3 || humanMove < 1 || straws - humanMove < 0);
straws = straws - humanMove;
System.out.println(straws + " left");
if (straws == 0)
{
System.out.println();
System.out.println("Ha, ha. You lose!");
}
}
} while (straws > 0);
System.out.println
("Score: Human " + humanWin + " Computer " +
(gameNumber - humanWin));
if (kb.hasNextLine()) // get rid of stray newline
kb.nextLine();
System.out.println();
System.out.println("Want to play another game? Hit enter.");
System.out.println
("Or are you too CHICKEN? In that case, type in quit.");
reply = kb.nextLine();
reply = reply.trim();
if (reply.length() > 4) // require only 1st 4 to be quit
reply = reply.substring(0, 4);
}
while (!reply.toLowerCase().equals("quit"));
}
public class Cup
{
ArrayList<Integer> c = new ArrayList<Integer>();
public Cup()
{
c.add(1);
c.add(2);
c.add(3);
}
//-----------------------
public int count()
{
return c.size();
}
//-----------------------
public int select()
{
// random is a static method in Math that returns a double
// value greater than or equal to 0.0 and less than 1.0.
int index = (int)(c.size()*Math.random());
return c.get(index);
}
//-----------------------
public void remove(Integer move)
{
c.remove(move);
}
}
最佳答案
恐怕我不明白“杯赛”策略。然而,有一种更简单的策略可以迫使机器通过玩耍来学习。当它播放时,记录它在轮到后留下的吸管数量。如果输了,就确保在接下来的比赛中不会轮流留下那么多稻草。
你的代码看起来像这样:
class AI_Player {
private final Set<Integer> losingMoves = new HashSet<>();
private final Set<Integer> currentGameMoves = new HashSet<>();
public void startGame() {
currentGameMoves.clear();
}
public int nextMove(int strawsRemaining) {
List<Integer> possibleMoves = Stream.of(1, 2, 3)
.filter(move -> move < strawsRemaining)
.filter(move -> !losingMoves.contains(strawsRemaining - move))
.collect(Collectors.toList());
int move = possibleMoves.get(Random.nextInt(possibleMoves.size()));
currentGameMoves.add(strawsRemaining - move);
return move;
}
public void registerLoss() {
losingMoves.addAll(currentGameMoves);
}
public void registerWin() {
losingMoves.removeAll(currentGameMoves);
}
}
这使用 Java 8 流,但如果您还没有使用过它们,转换起来相当简单。
关于java - 捡稻草游戏 : Helping the computer learn from its' mistakes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33662668/
我定义了一个自定义比较器来按长度对我的对象的名称(字符串)变量进行排序。 这是我的 person 类的代码: class MyNameLengthCompare implements Comparat
我的 R 代码是: means_log_adj mistake in factor > (mydata_adj$Response_EP, labels = > c("non-responder",
我有 3 个 Activity A、B 和 C。 对于 A,我调用 B,对于 B,我调用 C。(每次都使用示例按钮)。 我想用 C 的按钮调用 Activity A,所以我这样写: Intent in
Errore query SQL: CREATE TABLE `hospital_jqm`.`users` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KE
我不得不再次沉浸在 C++ COM 编程中,并且忘记了上次的大部分辛苦教训。 (当我认为“再也不会”这个短语可能被错误使用时。) 用C++开发COM最常见的错误和反模式有哪些?我正在使用 Borlan
我用 C 语言编写了这个“mergesort”。我认为在将元素复制回原始数组时存在错误。有人能帮我吗? 非常感谢。 enter code here /************************
我正在使用 Python 实现用于人脸识别的主成分分析,而不使用 中已定义的 PCA 方法numpy 或 OpenCV。但我的结果简直就是垃圾。 我阅读了 OpenCV 的 doc 的文档和算法描述。
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
基本上,我想创建一个程序来查找两个坐标的斜率。我已经做到了,但是我想让程序询问是否要重新启动,例如查找另一个斜率,而无需用户退出并重新打开程序。 这是我的代码,减去所有不必要的位: import ja
所以我知道这是非常具体的,但由于我对网站编程几乎不熟悉,我希望你能帮助我:)我正在尝试将 jekyll-lunr-js-search ( https://github.com/slashdotdash
我理解为什么 Python 在引用实例属性时需要显式 self 限定符。 但我经常忘记它,因为我在 C++ 中不需要它。 我以这种方式引入的错误有时很难发现;例如,假设我写 if x is not N
对于文件: Year Grade 2000 100 2002 95 2001 88 2012 99 2000 66 等等,我创建了一个函数来计算接下来每年的平均成绩。然而,我发现我不是在最
https://projecteuler.net/problem=18 给定一个整数三角形,问题是找到从上到下的最大路径和(其中路径中的所有数字必须相邻)。 我有一个算法的想法:从最顶层开始,计算左右
当通过命令行使用 python 时,如果我在嵌套语句的前一行看到错误,是否有任何方法可以删除或编辑已经输入的该行? 例如: >>> file = open("file1", "w") >>> for
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
免责声明:我是 REST 思想流派的新手,我正在努力理解它。 所以,我正在阅读此页,Common REST Mistakes ,我发现我对与 session 无关的部分感到完全困惑。页面内容如下: T
我正在尝试用 C 语言解决一个简单的问题,如下所示: Any integer P, such that 0 maxDiff) maxIndex = i; } return maxIn
所以我已经编写了游戏。你轮流与电脑对抗,挑选 1-3 根吸管,游戏的重点是留给对手 1 根吸管。整个部分都有效,但现在我必须对计算机进行编程,以便通过连续播放变得更聪明。 但是,我并不完全确定这是如何
我无法为 CALayer 的 initWithLayer:(layer) 选择器找到任何我可以覆盖的等效绑定(bind)方法。 查看 Monotouch 程序集,选择器 initWithLayer 绑
我是一名优秀的程序员,十分优秀!