在本系列中,我将分享我在自我施加的编程挑战方面的进展:用尽可能多的不同编程语言构建 battlesnake。
查看第一篇文章,了解本系列的简短介绍。
您也可以在 github 上关注我的进度。
爪哇
java是企业的语言,很多大型后台系统的业务逻辑都是用它编写的。
我过去编写过很多 java 代码,但 python 和 javascript 已经在我当代的编程活动中占据了一席之地。
因为 java 可以用来编写非常可读和健壮的软件(java ide 往往有很好的重构支持),所以我仍然觉得它是适合某些系统的语言。
与它的前辈相比,java 给开发者带来了很多改进(当然取决于你的口味):自动内存管理、内置集合类型和丰富的标准库。然而,该语言现在已经有 30 多年的历史了,并且有一些明显的时代迹象,例如标准库中不支持 json(但它确实支持 xml ?)。
今天开箱即用的 java 是否仍可用于构建干净简洁的 battlesnake 实现?继续阅读以找出答案。
立即学习“Java免费学习笔记(深入)”;
你好世界设置
这就是 snake.java 的样子:
public class snake { public static void main(string args[]) { system.out.println("hello world!"); } }
这就是 dockerfile 的样子:
from eclipse-temurin:17-jdk run mkdir /app workdir /app copy snake.java . run javac snake.java cmd ["java", "snake"]
这是实际的开发设置:
一个基本的网络服务器
说实话,我不得不在 google 上搜索 java 标准库中基本 web 服务器的可用性。事实证明,(根据包名称)有一个 http 服务器,它可能是标准库中最古老的部分之一:com.sun.net.httpserver.httpserver。
使用服务器实现实际上非常简单,这是我处理 battlesnake 元数据请求的初始代码:
import com.sun.net.httpserver.httpserver; import com.sun.net.httpserver.httphandler; import com.sun.net.httpserver.httpexchange; import java.io.ioexception; import java.io.outputstream; import java.net.inetsocketaddress; public class snake { static class battlesnakehandler implements httphandler { public void handle(httpexchange exchange) throws ioexception { string response = "{"apiversion": "1", " + ""author": "'robvanderleek", "version": "1.0", " + ""color": "#b07219", "head": "safe", " + ""tail": "sharp"}"; exchange.sendresponseheaders(200, response.length()); outputstream os = exchange.getresponsebody(); os.write(response.getbytes()); os.close(); } } public static void main(string args[]) throws ioexception { int port = integer.parseint( system.getenv().getordefault("port", "3000")); httpserver server = httpserver.create(new inetsocketaddress(port), 0); server.createcontext("/", new battlesnakehandler()); server.setexecutor(null); server.start(); system.out.println( string.format("starting battlesnake server on port: %d", port)); } }
游戏逻辑
游戏逻辑代码的一个重要部分是解析传入的 json 数据。标准java库不包含json解析器,典型的解析器库包含数千行代码。
经过大量的修改,我能够解析 battlesnake json,并且只有那个 json。
下面是代码中与 json 解析相关的四个函数(这些函数解析字段、对象和数组):
private string getfield(string json, string name) { string needle = '"' + name + '"'; return json.substring(json.indexof(needle) + needle.length() + 1); } private string getbalanced(string json, string name, char open, char close) { string start = getfield(json, name); int idx = 0, indent = 0; do { if (start.charat(idx) == open) { indent++; } else if (start.charat(idx) == close) { indent--; } idx++; } while (indent > 0); return start.substring(0, idx); } private string getobject(string json, string name) { return getbalanced(json, name, '{', '}'); } private string getarray(string json, string name) { return getbalanced(json, name, '[', ']'); }
游戏逻辑的其余部分非常简单,我使用了一个基本的坐标类以获得更好的可读性和简洁性:
private Coordinate nearestFood(String board, Coordinate head) { String foodJson = getArray(board, "food"); Set<coordinate> food = getCoordinates(foodJson); double distance = Double.MAX_VALUE; int x = 255, y = 255; for (Coordinate f: food) { double d = Math.sqrt(Math.pow(head.x - f.x, 2) + Math.pow(head.y - f.y, 2)); if (d <p>我确信游戏逻辑可以改进,为什么不尝试一下呢? ?</p> <p>这是完整的实际代码:</p> <p><img src="/upload/img/202410/172299026158258.gif" alt="战蛇挑战#Java"></p> <p>c battlesnake 的完整代码可以在 github 上找到。</p> <h2> 感谢反馈! </h2> <p>我希望你喜欢阅读我的编码冒险。</p> <p>请在下面的评论中告诉我您对上面的代码的看法,或者您期待本系列中的哪些编程语言。</p> <p>直到下一种语言!</p> </coordinate>
以上就是战蛇挑战#Java的详细内容,更多请关注php中文网其它相关文章!