Skip to content

Commit

Permalink
Обновление в понедельник
Browse files Browse the repository at this point in the history
  • Loading branch information
Kislenko Maksim committed Jul 22, 2019
1 parent 4cfe8b6 commit 1d05602
Show file tree
Hide file tree
Showing 11 changed files with 135 additions and 93 deletions.
33 changes: 13 additions & 20 deletions paperio/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,16 @@

Решения можно присылать на любом языке программирования из списка поддерживаемых:

* C# .zip,.cs
* C++11 .zip,.h,.cpp
* C++14 .zip,.h,.hpp,.cpp
* C++17 .zip,.h,.hpp,.cpp
* Elixir .zip,.ex
* Go .zip,.go
* Haskell .zip,.hs
* Java1.8 .zip,.java
* Java1.9 .zip, .java
* Kotlin .zip,.kt
* Node JS .zip,.js
* PHP7 .zip,.php
* Python 2.7 .zip,.py
* Python 3.6 .zip,.py
* Rust .zip,.rs
* Scala .zip,.scala
* Swift .zip, .swift
* C++11 / .zip, .h, .cpp
* C++17 / .zip, .h, .hpp, .cpp
* C# / .zip, .cs
* Java1.9 / .zip, .java
* Go / .zip, .go
* Python 2.7 / .zip, .py
* Python 3.6 / .zip, .py
* PHP7 / .zip, .php
* Node JS / .zip, .js
* Swift / .zip, .swift

Детальные инструкции по созданию своего решения, формату входных и выходных данных, сопутствующих пакетах и библиотеках можно прочитать в [разделе 2](#2-создание-решения). После того как решение было загружено и обработано, его результат можно посмотреть в визуализаторе на сайте. Попутно будут выводиться отладочный вывод и случившиеся ошибки.

Expand Down Expand Up @@ -62,9 +55,9 @@

1. **Игрок** - двигающийся квадрат, который управляется **ботом** участника. Положение квадрата на карте определяется координатами его центра (x, y). Скорость квадрата задается параметром SPEED и может быть на время изменена, путем взятия бонуса.

2. **Территория** - захваченная ботом область карты, на которой бот находится в относительной безопасности. Территория может состоять из нескольких несвязанных частей. Так может получиться, например, из-за действий противников.
2. **Территория** - захваченная ботом область карты, на которой бот находиться в относительной безопасности. Территория может состоять из нескольких несвязанных частей. Так может получиться, например, из-за действий противников.

This comment has been minimized.

Copy link
@kireevmp

kireevmp Jul 23, 2019

Прошу прощения, однако русский язык здесь незаслуженно пострадал.
Бот находится (что делает?) - без мягкого знака.


3. **Шлейф** - пройденный игроком путь, вне своей территории. При возвращении игрока на свою территорию, все клетки между шлейфом и территорией, добавляются к территории игрока. При пересечении шлейфа другими игроками или при самопересечении своего шлейфа, игрок выбывает из игры, а захваченная им территория становится нейтральной.
3. **Шлейф** - пройденный игроком путь, вне своей территории. При возвращении игрока на свою территорию, все клетки между шлейфом и территорией, добавляются к территории игрока. При пересечении шлейфа другими игроками или при самопересечении своего шлейфа, игрок выбывает из игры, а захваченная им территория становиться нейтральной.

This comment has been minimized.

Copy link
@kireevmp

kireevmp Jul 23, 2019

То же исправление, что и на строке 58:
Территория (что делает?) становится - без мягкого знака.


4. **Бонус** - в игре имеется 3 вида бонусов - **Ускорение**, **Замедление** и **Пила**:
* **Ускорение** - увеличивает скорость игрока на несколько клеток. Количество клеток может быть любым, в диапазоне от 10 до 50;
Expand Down Expand Up @@ -102,7 +95,6 @@
* При столкновении с другим игроком, проигрывает тот игрок, чей шлейф длиннее, при совпадении длины шлейфа, проигрывают оба игрока;
* При пересечении границ карты;
* При захвате противниками всей вашей территории;
* При попадании лучом в игрока

Побеждает игрок, набравший наибольшее количество очков.

Expand Down Expand Up @@ -157,6 +149,7 @@ while True:
* `territory` — массив координат клеток, принадлежащих территории игрока
* `position` — текущее положение игрока
* `lines` — массив координат клеток шлейфа
* `direction` — направление движения игрока ("left", "right", "up", "down")

This comment has been minimized.

Copy link
@NetLagina

NetLagina Jul 23, 2019

Contributor

или null на первом ходе!

* `bonuses` — массив активных бонусов игрока
* `type` — тип бонуса ('n' - Ускорение (Нитро), 's' - Замедление, 'saw' - Пила)
* `ticks` — сколько еще клеток будет активен бонус
Expand Down
2 changes: 1 addition & 1 deletion paperio/dockers/scala/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM stor.highloadcup.ru/aicups/paperio_base
FROM stest.tech-mail.ru/aicups/paperio_base
MAINTAINER Konstantin Aristov <[email protected]>

WORKDIR /opt/client
Expand Down
2 changes: 1 addition & 1 deletion paperio/examples/java9_strategy.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public static void main(String args[]) {
String[] commands = {"left", "right", "up", "down"};
Scanner scanner = new Scanner(System.in);
while (true) {
String input = scanner.next();
String input = scanner.nextLine();
String command = Main.getRandom(commands);
System.out.printf("{\"command\": \"%s\"}\n", command);
}
Expand Down
2 changes: 1 addition & 1 deletion paperio/examples/java_strategy.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public static void main(String args[]) {
String[] commands = {"left", "right", "up", "down"};
Scanner scanner = new Scanner(System.in);
while (true) {
String input = scanner.next();
String input = scanner.nextLine();
String command = Main.getRandom(commands);
System.out.printf("{\"command\": \"%s\"}\n", command);
}
Expand Down
2 changes: 1 addition & 1 deletion paperio/local_runner/game_objects/bonuses.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def generate_coordinates(players, busy_points):
return x, y

def draw(self):
draw_square_with_image((self.x, self.y), self.color, self.image_path, self.active_ticks)
draw_square_with_image((self.x, self.y), self.color, self.image_path)

def is_ate(self, player, captured):
return (self.x, self.y) == (player.x, player.y) or (self.x, self.y) in captured
Expand Down
64 changes: 45 additions & 19 deletions paperio/local_runner/game_objects/game.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import os
import asyncio
import json
import copy
import gzip
import random

Expand Down Expand Up @@ -161,7 +163,6 @@ async def game_loop_wrapper(self, *args, **kwargs):
self.send_game_start()
while True:
is_game_over = await self.game_loop(*args, **kwargs)
print('tick: {}'.format(self.tick))
if is_game_over or self.tick >= MAX_TICK_COUNT:
self.send_game_end()
self.game_save()
Expand All @@ -178,14 +179,28 @@ def get_players_states(self, player=None):
def get_bonuses_states(self):
return [b.get_state() for b in self.bonuses]

def collision_resolution(self, players_to_captured):
res = {p: copy.copy(c) for p, c in players_to_captured.items()}
for p1, captured1 in players_to_captured.items():
for p2, captured2 in players_to_captured.items():
if p1 != p2:
res[p1].difference_update(captured2)
return res

async def get_command_wrapper(self, player):
command = await player.get_command(self.tick)
if command:
player.change_direction(command)

async def game_loop(self, *args, **kwargs):
self.send_game_tick()

futures = []
for player in self.players:
if (player.x - round(WIDTH / 2)) % WIDTH == 0 and (player.y - round(WIDTH / 2)) % WIDTH == 0:
command = await player.get_command(self.tick)
if command:
player.change_direction(command)
futures.append(asyncio.ensure_future(self.get_command_wrapper(player)))
if futures:
await asyncio.wait(futures)

for player in self.players:
player.move()
Expand All @@ -195,17 +210,25 @@ async def game_loop(self, *args, **kwargs):
if is_loss:
self.losers.append(self.players[index])

players_to_captured = {}
for player in self.players:
player.remove_saw_bonus()

if (player.x - round(WIDTH / 2)) % WIDTH == 0 and (player.y - round(WIDTH / 2)) % WIDTH == 0:
player.update_lines()

captured = player.territory.capture(player.lines)
players_to_captured[player] = captured
if len(captured) > 0:
player.lines.clear()
player.score += NEUTRAL_TERRITORY_SCORE * len(captured)


players_to_captured = self.collision_resolution(players_to_captured)
for player in self.players:
if (player.x - round(WIDTH / 2)) % WIDTH == 0 and (player.y - round(WIDTH / 2)) % WIDTH == 0:
captured = players_to_captured.get(player, set())

player.tick_action()

for bonus in self.bonuses[:]:
Expand Down Expand Up @@ -237,10 +260,12 @@ async def game_loop(self, *args, **kwargs):
'points': removed,
'killed': False
})
for p in self.players:
if p != player:
removed = p.territory.remove_points(captured)
player.score += (ENEMY_TERRITORY_SCORE - NEUTRAL_TERRITORY_SCORE) * len(removed)
if captured:
player.territory.points.update(captured)
for p in self.players:
if p != player:
removed = p.territory.remove_points(captured)
player.score += (ENEMY_TERRITORY_SCORE - NEUTRAL_TERRITORY_SCORE) * len(removed)

for player in self.losers:
if player in self.players:
Expand All @@ -252,7 +277,7 @@ async def game_loop(self, *args, **kwargs):
return len(self.players) == 0

def save_scores(self):
d = {p.client.get_solution_id(): p.score for p in self.losers}
d = {p.client.get_solution_id(): p.score for p in self.losers + self.players}

with open(self.SCORES_LOCATION, 'w') as f:
f.write(json.dumps(d))
Expand Down Expand Up @@ -281,7 +306,7 @@ def save_visio(self):

def save_debug(self):
return [
p.save_log(self.DEBUG_LOCATION) for p in self.losers
p.save_log(self.DEBUG_LOCATION) for p in self.losers + self.players
]

def game_save(self):
Expand All @@ -303,19 +328,19 @@ def __init__(self, clients, scene, timeout):
self.scene = scene
self.timeout = timeout

def show_bonuses(self):
def append_bonuses_to_leaderboard(self):
for player in self.players:
if len(player.bonuses) > 0:
for bonus in player.bonuses:
label = '{} - {} - {}'.format(player.name, bonus.name, bonus.get_remaining_ticks())
self.scene.append_label_to_leaderboard(label, player.color)

def show_losers(self):
def append_losers_to_leaderboard(self):
for player in self.losers:
label = '{} выбыл, результат: {}'.format(player.name, player.score)
self.scene.append_label_to_leaderboard(label, player.color)

def show_score(self):
def append_scores_to_leaderboard(self):
for player in self.players:
label = '{} результат: {}'.format(player.name, player.score)
self.scene.append_label_to_leaderboard(label, player.color)
Expand All @@ -324,6 +349,12 @@ def draw_bonuses(self):
for bonus in self.bonuses:
bonus.draw()

def draw_leaderboard(self):
self.append_losers_to_leaderboard()
self.append_scores_to_leaderboard()
self.append_bonuses_to_leaderboard()
self.scene.draw_leaderboard()

def draw(self):
for player in self.players:
player.territory.draw()
Expand All @@ -343,12 +374,7 @@ def draw(self):
self.scene.show_game_over(timeout=True)

self.draw_bonuses()

self.scene.draw_leaderboard()
self.show_losers()
self.show_score()
self.show_bonuses()
self.scene.reset_leaderboard()
self.draw_leaderboard()

async def game_loop(self, *args, **kwargs):
self.scene.clear()
Expand Down
2 changes: 1 addition & 1 deletion paperio/local_runner/game_objects/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

class Player:
speed = SPEED
direction = 'initial'
direction = None

def __init__(self, id, x, y, name, color, client):
self.id = id
Expand Down
38 changes: 25 additions & 13 deletions paperio/local_runner/game_objects/scene.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,16 @@ class Scene:
leaderboard_height = 240

leaderboard_rows_count = 0
labels_buffer = []
game_over_label = pyglet.text.Label('GAME OVER', font_name='Times New Roman',
font_size=30,
color=game_over_label_color,
x=WINDOW_WIDTH / 2, y=WINDOW_HEIGHT / 2,
anchor_x='center', anchor_y='center')

def __init__(self):
self.window = pyglet.window.Window(height=WINDOW_HEIGHT, width=WINDOW_WIDTH)
pyglet.options['debug_gl'] = False
pyglet.gl.glClearColor(*self.background_color)
pyglet.gl.glEnable(pyglet.gl.GL_BLEND)
pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA, pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)
Expand All @@ -25,25 +32,27 @@ def clear(self):
self.window.clear()

def append_label_to_leaderboard(self, label, color):
pyglet.text.Label(label,
font_name='Times New Roman',
font_size=16,
color=color,
x=WINDOW_WIDTH - self.leaderboard_width + 20,
y=WINDOW_HEIGHT - 20 - WIDTH / 2 - 30 * self.leaderboard_rows_count,
anchor_x='left', anchor_y='center').draw()
if len(self.labels_buffer) > self.leaderboard_rows_count:
self.labels_buffer[self.leaderboard_rows_count].text = label
self.labels_buffer[self.leaderboard_rows_count].color = color
else:
self.labels_buffer.append(
pyglet.text.Label(label,
font_name='Times New Roman',
font_size=16,
color=color,
x=WINDOW_WIDTH - self.leaderboard_width + 20,
y=WINDOW_HEIGHT - 20 - WIDTH / 2 - 30 * self.leaderboard_rows_count,
anchor_x='left', anchor_y='center')
)
self.leaderboard_rows_count += 1

def reset_leaderboard(self):
self.leaderboard_rows_count = 0

def show_game_over(self, timeout=False):
label = 'TIMEOUT' if timeout else 'GAME OVER'
pyglet.text.Label(label, font_name='Times New Roman',
font_size=30,
color=self.game_over_label_color,
x=WINDOW_WIDTH / 2, y=WINDOW_HEIGHT / 2,
anchor_x='center', anchor_y='center').draw()
self.game_over_label.text = 'TIMEOUT' if timeout else 'GAME OVER'
self.game_over_label.draw()

def draw_border(self):
draw_line((0, 0), (0, WINDOW_HEIGHT), self.border_color)
Expand All @@ -57,3 +66,6 @@ def draw_leaderboard(self):
WINDOW_WIDTH, WINDOW_HEIGHT,
WINDOW_WIDTH - self.leaderboard_width, WINDOW_HEIGHT),
self.leaderboard_color)
for label in self.labels_buffer[:self.leaderboard_rows_count]:
label.draw()
self.reset_leaderboard()
Loading

1 comment on commit 1d05602

@Pro100AlexHell
Copy link

@Pro100AlexHell Pro100AlexHell commented on 1d05602 Jul 31, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is_siblings() по факту проверят только 4-связность - забыто изменение?
get_siblings был изменен и наполняет уже 8-связностью список

if prev and (self.is_siblings(prev, start_point) or prev == start_point):
                                prev = start_point
                                continue

похоже не очень оптимизирует, может и помогает иногда, но всеравно очень много точек перебираются как в lp1 так и в lp2, и вырожденные контуры создаются

Please sign in to comment.