哪个游戏盒子里有JAVA_关于点和盒子游戏的Java minimax

哪个游戏盒子里有JAVA_关于点和盒子游戏的Java minimax我想建议您完全重新考虑代码.查看代码的问题(以及为什么这里没有很多响应)是很难遵循并且很难调试.例如,什么是gs.getRemainingLines,它究竟做了什么?(为什么剩下的线而不是所有合法的线?)但是,通过一些简化,可以更容易地弄清楚发生了什么并修复它.在抽象层面,minimax只是这个过程:floatminimax_max(GameStateg){if(gisterminal…

大家好,又见面了,我是你们的朋友全栈君。

我想建议您完全重新考虑代码.查看代码的问题(以及为什么这里没有很多响应)是很难遵循并且很难调试.例如,什么是gs.getRemainingLines,它究竟做了什么? (为什么剩下的线而不是所有合法的线?)

但是,通过一些简化,可以更容易地弄清楚发生了什么并修复它.

在抽象层面,minimax只是这个过程:

float minimax_max(GameState g)

{

if (g is terminal or max depth reached)

return eval(g);

float bestVal = -inf;

bestMove = null;

moves = g->getLegalMoves();

for (m : moves)

{

ApplyMove(m);

if (g->nextPlayer == maxPlayer)

nextVal = minimax_max(g);

else

nextVal = minimax_min(g);

if (nextVal > bestVal)

{

bestVal = nextVal;

bestMove = m;

}

UndoMove(m);

}

return bestVal;

}

我没有详细说明如何在最后获得/使用最后一步,但并不是那么难.您还需要minimax_min的另一个过程,或者您可以在代码中放入if语句.

如果你看一下你的代码,你已经把它写得很接近了,但你在代码中留下了很多游戏特定的细节.但是,您不必考虑那些让minimax正常工作的事情.

特别是,如果为GetMoves(),ApplyMove(),UndoMove()和eval()提供函数来评估状态,大多数游戏都可以抽象地进行推理. (进一步的搜索增强功能需要更多功能,但这会让你有很长的路要走.)

您可能希望以这种方式重新考虑因素的一些原因:

>您现在可以单独测试minimax和其他代码.

>您可以通过验证所有合法移动是否已生成来测试您的点和框代码,并且在应用移动后您将拥有合法状态,并且接下来会移动正确的玩家. (您可以播放和撤消长时间的随机移动序列,以帮助验证您之后总是回到开始状态.)

>您可以在各个州轻松测试评估功能,以确保其正常工作. (实际上,你通常不能搜索游戏结束来确定获胜者.)

>您可以使用简单的评估函数测试minimax并测试以查看是否进行了正确的移动. (例如,如果您喜欢在边缘上移动,则单层搜索应返回边缘上的移动)

>其他人可以更轻松地阅读您的代码.我们可以查看每段代码并查看它是否正确,而不必将特定于游戏的实现细节混合到minimax特定的细节中.

>如果您可以正确应用和撤消移动,则无需复制游戏状态.这将使代码更有效.

虽然您可以尝试修复代码而不进行重构(例如,只需找到它返回null的第一个位置,并指出错误的位置),但从长远来看,如果没有这些更改,您的代码将难以调试和改进.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156385.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Lucene教程具体解释

    Lucene教程具体解释

    2021年12月6日
    38
  • 一篇文章搞定java中的垃圾回收机制面试题[通俗易懂]

    一篇文章搞定java中的垃圾回收机制面试题[通俗易懂]  一篇文章搞定java中的垃圾回收机制面试题任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新的对象使用。对于对象内存的释放就是垃圾回收机制,也叫做gc,对于java开发者来说gc是一个双刃剑我们这里找了两张搞笑图片分别来表示c语言的垃圾回收和java的垃圾回收。注意:并…

    2022年5月27日
    41
  • springboot启动报错Logbook

    springboot启动报错Logbookspringboot 启动报错 2018 11 1701 09 15 214WARN944 main ationConfigE Exceptionenc cancellingre org sp

    2025年6月1日
    3
  • volatile关键字作用与内存可见性、指令重排序概述[JAVA]「建议收藏」

    volatile关键字作用与内存可见性、指令重排序概述[JAVA]「建议收藏」在理解volotile关键字的作用之前,先粗略解释下内存可见性与指令重排序。1.内存可见性Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存,并且线程只能访问自己的工作内存,不可以访问其它线程的工作内存。工作内存中保存了主内存中共享变量的副本,线程要操作这些共享变量,只能通过操作工作内存中的副本来实现,操作完毕之后再同步回到主内存当中,其JVM内存模型大

    2022年5月31日
    34
  • MATLAB中plot函数_getline函数用法

    MATLAB中plot函数_getline函数用法本文接下来要讲解一下Matlab中最基本的Plot的用法Plot的定义和用法此MATLAB函数创建Y中数据对X中对应值的二维线图。如果X和Y都是向量,则它们的长度必须相同。plot函数绘制Y对X的图。如果X和Y均为矩阵,则它们的大小必须相同。plot函数绘制Y的列对X的列的图。如果X或Y中的一个是向量而另一个是矩阵,则矩阵的各维中…

    2022年10月16日
    1
  • AutoEventWireup属性的确切含义

    AutoEventWireup属性的确切含义使用Asp.NET时,新建的aspx页面第一行page指令中包含了一个AutoEventWireup属性。网上的很多教程认为这一属性,甚至这一行代码都是没用的。其实,这是不了解Asp.NET事件处理模型的表现。简单来说,这一属性决定了当前页是否自动关联某些特殊事件。    首先,从浏览器页面触发的事件不能立刻在本地得到处理,而是POST至服务器上,因此,Asp.NET建立了委托(代理)机制

    2022年5月28日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号