Piškvorky 10x10 problem s testovanim – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Piškvorky 10x10 problem s testovanim – C / C++ – Fórum – Programujte.comPiškvorky 10x10 problem s testovanim – C / C++ – Fórum – Programujte.com

 

nebula
~ Anonymní uživatel
3 příspěvky
31. 5. 2013   #1
-
0
-

Zdravim, dělám do školy piškvorky o pole 10x10, celkově už to skoro mám, ale nevím si rady s testováním diagonal a sloupců. Test sloupců mi funguje akorát na levé straně pole odshora dolu. 

#include <stdio.h>
#include <stdlib.h>

char pole[10][10];  
int t;
char kontrola(void);
void init_pole(void);
void tah_hrace(void);
void tah_pocitace(void);
void zobr_pole(void);
char a;
int Q;
char cesta[61];
FILE *f;
int main(void)
{
  char done;


  

  done =  ' ';
  init_pole();

  do {
    zobr_pole();
    tah_hrace();
    done = kontrola(); /* see if winner */
    if(done!= ' ') break; /* winner!*/
    tah_pocitace();
    done = kontrola(); /* see if winner */
  } while(done== ' ');

  zobr_pole();
  if(done=='X') printf("\nVyhral jsi!\n");
  else printf("\nVyhral PC!\n");
   printf("\nChces ulozit?(A, N)");
   scanf("%s",&a);
   switch (a){
          case 'a':
               case 'A':
                    printf("Zadej cestu: ");
                    scanf("%60s", cesta);
                    f=fopen(cesta,"a+");
                      for(t=0; t<10; t++) {
    fprintf(f," %c | %c | %c | %c | %c | %c | %c | %c | %c | %c ",pole[t][0],
            pole[t][1], pole [t][2], pole [t][3], pole [t][4], pole [t][5], pole [t][6], pole [t][7]
            , pole [t][8], pole [t][9]);
    if(t!=10) fprintf(f,"\n---|---|---|---|---|---|---|---|---|---\n");
  break;
        case 'n':
             case 'N':
                  return 1;
                  break;
  }
  printf("\n");

}
  fclose(f);
                    
   

  getchar();
  getchar();
}

/* inicializuje pole */
void init_pole(void)
{
  int i, j;

  for(i=0; i<10; i++)
    for(j=0; j<10; j++) pole[i][j] =  ' ';
}

/* Tah hrace */
void tah_hrace(void)
{
  int x, y;

  printf("Zadej souradnice X,Y pro tvuj krok - napr. 1,1: \n");
  scanf("%d%*c%d", &x, &y);
  

  x--; y--;

  if(pole[x][y]!= ' '){
    printf("Spatny krok, zkus to znova.\n");
    tah_hrace();
  }
  else pole[x][y] = 'X';
}

/* tah pocitace. */
void tah_pocitace(void)
{
  int i, j;
  for(i=0; i<10; i++){
    for(j=0; j<10; j++)
      if(pole[i][j]==' ') break;
    if(pole[i][j]==' ') break;
  }

  if(i*j==9)  {
    printf("Remiza!\n");
    exit(0);
  }
  else
    pole[i][j] = 'O';
}

/* Zobrazí pole na obrazovku */
void zobr_pole(void)
{
  printf("Y 1  2   3   4   5   6   7   8   9   10\n");
  

    
  for(t=0; t<10; t++) {
    printf(" %c | %c | %c | %c | %c | %c | %c | %c | %c | %c ",pole[t][0],
            pole[t][1], pole [t][2], pole [t][3], pole [t][4], pole [t][5], pole [t][6], pole [t][7]
            , pole [t][8], pole [t][9]);
    if(t!=10) printf("\n---|---|---|---|---|---|---|---|---|---\n");
  }
  printf("\n");
}


char kontrola(void)
{
  int i;

  for(i=0; i<3; i++)  /* kontroluje radky */
    if((pole[i][0]==pole[i][1] && pole[i][0]==pole[i][2] && pole[i][0]==pole[i][3]))
      return pole[i][0];
    if(pole[i][1]==pole[i][2] && pole[i][1]==pole[i][3] && pole[i][1]==pole[i][4])
      return pole[i][0];
    if(pole[i][2]==pole[i][3] && pole[i][2]==pole[i][4] && pole[i][2]==pole[i][5])
      return pole[i][0];   
    if(pole[i][3]==pole[i][4] && pole[i][3]==pole[i][5] && pole[i][3]==pole[i][6])
      return pole[i][0];
    if(pole[i][4]==pole[i][5] && pole[i][4]==pole[i][6] && pole[i][4]==pole[i][7])
      return pole[i][0];
    if(pole[i][5]==pole[i][6] && pole[i][5]==pole[i][7] && pole[i][5]==pole[i][8])
      return pole[i][0];
    if(pole[i][6]==pole[i][8] && pole[i][6]==pole[i][9] && pole[i][6]==pole[i][10])
      return pole[i][0];
  
  
       

  for(i=0; i<3; i++)  /* kontroluje sloupce */
    if(pole[0][i]==pole[1][i] && pole[0][i]==pole[2][i] && pole[0][i]==pole[3][i])
      return pole[0][i];
    if(pole[1][i]==pole[2][i] && pole[1][i]==pole[3][i] && pole[1][i]==pole[4][i]) 
      return pole[0][i];
    if(pole[2][i]==pole[3][i] && pole[2][i]==pole[4][i] && pole[2][i]==pole[5][i])
      return pole[0][i]; 
    if(pole[3][i]==pole[4][i] && pole[3][i]==pole[5][i] && pole[3][i]==pole[6][i])
      return pole[0][i];
    if(pole[4][i]==pole[5][i] && pole[4][i]==pole[6][i] && pole[4][i]==pole[7][i])
      return pole[0][i];
    if(pole[5][i]==pole[6][i] && pole[5][i]==pole[7][i] && pole[5][i]==pole[8][i])
      return pole[0][i];
    if(pole[6][i]==pole[7][i] && pole[6][i]==pole[8][i] && pole[6][i]==pole[9][i])
      return pole[0][i];
    if(pole[7][i]==pole[8][i] && pole[7][i]==pole[9][i] && pole[7][i]==pole[10][i])
      return pole[0][i];
    
    

  /* testuje diagonaly */
  if(pole[0][0]==pole[1][1] && pole[1][1]==pole[2][2] && pole[2][2]==pole[3][3])
    return pole[0][0];
  if(pole[0][2]==pole[1][1] && pole[1][1]==pole[2][0])
       return pole[0][2];


  return ' ';
getchar();
getchar();
}
Nahlásit jako SPAM
IP: 91.229.254.–
ingiraxo+15
Grafoman
31. 5. 2013   #2
-
0
-

nechce se mi to celý kontrolovat, ale na první pohled ti tam chybějí závorky ve funkci "kontrola", takto se ti cyklus vykoná jen pro první podmínku

potom nechápu, proč máš matici typu char, použij bool, případně unsigned (stačí ti jen hodnoty 1/0)

dále se zamysli trochu nad optimalizací, představ si pole pro piškvorky 100x100 nebo větší, timto způsobem by to nešlo moc dobře :)

Nahlásit jako SPAM
IP: 93.90.162.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Kowalsky950
Stálý člen
1. 6. 2013   #3
-
+1
-
Zajímavé

Taky jsem dělal piškvorky.......teoreticky: vnoř si dva cykly ktere ti projedou všechna pole (jednou stačí, nemusíš víckrát)

for (int a=0;a<10;a++) 
	{
	for (int b=0;b<10;b++)
		{
		if
		//radky
		(pole[a][b]==pole[a+1][b]==pole[a+2][b]==pole[a+3]==pole[a+4][b]
		//sloupce
		||pole[a][b]==pole[a][b+1]==pole[a][b+2]==pole[a][b+3]==pole[a][b+4]
		//diagonalne
		||pole[a][b]==pole[a+1][b+1]==pole[a+2][b+2]==pole[a+3][b+3]==pole[a+4][b+4])
			{
			//zde bude kod ktery se spusti jakmile program najde pet stejnych 
                        //znaku za sebou, teoreticky by se sem melo pridatjeste break;
			}
		}
       }

Nejaka optimalizace:

-jednak si musíš pohlídat aby program nešel za konec pole, tudíž někdy nemůže být a+4>10 a taky b+4>10

-jestli máš ruzné znaky pro jednoho hráče, druhého, a nějaký prázdný znak, poté ti to bdue brat aji prázný znak který z tama musíš vyřadit

-trošku propracuj ten kompl :D ....

pozn.: jestli máš zájem tak mi napiš do zpráv a nějak to můžem dodělat i spolu ;-)

Nahlásit jako SPAM
IP: 90.176.114.–
vitamin+8
Grafoman
1. 6. 2013   #4
-
0
-

#1 nebula

Ak hrac urobi tah, tak potom nemusis testovat celu hernu plochu, staci len okolne body okolo suradnice kde hrac vlozil znak.

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
nebula
~ Anonymní uživatel
3 příspěvky
1. 6. 2013   #5
-
0
-

#3 Kowalsky95
Ahoj, klidně bych měl. Už to mam hotové skoro akorát ta kontrola dělá problém. Předělával jsem to z piškvorek 3x3 co jsem si stáhnul. Mam to do úterý odevzdat a mam z toho hlavu jak pátrací balon :D A jelikož v C++ moc dobrej nejsem, tak mi jde hlavně o to, abych nedostal za 5 :)

přidal jsem zadání jmen obou hráčů a aby to hrál hráč proti hráči.

#include <stdio.h>
#include <stdlib.h>
    struct{
           char jmeno[10];
          }hrac;
    struct{ char jmeno2[10];
            }hrac2;
         
char pole[10][10]; 
int t;
char kontrola(void);
void init_pole(void);
void tah_hrace(void);
void tah_hrace2(void);
void zobr_pole(void);
char a;
int Q;
char cesta[61];
FILE *f;
int main(void)
{
  char done;

  printf("*****************************************\n");
  printf("*                                       *\n");
  printf("*          Martin Maly 2. AP            *\n");
  printf("*           Piskvorky 10x10             *\n");
  printf("*                                       *\n");
  printf("*****************************************\n");
  printf("\n");
 
  printf("Zadej jmeno prvniho hrace:\n");
  scanf("%s",hrac.jmeno);
  printf("Zadej jmeno druheho hrace:\n");
  scanf("%s",hrac2.jmeno2);
  done =  ' ';
  init_pole();

  do {
    zobr_pole();
    tah_hrace();
    done = kontrola(); /* see if winner */
    if(done!= ' ') break; /* winner!*/
    tah_hrace2();
    done = kontrola(); /* see if winner */
  } while(done== ' ');

  zobr_pole();
  if(done=='X') printf("\nVyhral %s\n",hrac.jmeno);
  else printf("\nVyhral PC!\n");
   printf("\nChces ulozit?(A, N)");
   scanf("%s",&a);
   switch (a){
          case 'a':
               case 'A':
                    printf("Zadej cestu: ");
                    scanf("%60s", cesta);
                    f=fopen(cesta,"a+");
                      for(t=0; t<10; t++) {
    fprintf(f," %c | %c | %c | %c | %c | %c | %c | %c | %c | %c ",pole[t][0],
            pole[t][1], pole [t][2], pole [t][3], pole [t][4], pole [t][5], pole [t][6], pole [t][7]
            , pole [t][8], pole [t][9]);
    if(t!=10) fprintf(f,"\n---|---|---|---|---|---|---|---|---|---\n");
  break;
        case 'n':
             case 'N':
                  return 1;
                  break;
  }
  printf("\n");

}
  fclose(f);
                   
  

  getchar();
  getchar();
}

/* inicializuje pole */
void init_pole(void)
{
  int i, j;

  for(i=0; i<10; i++)
    for(j=0; j<10; j++) pole[i][j] =  ' ';
}

/* Tah hrace */
void tah_hrace(void)
{
  int x, y;

  printf("Hraci %s zadej souradnice X,Y pro tvuj krok - napr. 1,1: \n",hrac.jmeno);
  scanf("%d%*c%d", &x, &y);
 

  x--; y--;

  if(pole[x][y]!= ' '){
    printf("Spatny krok, zkus to znova.\n");
    tah_hrace();
  }
  else pole[x][y] = 'X';
}

/* tah pocitace. */
void tah_hrace2(void)
{
  int i, j;

  printf("Hraci %s zadej souradnice X,Y pro tvuj krok - napr. 1,1: \n",hrac2.jmeno2);
  scanf("%d%*c%d", &i, &j);
 

  i--; j--;

  if(pole[i][j]!= ' '){
    printf("Spatny krok, zkus to znova.\n");
    tah_hrace2();
  }
  else pole[i][j] = 'O';
}

/* Zobrazí pole na obrazovku */
void zobr_pole(void)
{
  printf("Y 1  2   3   4   5   6   7   8   9   10\n");
 

   
  for(t=0; t<10; t++) {
    printf(" %c | %c | %c | %c | %c | %c | %c | %c | %c | %c ",pole[t][0],
            pole[t][1], pole [t][2], pole [t][3], pole [t][4], pole [t][5], pole [t][6], pole [t][7]
            , pole [t][8], pole [t][9]);
    if(t!=10) printf("\n---|---|---|---|---|---|---|---|---|---\n");
  }
  printf("\n");
}


char kontrola(void)
{
  int i;

  for(i=0; i<3; i++)  /* kontroluje radky */
    if((pole[i][0]==pole[i][1] && pole[i][0]==pole[i][2] && pole[i][0]==pole[i][3]))
      return pole[i][0];
    if(pole[i][1]==pole[i][2] && pole[i][1]==pole[i][3] && pole[i][1]==pole[i][4])
      return pole[i][0];
    if(pole[i][2]==pole[i][3] && pole[i][2]==pole[i][4] && pole[i][2]==pole[i][5])
      return pole[i][0];  
    if(pole[i][3]==pole[i][4] && pole[i][3]==pole[i][5] && pole[i][3]==pole[i][6])
      return pole[i][0];
    if(pole[i][4]==pole[i][5] && pole[i][4]==pole[i][6] && pole[i][4]==pole[i][7])
      return pole[i][0];
    if(pole[i][5]==pole[i][6] && pole[i][5]==pole[i][7] && pole[i][5]==pole[i][8])
      return pole[i][0];
    if(pole[i][6]==pole[i][8] && pole[i][6]==pole[i][9] && pole[i][6]==pole[i][10])
      return pole[i][0];
 
 
      

  for(i=0; i<3; i++)  /* kontroluje sloupce */
    if(pole[0][i]==pole[1][i] && pole[0][i]==pole[2][i] && pole[0][i]==pole[3][i])
      return pole[0][i];
    if(pole[1][i]==pole[2][i] && pole[1][i]==pole[3][i] && pole[1][i]==pole[4][i])
      return pole[0][i];
    if(pole[2][i]==pole[3][i] && pole[2][i]==pole[4][i] && pole[2][i]==pole[5][i])
      return pole[0][i];
    if(pole[3][i]==pole[4][i] && pole[3][i]==pole[5][i] && pole[3][i]==pole[6][i])
      return pole[0][i];
    if(pole[4][i]==pole[5][i] && pole[4][i]==pole[6][i] && pole[4][i]==pole[7][i])
      return pole[0][i];
    if(pole[5][i]==pole[6][i] && pole[5][i]==pole[7][i] && pole[5][i]==pole[8][i])
      return pole[0][i];
    if(pole[6][i]==pole[7][i] && pole[6][i]==pole[8][i] && pole[6][i]==pole[9][i])
      return pole[0][i];
    if(pole[7][i]==pole[8][i] && pole[7][i]==pole[9][i] && pole[7][i]==pole[10][i])
      return pole[0][i];
   
   

  /* testuje diagonaly */
  if(pole[0][0]==pole[1][1] && pole[1][1]==pole[2][2])
    return pole[0][0];
  if(pole[0][2]==pole[1][1] && pole[1][1]==pole[2][0])
       return pole[0][2];


  return ' ';
getchar();
getchar();
}

Nahlásit jako SPAM
IP: 91.229.254.–
KIIV
~ Moderátor
+43
God of flame
1. 6. 2013   #6
-
0
-

na co te upozornil ingiraxo tam furt nemas...

budes muset trosku nastudovat, kolik ze to vlastne vykona for cyklus prikazu ... napoveda: jedinej

jak jich chces vic, musis je dat do bloku { }

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
nebula
~ Anonymní uživatel
3 příspěvky
1. 6. 2013   #7
-
0
-

#6 KIIV
No ale jak to dám do bloku, tak se mi po zadání O druhého hráče hra ukončí s odpovědí že vyhrál hráč 1

Nahlásit jako SPAM
IP: 91.229.254.–
KIIV
~ Moderátor
+43
God of flame
1. 6. 2013   #8
-
0
-

tak to mas blbe no :)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kowalsky950
Stálý člen
1. 6. 2013   #9
-
0
-

Jestli to vážně máš odevzdat do úterý tak mi napiš na pata.va@seznam.cz nebo si mě najdi na FB. Dáme to dohromady, jeden zdroják piškvorek už mám takže si to mužem společně prostudovat....

Nahlásit jako SPAM
IP: 90.176.114.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Podobná vlákna

Problem s testovanim na IS — založil gully

Piškvorky — založil rundll32.exe

Piškvorky — založil verunka.41

Piškvorky — založil cacnejka

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý