Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -452,3 +452,9 @@ screenlog.*

node_modules
/dist


####################
## Intellij Idea ##
####################
.idea/
1 change: 1 addition & 0 deletions airesources/Kotlin/LANGUAGE
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Kotlin
140 changes: 140 additions & 0 deletions airesources/Kotlin/Model.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
import java.util.*

class Networking {

val SIZE_OF_INTEGER_PREFIX = 4
val CHAR_SIZE = 1
var width : Int = 0
var height : Int = 0

val productions : MutableList<MutableList<Int>> = arrayListOf()

fun deserializeGameMapSize(inputString: String) {
inputString.split(" ")
.map { Integer.parseInt(it) }
.forEachIndexed { index, size ->
if (index == 0) width = size else height = size}
}

fun deserializeProductions(input: String) {
val inputs = input.split(" ").map { Integer.parseInt(it) }
(0 until height).mapTo(productions) { inputs.subList(it * width, (it + 1) * width).toMutableList() }
}

fun serializeMoveList(moves: ArrayList<Move>): String {
val builder = StringBuilder()
for ((loc, dir) in moves) builder.append(loc.x.toString() + " " + loc.y + " " + dir.ordinal + " ")
return builder.toString()
}

fun deserializeGameMap(input: String): GameMap {
val inputs = input.split(" ").map { Integer.parseInt(it) }

val map = GameMap(width, height)

var y = 0
var x = 0
var currentIndex = 0
while (y < map.height) {
val counter = inputs[currentIndex++]
val owner = inputs[currentIndex++]
(0 until counter).forEach {
map.contents[y][x].owner = owner
++x
if (x == map.width) {
x = 0
++y
}
}
}

for (x in 0 until map.contents.size) {
for (y in 0 until map.contents[x].size) {
map.contents[x][y].strength = inputs[currentIndex++]
map.contents[x][y].production = productions[x][y]
}
}

return map
}

fun sendString(sendString: String) {
println(sendString)
System.out.flush()
}

fun getInit(): InitPackage {
val myID = Integer.parseInt(readLine()?.trim())
deserializeGameMapSize(readLine()!!.trim())
deserializeProductions(readLine()!!.trim())
val map = deserializeGameMap(readLine()!!.trim())

return InitPackage(myID, map)
}

fun sendInit(name: String) {
sendString(name)
}

fun getFrame(): GameMap {
return deserializeGameMap(readLine()!!.trim())
}

fun sendFrame(moves: ArrayList<Move>) {
sendString(serializeMoveList(moves))
}
}

data class Site(var owner: Int, var strength : Int, var production: Int)
data class Location(var x: Int, var y: Int)
data class InitPackage(var myID: Int, var map: GameMap)
data class Move(var loc: Location, var dir: Direction)

enum class Direction {
STILL, NORTH, EAST, SOUTH, WEST;

companion object {
val DIRECTIONS = arrayOf(STILL, NORTH, EAST, SOUTH, WEST)
val CARDINALS = arrayOf(NORTH, EAST, SOUTH, WEST)

fun random() : Direction {
return DIRECTIONS[Random().nextInt(DIRECTIONS.size)]
}
}
}

class GameMap(val width: Int, val height: Int) {

val contents : MutableList<MutableList<Site>> = arrayListOf()

init {
(0 until height).forEach {
contents.add(Array(width, {Site(0, 0, 0)}).toMutableList())
}
}

fun inBounds(location: Location) : Boolean {
return location.x < width && location.x >= 0 && location.y < height && location.y >= 0
}

fun getLocation(loc: Location, dir: Direction): Location {
val l = loc.copy()
when(dir) {
Direction.STILL -> return l
Direction.NORTH -> if (l.y == 0) l.y = height - 1 else l.y--
Direction.EAST -> if (l.x == width - 1) l.x = 0 else l.x++
Direction.SOUTH -> if (l.y == height - 1) l.y = 0 else l.y++
Direction.WEST -> if (l.x == 0) l.x = width - 1 else l.x--
}
return l
}

fun getSite(loc: Location, dir: Direction): Site {
val (x, y) = getLocation(loc, dir)
return contents[y][x]
}

fun getSite(loc: Location): Site {
return contents[loc.y][loc.x]
}
}
34 changes: 34 additions & 0 deletions airesources/Kotlin/MyBot.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import java.util.*

fun main(args : Array<String>) {
MyBot().start()
}

class MyBot {

fun start() {
val network = Networking()
val iPackage = network.getInit()
val myID = iPackage.myID
var gameMap = iPackage.map

network.sendInit("MyKotlinBot")

while (true) {
val moves = ArrayList<Move>()

gameMap = network.getFrame()

for (y in 0..gameMap.height - 1) {
for (x in 0..gameMap.width - 1) {
val site = gameMap.getSite(Location(x, y))
if (site.owner == myID) {
val dir = Direction.random()
moves.add(Move(Location(x, y), dir))
}
}
}
network.sendFrame(moves)
}
}
}
34 changes: 34 additions & 0 deletions airesources/Kotlin/RandomBot.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import java.util.*

fun main(args : Array<String>) {
RandomBot().start()
}

class RandomBot {

fun start() {
val network = Networking()
val iPackage = network.getInit()
val myID = iPackage.myID
var gameMap = iPackage.map

network.sendInit("RandomKotlinBot")

while (true) {
val moves = ArrayList<Move>()

gameMap = network.getFrame()

for (y in 0..gameMap.height - 1) {
for (x in 0..gameMap.width - 1) {
val site = gameMap.getSite(Location(x, y))
if (site.owner == myID) {
val dir = Direction.random()
moves.add(Move(Location(x, y), dir))
}
}
}
network.sendFrame(moves)
}
}
}
3 changes: 3 additions & 0 deletions airesources/Kotlin/runGame.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
kotlinc.bat *.kt -d mybot.jar
kotlinc.bat *.kt -d randombot.jar
.\halite.exe -d "30 30" "kotlin -classpath mybot.jar MyBotKt" "kotlin -classpath randombot.jar RandomBotKt"
5 changes: 5 additions & 0 deletions airesources/Kotlin/runGame.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/bash

kotlinc *.kt -d mybot.jar
kotlinc *.kt -d randombot.jar
./halite -d "30 30" "kotlin -classpath mybot.jar MyBotKt" "kotlin -classpath randombot.jar RandomBotKt"
5 changes: 5 additions & 0 deletions airesources/Kotlin/runGameExecutable.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
kotlinc.bat *.kt -include-runtime -d mybot.jar
jar ufe mybot.jar MyBotKt
kotlinc.bat *.kt -include-runtime -d randombot.jar
jar ufe randombot.jar RandomBotKt
.\halite.exe -d "30 30" "java -jar mybot.jar" "java -jar randombot.jar"
7 changes: 7 additions & 0 deletions airesources/Kotlin/runGameExecutable.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash

kotlinc *.kt -include-runtime -d mybot.jar
jar ufe mybot.jar MyBotKt
kotlinc *.kt -include-runtime -d randombot.jar
jar ufe randombot.jar RandomBotKt
./halite -d "30 30" "java -jar mybot.jar" "java -jar randombot.jar"
5 changes: 4 additions & 1 deletion website/archiveStarterPackages.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ mkdir Halite-Python-Starter-Package \
Halite-JavaScript-Starter-Package \
Halite-OCaml-Starter-Package \
Halite-Clojure-Starter-Package \
Halite-C-Starter-Package
Halite-C-Starter-Package \
Halite-Kotlin-Starter-Package

cp -r Python/* Halite-Python-Starter-Package/
cp -r Java/* Halite-Java-Starter-Package/
Expand All @@ -31,6 +32,7 @@ cp -r JavaScript/* Halite-JavaScript-Starter-Package/
cp -r OCaml/* Halite-OCaml-Starter-Package/
cp -r Clojure/* Halite-Clojure-Starter-Package/
cp -r C/* Halite-C-Starter-Package/
cp -r Kotlin/* Halite-Kotlin-Starter-Package/

cp -r Scala/* Halite-Scala-Starter-Package/
rm Halite-Scala-Starter-Package/MyBot.java
Expand All @@ -48,6 +50,7 @@ zip -r Halite-JavaScript-Starter-Package.zip Halite-JavaScript-Starter-Package/
zip -r Halite-OCaml-Starter-Package.zip Halite-OCaml-Starter-Package/
zip -r Halite-Clojure-Starter-Package.zip Halite-Clojure-Starter-Package/
zip -r Halite-C-Starter-Package.zip Halite-C-Starter-Package/
zip -r Halite-Kotlin-Starter-Package.zip Halite-Kotlin-Starter-Package/

mkdir -p ../website/downloads/starterpackages
mv *.zip ../website/downloads/starterpackages
Expand Down
1 change: 1 addition & 0 deletions website/downloads.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
<li><a href="downloads/starterpackages/Halite-OCaml-Starter-Package.zip">OCaml 4.01.0</a></li>
<li><a href="downloads/starterpackages/Halite-Clojure-Starter-Package.zip">Clojure 1.8.0</a></li>
<li><a href="downloads/starterpackages/Halite-C-Starter-Package.zip">C</a></li>
<li><a href="downloads/starterpackages/Halite-Kotlin-Starter-Package.zip">Kotlin</a></li>
</ul>
</p>

Expand Down