Piskvorky jsou hra pro dva hráce, kterí strídave umístují do polícek na hrací plochu v podobe ctvereckové síte své znacky. Jeden pouzívá zpravidla krízky, druhý kolecka. Znacky nelze umístovat na jiz obsazené polícko. Vyhrává ten, jemuz se podarí utvorit radu peti kolecek/krízku bezprostredne vedle sebe ve smeru svislém, vodorovném nebo úhloprícném (celkem tedy 4 smery).
Naprogramujte piskvorky. Program vytvorí hrací plochu o zadaných rozmerech, bude strídave vyzývat hráce k zadání souradnic, kam se jejich znacka má umístit. Po umístení znacky se vykreslí aktuální stav hrací plochy. Jako kolecko pouzijte písmeno 'o', jako krízek 'x'. Pri výhre se vítezná petice zvýrazní na velké písmeno 'O' nebo 'X', hrací plocha se vykreslí a program skoncí.
Program precte z príkazového rádku krome názvu programu piskvor dalsí dva nebo tri parametry.
První parametr je pocet sloupcu hrací plochy z rozmezí 5 az 26, druhý pocet rádku z rozmezí 5 az
22.
Tretí parametr není pro uzivatele povinný, muze být 'x' nebo 'o' a urcuje, kdo má zacít.
Pokud tretí parametr není zadaný, zacíná 'x'.
Souradnice sloupce budou oznaceny písmeny pocínaje 'A', souradnice rádku císly pocínaje 1. Napríklad na hrací plose 5x5 je souradnice levého horního rohu A1, pravého dolního E5. Uzivatel muze zadat souradnici sloupce i malým písmenem - a1, e5.
Pri vykreslování hrací plochy se mezi jednotlivé sloupce vkládá mezera, aby byly odstupy mezi rádky a sloupci priblizne stejné. Pro lepsí orientaci hrácu bude nad kazdým sloupcem jemu odpovídající písmeno a vlevo od kazdého rádku jeho císlo. Jednociferná císla vhodným zpusobem doplnte na dva znaky, napríklad levostrannou nulou, nebo levo- ci pravostrannou mezerou, aby nedocházelo k nezádoucím posunum rádku s jednociferným císlem vuci rádkum s dvojciferným císlem. V zájmu prehlednosti nevykreslujte ctvercovou sít.
piskvor.c. PrintArea, která vykreslí hrací plochu.
void PrintArea(const int col, const int row, char area[col][row]);xoRead, která bude mít na starost nacítání polohy nové znacky
a funkci isWinner, která rozlisí, zda uz nekdo nevyhrál. malloc - tato verze
Cécka dovoluje deklarovat (lokální) pole dynamicky i tak, ze se jako
jeho mez uvede promenná nebo výraz. main muzete pouzít unixový príkaz
echo $?
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int i,j,k,stlpce,riadky,stlpec,riadok,pocet_platnych_suradnic=0,pocet;
char ide='x',znak,retazec;
/*-------------------------- xoRead -----------------------------------------*/
int xoRead(char plocha[riadky][stlpce])
{
do {
if (ide=='x') printf("Ide krizik:\n");
else printf("Ide koliesko:\n");
scanf("%c",&znak);
if ((znak)=='*') return 1;
scanf("%d",&riadok);
getchar();
stlpec=toupper(znak)-64;
if ((stlpec<1||stlpec>stlpce)||(riadok<1||riadok>riadky) )
{printf("Suradnice su mimo hracej plochy!\n");continue;}
/*-------------- zapis do pola --------------*/
if (plocha[riadok-1][stlpec-1]!='.')
{printf("Dane policko je uz obsadene! \n");continue;}
else
{
if (ide=='x')
{plocha[riadok-1][stlpec-1]='x';
ide='o';
}
else
{plocha[riadok-1][stlpec-1]='o';
ide='x';
}
}break;
}while (1==1);
return 0;
}
/*-------------------------- PrintArea() -----------------------------------*/
int PrintArea(const int rows,const int cols,char plocha[rows][cols])
{
printf(" ");
for (i=0;i<cols;i++)
printf("%c ",((char)(i+65)));
printf("\n");
for(i=0;i<rows;i++)
{for(j=0;j<cols;j++)
{if (j==0) printf("%2.0d ",i+1);
printf("%c ",plocha[i][j]);
}
printf("\n");
}
return 0;
}
/*-------------------------- isWinner() ------------------------------------*/
int isWinner(char plocha[riadky][stlpce])
{
znak=plocha[riadok-1][stlpec-1],pocet=0;
if (ide=='x') ide='o';
else ide='x';
/*-------- smer - -------------*/
for(i=-4;i<=4;i++)
{ if (!((stlpec+i)<1||(stlpec+i)>stlpce))
{ if (plocha[riadok-1][stlpec+i-1]==ide) pocet++;
else pocet=0;
printf("%d\n",pocet);
if (pocet==5)
{
for(j=0;j<5;j++)
plocha[riadok-1][(stlpec+i-1-j)]=toupper(ide);
printf("Mame vytaza: %c\n",ide);return 1;
}
}
}
/*-------- smer | -------------*/
for(i=-4;i<=4;i++)
{ if (!((riadok+i)<1||(riadok+i)>riadky))
{ if (plocha[riadok+i-1][stlpec-1]==ide) pocet++;
else pocet=0;
if (pocet==5)
{
for(j=0;j<5;j++)
plocha[riadok+i-1-j][(stlpec-1)]=toupper(ide);
printf("Mame vytaza: %c\n",ide);return 1;
}
}
}
/*-------- smer \ -------------*/
for(i=-4;i<=4;i++)
{ if (!( ((stlpec+i)<1)|| ((stlpec+i)>stlpce)||
((riadok+i)<1)||((riadok+i)>riadky)))
{ if (plocha[riadok+i-1][stlpec+i-1]==ide) pocet++;
else pocet=0;
if (pocet==5)
{
for(j=0;j<5;j++)
plocha[riadok+i-1-j][(stlpec+i-1-j)]=toupper(ide);
printf("Mame vytaza: %c\n",ide);return 1;
}
}
}
/*-------- smer / -------------*/
for(i=-4;i<=4;i++)
{ if (!( ((stlpec+i)<1)|| ((stlpec+i)>stlpce)||
((riadok+i)<1)|| ((riadok+i)>riadky)))
{ if (plocha[riadok-i-1][stlpec+i-1]==ide) pocet++;
else pocet=0;
printf("%d\n",pocet);
if (pocet==5)
{
for(j=0;j<5;j++)
plocha[riadok-i-1+j][(stlpec+i-1-j)]=toupper(ide);
printf("Mame vytaza: %c\n",ide);return 1;
}
}
}
if (ide=='x') ide='o';
else ide='x';
return 0;
}
/*=========================== MAIN =========================================*/
int main(int argc, char *argv[])
{
/*------------------testovanie kompil. parametrov --------------------------*/
if (argc>4) {printf("CHYBA:Prilis mnoho parametrov ");return 1;}
if (argc<3) {printf("Chyba=Zadaj parametre: pocet stlpcov a pocet"
"riadkov\n");
return 1;
}
if (argc>=3){stlpce=atoi(argv[1]);
riadky=atoi(argv[2]);
if ((stlpce<5||riadky<5)||(stlpce>26||riadky>22))
{printf("CHYBA:Nespravna hodnota parametra\n");
return 2;
}
}
if (argc==4){ ide=*argv[3];ide=tolower(ide);
/* if (ide=='o') ide='x';
if (ide=='x') ide='o';
*/
if ((ide!='x')&&(ide!='o'))
{printf("CHYBA: Ako treti parameter zadaj x/o\n");
return 2;
}
}
/*------------------- Definavanie dynamickeho pola ------------------------ */
char plocha[riadky][stlpce];
for(i=0;i<riadky;i++)
for(j=0;j<stlpce;j++ )
plocha[i][j]='.';
/*------------------ samotne TELO -----------------------------------------*/
do{ if (isWinner(plocha)) {PrintArea(riadky,stlpce,plocha); return 0;}
PrintArea(riadky,stlpce,plocha);
if ((stlpce*riadky)==pocet_platnych_suradnic++)
{printf("Hra nema vytaza\n");return 0;}
}while (!(xoRead(plocha)));
printf("\n");
scanf("%d",&a);
return 0;
}