TlačiťTlačiť Slovenčina English Hľadať RSS

© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 19. 4. 2024.

Stránka sa načítava, prosím čakajte…

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

obrázok      obrázok
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ť).
obrázok obrázok
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");
}