Malá hra o Velkého Bajta (1) - Odebírání zápalek

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Malá hra o Velkého Bajta (1) - Odebírání zápalek

Příspěvekod faraon » 04 říj 2015 22:42

Všechny bity hry:

00000001 - Jednoduchá kalkulačka
00000010 - Odebírání zápalek
00000100 - Gregoriánský kalendář
00001000 - Hádání kombinace
00010000 - Vigenérova šifra
00100000 - Hledání min
01000000 - Házení kostkou
10000000 - Conway's Game of Life




Měsíc uběhl, a je čas si zase trochu pohrát. V minulém dílu jsme si připomněli z čeho pojmenování počítače pochází a k čemu byl původně určený, proto jsme si také trochu započítali. Tentokrát se budeme věnovat spíš tomu hraní, ale začneme zase malým náhledem do historie.

Počítač? Kdo by proboha dneska chtěl počítač?

V první polovině sedmdesátých let vznikly první mikroprocesory, a počítačoví nadšenci konečně měli možnost pořídít si vlastní počítač domů. Vynecháme mnoho podivností a stavebnic, kterých vzniklo většinou jenom pár kusů (jako například Apple 1), a vrhneme se na sériově vyráběné stroje. První takový byl francouzský Micral, po něm se objevil americký Altair, a několik dalších, ale to všechno byly pořád bedny se spoustou přepínačů a světýlek inspirované tehdejšími minipočítači, sice úchvatné pro geeky, ale nic pro běžného smrtelníka.
To se změnilo na jaře roku 1977, kdy se objevil první počítač určený pro spotřebitele, Commodore PET. Několik týdnů po něm se představil i legendární Apple II, a ještě o něco později Tandy TRS-80, první skutečně levný mikropočítač.

Ovšem co bylo levné pro Američany, nebylo levné pro průměrného (západního) Evropana, takže na naší straně Velké louže si tyhle zámořské zázraky mohl pořídit jenom málokdo. To měl brzy napravit Clive Sinclair, britský vynálezce a génius spotřební elektroniky, který už v šedesátých letech vyráběl nejmenší tranzistorová rádia na světě, menší než krabička zápalek, v sedmdesátých potom nejlevnější kalkulačky a nejjednodušší náramkové digitální hodinky, které si mohl člověk sám sestavit ze stavebnice, když nechtěl připlatit pár liber za hotové.
Na konci sedmdesátých let sice v Anglii existovalo přes 300 firem vyrábějicích počítače, ale jedině ta jeho dokázala sestrojit ten nejmenší, nejjednodušší a nejlevnější, první na světě s cenou pod 100 liber - ZX80. Začal se vyrábět v roce 1980, takže právě letos slaví své pětatřicáté narozeniny.

Poslechněme si co o něm říká Michal Rybka z Alza Muzea:
https://www.youtube.com/watch?v=o43GHFDhaoo

Jeden kilobajt paměti RAM (1024 bajty) ale skutečně nebyl moc, velmi brzy k němu vzniklo rozšíření na 4 KiB (později až 16 KiB), malá krabička zasunutá zezadu do systémového konektoru, a s tím už se dostal na úroveň například toho TRS-80, se stejným procesorem Zilog Z80. Jenže Sinclair ZX80 běžel na téměř třikrát větší frekvenci! Nevýhodou zase bylo, že většinu času procesor strávil vytvářením obrazu, a program prováděl jen ve volných chvilkách mezi zpracováním jednotlivých řádků televizního signálu. Takové finty byly tehdy běžné, například Apple II vůbec neobsahoval řadič disketové mechaniky, obsluhoval jí přímo procesor počítače.
Do čtyř kilobajtů se už daly i v BASICu naprogramovat složitější programy, které dokázaly víc než jenom požádat o jméno člověka a potom ho slušně pozdravit, nebo hádat myšlené číslo, a nastala doba kdy si pomalu každý školák vymýšlel svoje hry, a porovnával je se spolužáky. Ty hry se samozřejmě nemohly technickou úrovní rovnat dnešním hrám, dokonce ani tehdejším arkádovým automatům, protože tyhle počítače uměly zobrazit jenom velká písmena, číslice, pár dalších znaků, navíc jen černobíle, a se zvukem se vůbec nepočítalo. Zato se při hraní muselo o dost víc přemýšlet.

Taková jednoduchá hra je známá pod názvem NIM. Hraje se po celém světě, často v barech a hospodách, a spočívá v odebírání nějakých předmětů, například zápalek, podle určitých pravidel. Jedna z nejjednodušších verzí je tahle:
  1. Počáteční počet zápalek je náhodné liché číslo od 17 do 27, v každé hře jiné.
  2. Hráči se střídají, každý může vzít jednu až X zápalek.
  3. Maximální počet X je v každé hře jiný, od 2 do 5.
  4. Prohrává ten, na koho zbyde poslední zápalka.

A s tím se můžeme pustit do dalšího bitu: 00000010

Takže úkol pro tento měsíc je naprogramovat hru NIM, kde bude hrát člověk proti počítači podle výše uvedených pravidel. Jenom je ještě trochu rozvedu:
  • Každé kolo hry začíná s náhodným počtem zápalek, vždy lichým (17,19,21,23,25,27), a náhodným maximem (2,3,4,5).
  • První odběr v každém kole provede buď hráč který minule prohrál, nebo se člověk a počítač pravidelně střídají.
  • Pro takhle jednoduchou hru jde snadno najít vítězná strategie, která z počítače udělá neporazitelného soupeře.
  • Při vypisování zpráv o počtu zápalek je dobré věnovat pozornost pravidlům skloňování číslovek a koncovek! ;-)

Na závěr zase ukázkové video, takhle hra NIM vypadá na nástupci ZX80, ZX81, s téměř shodnými parametry:
https://youtu.be/R64AyuT9wu4

Program vyžaduje rozšíření paměti, protože potřebuje necelé 3 KiB, ale pro základní 1 KiB RAM vznikly dokonce Šachy, které ho ani nezaberou celou! Samozřejmě ne v BASICu, jsou naprogramované ve strojovém kódu, a přes třicet let, až do letoška, držely světové prvenství jako nejmenší šachový program.

Titulní nadpis je výrok Charlese Tandyho, po tom co se dozvěděl že v jeho firmě tajně vyvinuli TRS-80 a chtějí mu předvést funkční prototyp. Vypůjčil jsem si ho z článku Pavla Tronnera: http://pctuning.tyden.cz/multimedia/hry ... ndy-trs-80
Naposledy upravil(a) faraon dne 03 dub 2016 23:14, celkem upraveno 4 x.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Reklama
Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23591
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod ITCrowd » 05 říj 2015 00:10

Hehe, stejnou úlohu jsem dostal v počítačovém kroužku. To mě bylo tak 17 a dělal jsem to na PMD85 :lol:
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod faraon » 05 říj 2015 05:33

Však jsem psal že je to jednoduchá hra, jestli máš ještě zdroják, tak sem s ním :lol:
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Madara
Level 4
Level 4
Příspěvky: 1123
Registrován: červenec 11
Bydliště: Nechceš klíče od domu ?
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod Madara » 05 říj 2015 07:06

No, to je zajímavá úloha ! To bych si i rád udělal. :thumbup:

Uživatelský avatar
Madara
Level 4
Level 4
Příspěvky: 1123
Registrován: červenec 11
Bydliště: Nechceš klíče od domu ?
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod Madara » 31 říj 2015 21:18

Hotovo. Program neumí přesné skloňování číslovek, C#.

"Main" třída v souboru Program.cs
Samotný program ve složce Debug, měl by jít otevřít i ve Wine.

https://github.com/MadaraCZech/Zapalky/ ... C3%A1palky

Denis V.
Level 3.5
Level 3.5
Příspěvky: 992
Registrován: květen 13
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod Denis V. » 01 lis 2015 19:05

Ahoj, tak to zkouším :)
Mějte kdyžtak trpělivost kdyby to bylo strašně zpackané :D
VS Projekt, .exe Jen zdroják, C++
Kdyby nevyhovovala možnost stažení tak najdu něco jiného, ale takto mi to přišlo nejjednodušší :)

Nemám vyladěné skloňování čísel a také mi to vždy vygeneruje stejná "náhodná" čísla, kdyby mi někdo řekl jak to vyřešit, budu rád :)
Naposledy upravil(a) Denis V. dne 01 lis 2015 20:59, celkem upraveno 4 x.

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod faraon » 01 lis 2015 19:43

Denis V.: Hurá, konečně něco co můžu bez větších problémů rozjet ve Slaxu :lol:

Tak jenom pár poznámek, co jsem tak na první pokus objevil:
  • Čtyřmegabajtový archiv kvůli tříkilobajtovému zdrojáčku? Stačilo sem vložit jako kód jenom Source.cpp z adresáře NIM ;-)
  • Nastavení seedu generátoru pseudonáhodných čísel se provede hned na začátku programu funkcí srand().
  • Funkce rand() a srand() jsou v knihovně <cstdlib>, tu je potřeba do programu inkludovat. Nespoléhej na to že to za tebe VS udělá automaticky, spíš si zapni všechny warningy a při každém překladu je dobře studuj. Mě to nešlo zkompilovat, dokud jsem to tam sám nedoplnil, u většího programu by to už mohl být problém.
  • Množství odebíraných zápalek může být 1 až MAX, kde se MAX mění náhodně v každé hře od 2 do 5. Mě to nabízelo stále jen 2 až 4.
  • Hned ve druhém kole počítač bere dvakrát za sebou(!) a na stole zbyde jedna zápalka. Tam mělo kolo skončit mojí prohrou. Když jsem se pokusil tu zápalku vzít, program se zacyklil. To ještě bude potřeba ošetřit.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Denis V.
Level 3.5
Level 3.5
Příspěvky: 992
Registrován: květen 13
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod Denis V. » 01 lis 2015 20:00

Tak alespoň něco :D

Dobře, jdu to reuploadovat.
Na přidání knihovny jsem zapomněl. Warningy mám zapnuté, ale nenahlásilo mi to, za chvíli nahraji opravenou verzi ;)
Generování a chybné rozmezí opravím během zítřka či později, to rozmezí jsem si blbě přečetl...
Chyby s tím že počítač bere dvakrát jsem si všiml pár minut po odeslání a už mám opraveno.

Jinak moc díky za komentář a rady! :)

Uživatelský avatar
Oxxid
člen BSOD týmu
Master Level 8
Master Level 8
Příspěvky: 6194
Registrován: prosinec 12
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod Oxxid » 01 lis 2015 21:05

Madara píše:Hotovo. Program neumí přesné skloňování číslovek, C#.

"Main" třída v souboru Program.cs
Samotný program ve složce Debug, měl by jít otevřít i ve Wine.

https://github.com/MadaraCZech/Zapalky/ ... C3%A1palky

Moc nevyužíváš featury toho jazyka. Třeba Enum místo "if (tah == "pc")" pak máš "if (tah == Hrac.PC)". Je pak mozno provest refactoring :smile:

Dva vnorene cykly taky budou nejspise zbytecne.

Uživatelský avatar
Madara
Level 4
Level 4
Příspěvky: 1123
Registrován: červenec 11
Bydliště: Nechceš klíče od domu ?
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod Madara » 01 lis 2015 21:38

Jejda, ten první cyklus je tam momentálně k ničemu, ale je to příprava pro dotaz po každém kole, jestli uživatel nechce ukončit hru...
Enum jsem nikdy nepoužil, kouknu na to.

Uživatelský avatar
second32
Level 3
Level 3
Příspěvky: 542
Registrován: únor 15
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod second32 » 14 lis 2015 16:25

Tak jsem konečně udělal i druhý bit.

Kód: Vybrat vše

#include <iostream>
#include <cstdlib>
#include <ctime>

void HracTah(void);
void PCTah(void);

int PocetZapalek, MaxTah, vyhry, prohry, tah;
bool Vyhra = false; //1 hráč, 0 PC
char HratZnovu = 'Y';

int main()
{
   using namespace std;
   srand(time(0));
   while (true)
   {
      PocetZapalek = rand() % 11 + 18;
      if (PocetZapalek % 2 == 0) PocetZapalek--;
      MaxTah = rand() % 4 + 2;
      cout << endl << "Hra zacina s " << PocetZapalek << " zapalkami, maximalni pocet zapalek pro brani je " << MaxTah << ". Hodne stesti!" << endl;
      if (Vyhra == false)   HracTah();
      else PCTah();
   }
   return 0;
}

void HracTah()
{
   using namespace std;
   cout << "Zbyvajici zapalky: " << PocetZapalek << endl << "Kolik chces vzit? " << endl;
   while (true)
   {
      cin >> tah;
      if (tah > MaxTah)
      {
         cout << "Nemuzes brat tolik zapalek, maximalni pocet je " << MaxTah << ", zkus to znovu!" << endl;
      }
      else if (tah >= PocetZapalek)
      {
         cout << "Musis alespon jednu zapalku nechat, zkus to znovu!" << endl;
      }
      else if (tah <= 0)
      {
         cout << "Musis vzit alespon jednu zapalku, zkus to znovu!" << endl;
      }
      else break;
   }
   PocetZapalek = PocetZapalek - tah;
   cout << "Vzal jsi " << tah << " zapalek, zbyva jich " << PocetZapalek << endl << endl;
   if (PocetZapalek == 1)
   {
      vyhry++;
      cout << "Vyhral jsi hru!" << endl << "Aktualni pocet vyher: " << vyhry << endl << "Aktualni pocet proher: " << prohry << endl;
      Vyhra = true;
      cout << "Pro pokracovani stiskni Y, pro opusteni hry stiskni jakoukoli jinou klavesu" << endl;
      cin >> HratZnovu;
      cin.ignore(256, '\n');
      if (HratZnovu != 'Y' && HratZnovu != 'y') exit(0);
      return;
   }
   else PCTah();
}

void PCTah()
{
   using namespace std;
   cout << "Zbyvajici zapalky: " << PocetZapalek << endl;
   if (PocetZapalek <= (MaxTah + 1)) tah = PocetZapalek - 1;
   else tah = rand() % MaxTah + 1;
   PocetZapalek = PocetZapalek - tah;
   cout << "Pocitac vzal " << tah << " zapalek, zbyva jich " << PocetZapalek << endl << endl;
   if (PocetZapalek == 1)
   {
      prohry++;
      cout << "Pocitac te porazil!" << endl << "Aktualni pocet vyher: " << vyhry << endl << "Aktualni pocet proher: " << prohry << endl;
      Vyhra = false;
      cout << "Pro pokracovani stiskni Y, pro opusteni hry stiskni jakoukoli jinou klavesu" << endl;
      cin >> HratZnovu;
      cin.ignore(256, '\n');
      if (HratZnovu != 'Y' && HratZnovu != 'y') exit(0);
      return;
   }
   else HracTah();
}


Mohl jsem ten výstup udělat trochu přehlednější, ale co. exe

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Malá hra o Velkého Bajta (1)

Příspěvekod faraon » 24 lis 2015 18:57

Tak jsem se konečně dostal k tomu abych si zahrál :lol:

No, ten výpis je napoprvé trochu nepřehledný, ale dá se na něj zvyknout. Zato na ty koncovky ses pěkně vy[PÍP]!
Pocitac vzal 1 zapalek, zbyva jich 12

Že tě to netluče do očí :-(

No, geniální ten program zrovna není, po osmé výhře jsem teda začal trochu experimentovat. Ukončení je perfektní, hlídání mezí funguje, ale katastrofa nastala když jsem zadal desetinné číslo nebo něco jiného než číslo. Neočekávaný znak program zacyklí a musí se zabít:

Kód: Vybrat vše

Musis vzit alespon jednu zapalku, zkus to znovu!
Musis vzit alespon jednu zapalku, zkus to znovu!
Musis vzit alespon jednu zapalku, zkus to znovu!
Musis vzit alespon jednu zapalku, zkus to znovu!
Musis vzit alespon jednu zapalku, zkus to znovu!
Musis vzit alespon jednu zapalku, zkus to znovu!^C

Pomohlo by po čtení čísla vyprázdnit vstupní buffer, a kontrolovat jestli se něco načetlo.

Koukám že Visual Studio stále dodržuje maloměkký standard. Zase skoro padesátikilový exáč, když mě se to zkompiluje do šesti a kousku kilobajtů. 8)
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Malá sestava do 30 tisíc
    od kupjec » 20 zář 2023 21:24 » v Rady s výběrem hw a sestavením PC
    14
    2184
    od kupjec Zobrazit poslední příspěvek
    25 zář 2023 11:26
  • Výběr skříně (zakoupená je malá) Příloha(y)
    od DaveMove » 09 čer 2023 15:35 » v Problémy s hardwarem
    8
    790
    od meda2016 Zobrazit poslední příspěvek
    09 čer 2023 20:27

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti