Stránka sa načítava, prosím čakajte…
© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 19. 4. 2024.
Dátum: 11. 1. 2021, pred tromi rokmi
Úvod
Hráte hru P(R)VOK podobnú známej hre Kameň, papier, nožnice, ale zložitejšiu. V hre vystupujú štyri prvky: Pôda, Voda, Oheň a Kov (R v zátvorke v názve hry zastupuje možnosť remízy).
Pravidlá
- Pôda vsiakne Vodu.
- Voda zahasí Oheň.
- Oheň roztaví Kov.
- Kov rozryje Pôdu.
- Voda skoroduje Kov.
- Oheň vysuší Pôdu.
Ak obidve strany zvolia rovnaký prvok, je to remíza.
Symboly pre prvky
Pôda – otvorená dlaň a vystretými prstami smerujúcimi nadol (pôda je zem a tam smeruje naša ruka, akoby sa do nej chcela vnoriť). | Voda – ruka/dlaň je vystretá vodorovne s dlaňou otočenou smerom nadol; ruka/prsty sa môžu vlniť (voda má hladinu – vodorovnú ruku, ktorá sa môže vlniť). | |
Oheň – prsty sú pokrčené ako pazúry a smerujú (spolu s dlaňou) smerom nahor; prsty sa vlnia (jazyky plameňov horiaceho ohňa). | Kov – zaťatá päsť, ktorá je otočená smerom nahor (kov je z rudy, ruda je hruda; kov je pevný; prípadne iné interpretácie). |
Symboly sú zvolené tak, aby sa žiadny nedal jednoducho a rýchlo zmeniť na iný.
Zadanie
Vašou úlohou je naprogramovať rozhodcu, ktorý prijme reťazec dlhý 2 × n znakov, kde n je počet kôl (obvykle 4 × 4 = 16). V reťazci sa môžu vyskytovať len dvojice zložené z písmen P, V, O a K. Rozhodca celý reťazec prejde, určí (a vypíše) výhercu pre každú dvojicu písmen (prvé písmeno je prvý hráč, druhé druhý; nezabudnite, že môže vzniknúť aj remíza) a nakoniec vypíše celkový výsledok a buď určí víťaza celého turnaja (t. j. toho, kto vyhral väčší počet kôl), alebo skonštatuje, že celý turnaj sa skončil remízou.
Tu je rekapitulácia možných kombinácií dvojíc rôznych (neremizujúcich) prvkov s uvedením výherného prvku:
PV/VP | – | P | PK/KP | – | K | VK/KV | – | V | ||
PO/OP | – | O | VO/OV | – | V | OK/KO | – | O |
Príklady
Tu sú ukážky tabuliek výsledkov s celkovým výsledkom turnaja.
VP | KO | VP | KV | VO | VK | OV | PK | OK | OK | PV | OV | PK | OV | KP | OK |
2 | 2 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 2 | 1 | 1 |
7 : 9. Turnaj vyhral 2. hráč.
VV | VP | OK | KK | VK | VO | OV | OK | PV | PK | VP | OV | PP | OV | OO | KP |
0 | 2 | 1 | 0 | 1 | 1 | 2 | 1 | 1 | 2 | 2 | 2 | 0 | 2 | 0 | 1 |
6 : 6. Turnaj sa skončil remízou.
Čiže výpis môže vyzerať napríklad takto:
VV: 0 | VP: 2 | OK: 1 | KK: 0 | VK: 1 | VO: 1 | OV: 2 | OK: 1 | PV: 1 | PK: 2 | VP: 2 | OV: 2 | PP: 0 | OV: 2 | OO: 0 | KP: 1 |
6 : 6. Turnaj sa skončil remízou.
Ukážka riešenia
#include <stdio.h> #include <string.h> int ktoVyhral(char a, char b) { if (a != 'P' && a != 'V' && a != 'O' && a != 'K') return -1; if (b != 'P' && b != 'V' && b != 'O' && b != 'K') return -2; if (a == b) return 0; if ('P' == a) return 'V' == b ? 1 : 2; if ('P' == b) return 'V' == a ? 2 : 1; if ('V' == a) return 1; if ('V' == b) return 2; return 'O' == a ? 1 : 2; /* if ('P' == a && 'V' == b) return 1; if ('P' == a && 'O' == b) return 2; if ('P' == a && 'K' == b) return 2; if ('V' == a && 'P' == b) return 2; if ('O' == a && 'P' == b) return 1; if ('K' == a && 'P' == b) return 1; if ('V' == a && 'O' == b) return 1; if ('V' == a && 'K' == b) return 1; if ('O' == a && 'V' == b) return 2; if ('K' == a && 'V' == b) return 2; if ('O' == a && 'K' == b) return 1; if ('K' == a && 'O' == b) return 2; return 0; */ } void main() { char *dvojice = "VPKOVPKVVOVKOVPKOKOKPVOVPKOVKPOK"; // char *dvojice = "VVVPOKKKVKVOOVOKPVPKVPOVPPOVOOKP"; int dvojic = strlen(dvojice) / 2; int pocetA = 0, pocetB = 0; int i = 0; while (dvojic--) { char a = dvojice[i++]; char b = dvojice[i++]; int kto = ktoVyhral(a, b); switch (kto) { case 1: ++pocetA; break; case 2: ++pocetB; break; } printf("%c%c: %d\t", a, b, kto); } printf("\n%d : %d. Turnaj ", pocetA, pocetB); if (pocetA > pocetB) printf("vyhral 1. hráč"); else if (pocetA < pocetB) printf("vyhral 2. hráč"); else printf("sa skončil remízou"); printf(".\n"); }