Pravidla

Letošní léto nebude jako všechna nudná rok předtím, pojďte si s námi zasoutěžit i v létě v netradiční soutěži.
Zamčeno
Uživatelský avatar
honza
Organizátor
Příspěvky: 8
Registrován: 01-01-1970 01:00
Škola: ČVUT FIT, KTI
Rok ukončení studia: 2012
Bydliště: Praha

Pravidla

Příspěvek od honza »

Důležité pojmy

Grid: Hracímu poli se ve světě Trona říká grid. Hrací pole je čtvercová síť o rozměrech W x H, kde 10 <= W,H <= 100. Hrací pole je obehnáno zdí. Každé z políček v gridu může být buď prázdné, nebo se na něm nachází hráč, či hráčova světelná zeď.

Light cycle: Světelná motorka je reprezentace hráče v gridu. Jedna že základních vlastnosti (a také zbraní) motorky je, že za sebou zanechává světelnou stěnu neomezené délky.

Princip souboje

Do gridu jsou náhodně rozmístěni dva hráči, v zájmu spravedlnosti je jejich rozmístění středově symetrické. Hra probíhá na tahy, oba hráči hrají simultálně. Každý tah se musí hráč posunout o jedno pole v libovolném ze čtyř směrů (Sever, Jih, Východ, Západ). Pole, že kterého hráč odjel je zaplněno světelnou zdí až do konce aktuálního souboje. Pokud hráč vjede na obsazené pole (pole, na kterém je jiný hráč, nebo jakákoliv ze zdí), jeho motorka je zničena a hráč prohrává. Pro výhru je nutné přežít déle než soupeř. Pokud jsou tedy zničeny motorky obou hráčů ve stejném tahu (například oba najednou vrazí do některé ze zdí, nebo oba vjedou na stejné pole), nikdo nezvítězí a souboj končí remízou.

Bodování

Průběžná soutěž

Souboje probíhají ve stylu každý s každým. Soubojová klání probíhají každý prázdninový víkend. Za výhru v souboji získá majitel programu 3 body, za remízu 1 bod, prohra není bodovaná. Zasílat a vylepšovat soubojové programy lze vždy do pátku 23:59:59, poté je aktuální kolo uzavřeno a další zaslané programy jsou již zařazeny do kola následujícího. Každou neděli bude zveřejněno průběžně pořadí včetně záznamu z jednotlivých soubojů. Na konci prázdnin bude zveřejněn celkový vítěz průběžného klání.

Závěrečná play-off

Na konci prázdnin proběhne speciální kolo, ve kterém se může každý zúčastnit právě s jedním programem dle svého výběru (na rozdíl od průběžné soutěže tedy není možné svůj program vylepšovat na základě výsledků z předchozích soubojů). Turnaj proběhne vyřazovacím systémem. Více podrobností bude specifikováno později.

Specifikace programu

Jak už bylo řečeno, hráč je reprezentován svou motorkou. Úkolem je napsat program (zdrojový kód programu), který bude motorku ovládat. Souboj probíhá tak, že hráčův program bude spuštěn v herním prostředí a na standardní vstup mu bude dodávána informace o jeho okolí. Program se na základě toho rozhodne, kterým směrem se vydá, a odpoví na standardní výstup.

Vstup

Na začátku souboje jsou poskytnuty informace o velikosti herního pole (gridu) a hráčově pozici v něm. Pak je již na vstup dodávána jen informace o soupeřově pohybu v minulém tahu.

První řádek vstupu obsahuje dvě čísla W a H, která vyjadřují šířku a výšku hracího pole.

Na druhém řádku jsou souřadnice X a Y, které udávají hráčovu počáteční polohu v poli. Indexuje se od nuly a tedy X je nejvýše W-1 a podobně Y je nejvýše H-1. Souřadnice protihráče nejsou na vstupu obsaženy, ale je garantováno, že jeho pozice je středové souměrná s hráčovou pozicí.

Třetí a další řádek obsahují vždy jen jedno písmeno (S, J, V, Z) vyjadřující soupeřův předchozí krok.

Výstup

Na výstupu se vždy očekává řádek, na kterém je jen jedno písmeno (S, J, V, nebo Z). Písmeno vyjadřuje, kterým směrem se má hráčova motorka vydat v tomto tahu.

Ukázka komunikace

Příklad komunikace mezi programem a prostředím. Hrací pole má v tomto příkladě velikost 10x10 polí, počáteční pozice hráče je na poli o souřadnicích (2, 0). Situace během souboje by vypadala následovně:

Kód: Vybrat vše

  ************  ************  ************  ************
  *       R  *  *       rR *  *       rrR*  *       rrX*
  *          *  *          *  *          *  *          *
  *          *  *          *  *          *  *          *
  *          *  *          *  *          *  *          *
  *          *  *          *  *          *  *          *       Pozn.:
  *          *  *          *  *          *  *          *         B -- hráčova motorka (modrá)
  *          *  *          *  *          *  *          *         b -- modrá zeď
  *          *  *          *  *  B       *  * Bb       *         R -- soupeřova motorka (červená)
  *          *  *  B       *  *  b       *  *  b       *         r -- červená zeď
  *  B       *  *  b       *  *  b       *  *  b       *         * -- zeď okolo gridu
  ************  ************  ************  ************         X -- kolize
  • 0. tah
    Hráčův program přečte řádek "10 10" a řádek "2 0"
    Hráčův program zapíše řádek "S"
    Soupeřův program přečte řádek "10 10" a řádek "7 9"
    Soupeřův program zapíše řádek "V"
  • 1. tah
    Hráčův program přečte řádek "V"
    Hráčův program zapíše řádek "S"
    Soupeřův program přečte řádek "S"
    Soupeřův program zapíše řádek "V"
  • 2. tah
    Hráčův program přečte řádek "V"
    Hráčův program zapíše řádek "Z"
    Soupeřův program přečte řádek "S"
    Soupeřův program zapíše řádek "V"
  • 3. tah
    Soupeřův program narazil do zdi a konci, hráčův program žije. Vyhrává hráč.
Technická pravidla
  • program musí být napsán v některém z podporovaných jazyků (C, C++, Java, Perl, Python, Pascal)
  • program se svým okolím komunikuje prostřednictvím standardního vstupu a výstupu
  • na každou odpověď má program 5 vteřin (počítá se čas od zaslání poslední informace do obdržení odpovědi)
  • očekávaná odpověď je vždy jen jedno písmeno na řádce, cokoliv jiného bude považováno za špatnou odpověď a hráčův program bude terminován
Ukázkové programy

C

Kód: Vybrat vše

#include <stdio.h>

int main() {
    int x, y, w, h;
    char c;
    scanf("%d %d", &w, &h);             /* Načti velikost hřiště. */
    scanf("%d %d", &x, &y);             /* Načti moje počáteční souřadnice. */
    printf("S\n");                      /* Odešli startovní krok, vždy vyjedu na sever. */
    fflush(stdout);                     /* Vyprázdni výstupní mezi-paměť! */
    while (!feof(stdin)) {              /* Dokud přicházejí vstupy. */
        scanf("%c", &c);                /* Načti oponentův krok. */
        printf("%c\n", c);              /* Odešli svůj krok - dělám to samé, co soupeř. */
        fflush(stdout);                 /* Vyprázdni výstupní mezi-paměť! */
    }
    return 0;
}
C++

Kód: Vybrat vše

#include <iostream>

int main() {
    int x, y, w, h;
    char c;
    std::cin >> w >> h;                 // Načti velikost hřiště.
    std::cin >> x >> y;                 // Načti moje počáteční souřadnice.
    std::cout << 'S' << std::endl;      // Odešli startovní krok, vždy vyjedu na sever.
    // Mezi-paměť je při použití std::endl vyprázdňována automaticky!
    while (!std::cin.eof()) {           // Dokud přicházejí vstupy.
        std::cin >> c;                  // Načti oponentův krok.
        std::cout << c << std::endl;    // Odešli svůj krok - dělám to samé, co soupeř.
        // Mezi-paměť je při použití std::endl vyprázdňována automaticky!
    }
    return 0;
}
Java

Kód: Vybrat vše

import java.util.Scanner;

public class Tron {

    public static void main(String [] args) {
        int x, y, w, h;
        char c;
        String line;
        Scanner sc = new Scanner(System.in);
        w = sc.nextInt(); h = sc.nextInt(); /* Načti velikost hřiště. */
        x = sc.nextInt(); y = sc.nextInt(); /* Načti moje počáteční souřadnice. */
        line = sc.nextLine();
        System.out.println("S");            /* Odešli startovní krok, vždy vyjedu na sever. */
        System.out.flush();                 /* Vyprázdni výstupní mezi-paměť! */
            while (sc.hasNextLine()) {      /* Dokud přicházejí vstupy. */
                line = sc.nextLine();       /* Načti oponentův krok. */
                c = line.charAt(0);
                System.out.println("" + c); /* Odešli svůj krok - dělám to samé, co soupeř. */
                System.out.flush();         /* Vyprázdni výstupní mezi-paměť! */
            }
    }
}
Perl

Kód: Vybrat vše

use strict;
use warnings;

local $| = 1;                           # Automaticky vyprazdňovat mezi-paměť!

my ($w, $h) = <STDIN> =~ /(\d+) (\d+)/; # Načti velikost hřiště.
my ($x, $y) = <STDIN> =~ /(\d+) (\d+)/; # Načti moje počáteční souřadnice.

print "S\n";                            # Odešli startovní krok, vždy vyjedu na sever.

while (<STDIN>) {                       # Dokud přicházejí vstupy.
    chomp;                              # Načti oponentův krok.
    print "$_\n";                       # Odešli svůj krok - dělám to samé, co soupeř.
}

exit 0;
Python 3

Kód: Vybrat vše

import sys
w, h = map( int, input( ).split( ) )  # Načti velikost hřiště.
x, y = map( int, input( ).split( ) )  # Načti moje počáteční souřadnice.
print( "S" );                         # Odešli startovní krok, vždy vyjedu na sever.
sys.stdout.flush( )                   # Vyprázdni výstupní mezi-paměť!
while True:                           # Dokud přicházejí vstupy.
  try:
    c = input( )                      # Načti oponentův krok.
  except EOFError:
    break
  print( c )                          # Odešli svůj krok - dělám to samé, co soupeř.
  sys.stdout.flush( );                # Vyprázdni výstupní mezi-paměť!
Pascal

Kód: Vybrat vše

program Tron;
var
    x, y, w, h : integer;
    c          : char;
begin
    read(w); read(h);            // Načti velikost hřiště.
    read(x); read(y);            // Načti moje počáteční souřadnice.
    readln;
    writeln('S');                // Odešli startovní krok, vždy vyjedu na sever.
    Flush(StdOut);               // Vyprázdni výstupní mezi-paměť!
    while not eof do begin       // Dokud přicházejí vstupy.
      readln(c);                 // Načti oponentův krok.
      writeln(c);                // Odešli svůj krok - dělám to samé, co soupeř.
      Flush(StdOut);             // Vyprázdni výstupní mezi-paměť!
    end
end.

Uživatelský avatar
honza
Organizátor
Příspěvky: 8
Registrován: 01-01-1970 01:00
Škola: ČVUT FIT, KTI
Rok ukončení studia: 2012
Bydliště: Praha

Re: Pravidla

Příspěvek od honza »

Technicke detaily

Mozna by vas mohlo zajimat, jak dochazi ke kompilaci vaseho odevzdaneho reseni. Aktualne se pro soubory .cpp pouziva g++ ve verzi 4.7.2, pro .c se vola gcc ve verzi 4.7.2. Soubory .pas jsou kompilovany Free Pascal Compilerem verze 2.6.0-9.

Kompilatory jsou volany s naledujicimi parametry:

Kód: Vybrat vše

g++ -Wall -Wextra -Wno-long-long -pedantic -O0 zdrojovy_kod.cpp
gcc -Wall -Wextra -Wno-long-long -pedantic -O0 zdrojovy_kod.c
fpc -Tlinux zdrojovy_kod.pas
Za zminku stoji napriklad to, ze NENI k dispozici C99 pro ciste C, ani C++11 pro C++.
Knowledge is power, guard it well.

Zamčeno