/* * * * * * * * * * * * * * *
* NIM - Odebírání zápalek *
* 2010-02-20/21 *
* * * * * * * * * * * * * * */
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<unistd.h>
#include<string.h>
/* Délka pauzy pro sleep: Linux 1, Windows 1000 */
#define SEKUNDA 1
int minuly=0;
|
/*******************************************************************************
* Nakreslení zápalek
*/
void maluj(int n)
{
int i,j;
putchar('\n');
for(i=0;i<=3;++i)
{
for(j=0;j<n;++j)
if(i)
printf(" |"); /* dřívko */
else
printf(" O"); /* hlavička */
putchar('\n');
}
putchar('\n');
return;
}
|
/*******************************************************************************
* Výpis počtu zápalek
*/
void vypis(int n)
{
printf("Na stole leží %d zápal",n);
/* koncovka podle poslední číslice */
if(n>10&&n<20)
printf("ek");
else
switch(n%10)
{
case 1:
printf("ka");
break;
case 2:
case 3:
case 4:
printf("ky");
break;
default:
printf("ek");
break;
}
printf(", ");
return;
}
|
/*******************************************************************************
* Vstup čísla z klávesnice
* bez zadání vrací minulé
* při chybě nulu
*/
int cislo(void)
{
static int cislo=0;
char vstup[1000];
gets(vstup);
if(strlen(vstup))
cislo=atoi(vstup);
else
cislo=minuly;
return cislo;
}
|
/*******************************************************************************
* Hodnocení výsledku při ukončení programu
*/
void sbohem(int n)
{
int i;
char zprava[17][71]={"Tak to tobě se říká hanba lidstva? Přeji ti brzké vyhynutí!",
"Neber to osobně, ale myslím že jsem ti pořádně nakopal prdel!",
"Dalo by se říct že jsem tě pěkně vydrtil, človíčku!",
"Máš už dost? Nebo ti mám na cestu ještě párkrát přidat!",
"Ještě trochu zaber a budeš chytřejší než počítačová myš!",
"Slabota, je vidět že lidský mozek se počítači nemůže vyrovnat!",
"Dost mizerný výkon i na člověka, musíš se víc snažit!",
"Teda nic moc, čekal jsem od tebe trochu lepší výkon!",
"Nebylo to špatné, snad to příště ještě trochu vylepšíš!",
"Docela to tentokrát ušlo, vidím že jsi nejspíš trénoval!",
"Tomu říkám dobrá hra, doufám že se brzy uvidíme znova!",
"Lidstvo na tebe může být pyšné, hrál jsi fakticky výborně!",
"Vynikající výsledek, pravděpodobně jsem se střetl s géniem!",
"Neuvěřitelné, nikdy by mě nenapadlo že prohraji o tolik!",
"Fantastický výkon, málem se mi z toho přehřál procesor!",
"Po tak strašné porážce má další existence postrádá smysl,",
"loučím se s tebou a formátuji svůj harddisk!"},
format[6][33]={"Zatím nic důležitého.",
"Jde to jako po másle.",
"Tohle jsem hledal...",
"Teď už to neopravíš.",
"Co to tu máš? Policii na tebe!",
"Moc toho už nezbývá..."};
if(n<15)
printf("%s\n",zprava[n]);
else
{
printf("%s\n%s\n",zprava[15],zprava[16]);
sleep(SEKUNDA);
putchar('\n');
for(i=0;i<=5;++i)
{
printf("\a%2d%% - %s\n",i*10,format[i]);
sleep(SEKUNDA);
}
printf("\nTak dobře, jen jsem žertoval, ale příště ti to určitě nandám!\n");
sleep(SEKUNDA);
}
return;
}
|
/*******************************************************************************
* Smyčka se hrou, vrací
* 0 - vyhrál počítač
* 1 - vyhrál člověk
* 2 - přerušení hry
*/
int hra(void)
{
int pocet,max,odber;
static int poradi=-1;
/* když začíná první hra, není nastavené poslední pořadí */
if(poradi<0)
poradi=rand()%2;
if(poradi)
printf("Začíná člověk:\n");
else
printf("Začíná počítač:\n");
/* smyčka pro odebírání zápalek */
for(pocet=2*(rand()%6)+17,max=rand()%4+2;pocet>1;pocet-=odber)
{
maluj(pocet);
if((poradi=1-poradi))
{
if(!(odber=(pocet-1)%(max+1)))
odber=(rand()%max)+1;
vypis(pocet);
printf("počítač bere %d\n",odber);
}
else
{
do
{
vypis(pocet);
printf("můžeš vzít 1 až %d: %d \r",max,minuly);
vypis(pocet);
printf("můžeš vzít 1 až %d: ",max);
odber=abs(cislo()); /* bere kladná i záporná */
if(!odber)
{
minuly=0;
printf("\aOpravdu chceš skončit? Opakuj volbu nebo zadej počet: ");
odber=cislo();
if(!odber)
return 2; /* požaduje ukončení programu */
}
}while(odber>max||odber>pocet);
minuly=odber; /* uložení čísla pro příště */
}
}
if(!pocet)
poradi=1-poradi; /* když hráč vzal poslední zápalku */
return poradi;
}
|
/*******************************************************************************
* Hlavní program, počítá kola a volá hru
*/
int main(void)
{
int kolo,vysledek,clovek=0,pocitac=0;
/* titulní obrazovka */
printf("*******************************************************\n"
" * O O O O O N I M O O O O O * \n"
" * | | | | | Odebírání zápalek | | | | | * \n"
" * | | | | | (C)2010 FARAON | | | | | * \n"
"*******************************************************\n");
printf("| Hraješ proti počítači, střídavě odebíráte zápalky |\n"
"| ležící na stole. Pro každé kolo je jiný maximální |\n"
"| možný počet, který můžete zvednout. Kdo vezme |\n"
"| poslední zápalku, prohrává! Program si pamatuje |\n");
printf("| a nabízí poslední odběr, který je možné povrdit |\n"
"| stisknutím klávesy Enter. Hra se ukončuje zadáním |\n"
"| dvou nul za sebou, na závěr vypíše hodnocení. |\n"
"\\_____________________________________________________/\n\n");
sleep(2*SEKUNDA);
srand((unsigned)time(NULL));
/* hlavní smyčka */
for(kolo=1;(vysledek=hra())<2;++kolo)
{
putchar('\n');
printf("\aVyhrál ");
if(vysledek)
{
++pocitac;
printf("počítač");
}
else
{
++clovek;
printf("člověk");
}
printf(", stav po %d. kole je ",kolo);
if(pocitac>clovek)
printf("%d : %d pro počítač.\n",pocitac,clovek);
else
if(clovek>pocitac)
printf("%d : %d pro člověka.\n",clovek,pocitac);
else
printf("remíza %d : %d.\n",clovek,pocitac);
putchar('\n');
sleep(2*SEKUNDA);
}
/* závěrečné hodnocení */
putchar('\n');
if(kolo==1)
printf("Vzdáváš to hned v prvním kole? To jsi teda sralbotka!\n");
else
{
printf("Dosáhl jsi %d vítězství, počítač %d, tvoje úspěšnost je %d%%.\n",clovek,pocitac,100*clovek/(kolo-1));
if(pocitac)
sbohem(10*clovek/pocitac);
else
sbohem(15);
}
sleep(2*SEKUNDA);
printf("\nTento program je šířen bez záruky, pod licencí\n"
"GNU GPL verze 3: www.gnu.org www.gnugpl.cz\n"
"Autor: faraon@instructor.net\n");
return 0;
}
|
|