在本系列中,我將分享我在自我施加的編程挑戰方面的進展:用盡可能多的不同編程語言構建 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="https://img.php.cn/upload/article/000/465/014/172299026158258.gif" alt="戰蛇挑戰#Java"></p> <p>c battlesnake 的完整代碼可以在 github 上找到。</p> <h2> 感謝反饋! </h2> <p>我希望你喜歡閱讀我的編碼冒險。</p> <p>請在下面的評論中告訴我您對上面的代碼的看法,或者您期待本系列中的哪些編程語言。</p> <p>直到下一種語言!</p> </coordinate>
以上就是戰蛇挑戰#Java的詳細內容,更多請關注愛掏網 - it200.com其它相關文章!