Autor: Dondu
Poniżej wyniki weekendowych zawodów RoboMind rozegranych w dniach 9-11 listopada 2013r. W zawodach wzięło udział 13 zawodników i jedna zawodniczka :-)
Ogłoszenie o zawodach: Konkurs weekendowy RoboMind (9-10 listopada 2013r,)
Zawody wypełniła dyskusja na temat problemu instrukcji jeść(), której nie było w oficjalnym helpie na stronie producenta programu. W przypadku następnych zawodów, ten problem rozwiążemy pisząc własną instrukcję.
Zawody pokazały także, że w następnych musimy bardzo szczegółowo opracować regulamin. Z drugiej strony pokazały, jak różnie można podchodzić do algorytmów rozwiązania problemów. Zapewne w przyszłych zawodach zamiast jednej trasy będą dwie, by algorytmy były jak najmniej dopasowane do aren zmagań.
Mam więc serdeczną prośbę, by w przyszłości tego typu zawody traktować jak zabawę, a nie ostrą rywalizację. Zawody te prowadzę dla Was hobbystycznie, a poświęcam na to sporo czasu. :)
Wyniki przedstawiają się następująco:
Gratulacje dla zwycięzców!!!
Najbardziej żal nam Łukasza, który miał bardzo fajnie napisany program, ale popełnił malutki błąd - robot zamiast podnieść ostatni beacon, zjadł go :( Niestety było to niezgodne z wytycznymi mówiącymi że:
- gdy się zatrzyma przedmiot powinien być we wnętrzu robota,
Program Łukasza zamieszczamy poniżej jako dodatkowy.
1 miejsce: Szymczyk Mirosław
# Przemieszczenie robota do pierwszej grupy nadajników
# Sprawdzana jest wolna przestrzeń najpierw po prawej, późnej po lewej
powtórzDopóki(nie zPrzoduNadajnik()) {
jeżeli(prawoPusto()) { wPrawo() }
wPrzeciwnymRazie jeżeli(lewoPusto()) { wLewo() }
naprzód(1)
}
UsuńPrzeszkodę()
# Przemieszczenie robota do drugiej grupy nadajników
powtórzDopóki(nie zPrzoduNadajnik()) {
jeżeli(zPrzoduPusto() i prawoPusto()) { wPrawo() }
wPrzeciwnymRazie jeżeli(zPrzoduPrzeszkoda() i lewoPusto()) { wLewo() }
naprzód(1)
}
UsuńPrzeszkodę()
# Przemieszczenie robota do miejsca gdzie rozpoczyna się biała ścieżka
powtórzDopóki(nie lewoBiałe()) {
jeżeli(zPrzoduPrzeszkoda()) { wLewo() }
naprzód(1)
}
wLewo()
# Przemieszczenie robota po białej ścieżce do jej końca
# Znajdujące się na ścieżce nadajniki sa eliminowane
powtórz {
jeżeli (prawoBiałe()) { wPrawo() }
wPrzeciwnymRazie jeżeli (zPrzoduBiałe()) {}
wPrzeciwnymRazie jeżeli (lewoBiałe()) { wLewo() }
wPrzeciwnymRazie jeżeli (nie zPrzoduBiałe()) {
jeżeli (zPrzoduPusto() ) {wLewo() wLewo()}
wPrzeciwnymRazie {
wPrawo()
malujBiały() # rozpoczącie malowania białej ścieżki
naprzód(1)
przerwij # wyjście z pętli
}
}
jeżeli (zPrzoduNadajnik()) { UsuńPrzeszkodę() }
naprzód(1)
}
# Przemieszczenie robota do mety
powtórz {
jeżeli (lewoPusto()) { wLewo() }
wPrzeciwnymRazie jeżeli (zPrzoduPusto()) { }
wPrzeciwnymRazie jeżeli (prawoPusto()) { wPrawo() }
jeżeli (zPrzoduNadajnik()) {
podnieś() # pobranie nadajnika do wnętrza robota
naprzód(1)
przestańMalować() # można pominąć
zakończ # zakończenie programu
}
naprzód(1)
}
# Usunięcie (zjedzenie) z toru nadajników
procedura UsuńPrzeszkodę() {
powtórzDopóki(zPrzoduNadajnik()) {
jeść()
naprzód(1)
}
}
2 miejsce: Kobus Sebastian
powtórz{
prawaręka
jeżeli(zPrzoduPrzeszkoda() i lewoPrzeszkoda()){
przerwij
}
}
powtórz{
lewaręka
jeżeli(zPrzoduNadajnik()){
przerwij
}
}
powtórz{
jedznadajnik
prawaręka
jeżeli(lewoBiałe){
przerwij
}
}
powtórz{
pobiałej
jeżeli(zPrzoduNadajnik()){
malujBiały
powtórz{
jedznadajnik
lewaręka
}
}
}
procedura jedznadajnik{
jeżeli(zPrzoduNadajnik()){
jeżeli(zPrzoduCzarne()){
podnieś()
naprzód(1)
zakończ
}
wPrzeciwnymRazie{
jeść()
}
}
}
procedura pobiałej{
jeżeli(lewoBiałe()){
jeżeli(zPrzoduBiałe()){
naprzód(1)
wPrawo()
wPrawo()
}
wPrzeciwnymRazie{
wLewo()
naprzód(1)
}
}
jeżeli(prawoBiałe()){
wPrawo()
naprzód(1)
}
jeżeli(zPrzoduBiałe()){
naprzód(1)
}
}
procedura prawaręka{
jeżeli(PrawoPrzeszkoda()){
jeżeli(zPrzoduPusto()){
naprzód(1)
}
wPrzeciwnymRazie{
wLewo()
}
}
wPrzeciwnymRazie{
wPrawo()
naprzód(1)
}
}
procedura lewaręka{
jeżeli(lewoPrzeszkoda()){
jeżeli(zPrzoduPusto()){
naprzód(1)
}
wPrzeciwnymRazie{
wPrawo()
}
}
wPrzeciwnymRazie{
wLewo()
naprzód(1)
}
}
3 miejsce: Kempny Szymon
szukajTrasy
# Szuka białej trasy
procedura szukajTrasy {
jeżeli(lewoBiałe) {
wLewo
trasaBiała
}
ogarnijSie
szukajTrasy
} # koniec szukajTrasy
# ogarnia robota, żeby dobrze jechał
procedura ogarnijSie {
jeżeli(zPrzoduPrzeszkoda){
jeżeli(zPrzoduNadajnik){ jeść } # pozbądź się wszystkich nadajników
wPrzeciwnymRazie jeżeli(lewoPusto i prawoPusto) { wPrawo }
wPrzeciwnymRazie jeżeli(lewoNadajnik lub lewoPusto) {
wLewo
zwroć
} wPrzeciwnymRazie { wPrawo }
} wPrzeciwnymRazie jeżeli(lewoPusto) {
naprzód(2)
jeżeli(prawoPusto i lewoPusto) { # Sprawdź czy to aby nie zły zakręt
wstecz(2) # kosztem 2 dodatkowych ruchów - kilka linii kodu mniej
wLewo
}
}
naprzód(1)
} # koniec ogarnijSie
# jedź po białej trasie
procedura trasaBiała {
powtórz {
jeżeli(zPrzoduBiałe) {
jeżeli(zPrzoduNadajnik) { jeść }
wPrzeciwnymRazie { naprzód(1) }
}
wPrzeciwnymRazie jeżeli(prawoBiałe) { wPrawo }
wPrzeciwnymRazie jeżeli(lewoBiałe) { wLewo }
wPrzeciwnymRazie jeżeli(zPrzoduPrzeszkoda) { # koniec białej trasy
wPrawo # czyli malujemy i
malujBiały # i szukamy mety
szukajMety
} wPrzeciwnymRazie { # miejsce ze ślepym zaułkiem
wstecz(1)
wLewo
}
}
} # koniec trasaBiała
# po przejściu białej trasy - szukaj mety
procedura szukajMety {
powtórzDopóki(nie(prawoCzarne)) {
jeżeli(lewoPusto()) { wLewo }
naprzód(1)
}
wPrawo
naprzód(1)
podnieś
naprzód(1)
zakończ
} # koniec szukajMety
Kresa Łukasz
Szkoda tego błędu z linii 34 - byłoby drugie miejsce :(
# http://mikrokontrolery.blogspot.com/
# Konkurs weekendowy
# Lukasz Kresa
# map: dd_arena.map
ruszajRobocie()
#ruszajRobocie - procedura
procedura ruszajRobocie(){
# Na początku szukamy białej trasy
powtórzDopóki(nie lewoBiałe){
jeżeli(zPrzoduNadajnik){jeść()
powtórzDopóki(nie (zPrzoduPrzeszkoda lub lewoBiałe)){naprzód(1) gdzieSkrecic()}}
wPrzeciwnymRazie jeżeli(zPrzoduPrzeszkoda){skrecBoPrzeszkoda}
wPrzeciwnymRazie jeżeli(lewoPusto){wLewo naprzód(1)}
wPrzeciwnymRazie{naprzód(1)}}
wLewo naprzód(1) jedzBialaLinia()}
#
procedura jedzBialaLinia(){
powtórz{
jeżeli(prawoBiałe){wPrawo naprzód(1)}
wPrzeciwnymRazie jeżeli(zPrzoduNadajnik){jeść()}
wPrzeciwnymRazie jeżeli(zPrzoduBiałe){naprzód(1)}
wPrzeciwnymRazie jeżeli(lewoBiałe){wLewo}
wPrzeciwnymRazie jeżeli(zPrzoduPusto i lewoPusto){wLewo wLewo}
wPrzeciwnymRazie{przerwij}}
maluj()}
#
procedura maluj(){
malujBiały
powtórz{
jeżeli(lewoPusto){wLewo naprzód(1)}
wPrzeciwnymRazie jeżeli(zPrzoduPusto){naprzód(1)}
#BŁĄD w poniższej linii - miało być PODNIEŚ zamiast JEŚĆ!!!
wPrzeciwnymRazie jeżeli(zPrzoduNadajnik){jeść() naprzód(1) zakończ}
wPrzeciwnymRazie{wPrawo}}}
#
procedura gdzieSkrecic() {
jeżeli(zPrzoduPrzeszkoda i (nie zPrzoduNadajnik)){
jeżeli(PrawoPrzeszkoda){wLewo naprzód(1)}
wPrzeciwnymRazie jeżeli(lewoNadajnik){wLewo}
wPrzeciwnymRazie{wPrawo naprzód(1)}}}
#
procedura skrecBoPrzeszkoda() {
jeżeli(PrawoPrzeszkoda){wLewo naprzód(1)}
wPrzeciwnymRazie{wPrawo naprzód(1)}}

Zagapiłem się i zmieniając komendy z "podnieś/opuść" na "jeść" zmieniłem także nieopatrznie tę z końca.
OdpowiedzUsuńPomysł z dwoma mapami uważam za ciekawy. Czekam na kolejne zawody.
Tak bywa :(
UsuńCo do pomysłu to jutro pojawi się artykuł w tej sprawie z prośbą o dyskusję - zobaczymy co z tego wyjdzie. Jeżeli coś pozytywnego, to będziemy częściej takie zawody organizować.
Kiedy można się spodziewać przesłania wygranych ebooków? ;)
OdpowiedzUsuńJutro (wtorek) uzyskam odpowiednie kody i prześlę mailowo zwycięzcom. Zapomniałem o tym napisać.
Usuń