» »

c++ križci, krožci

c++ križci, krožci

enadiz ::

Rad bi naredil igrico križci, krožci v programskem jeziku c++.
Poskušal sem z IF stavki(ter izpis igralnega polja...).
Igrice še nisem dokončal pa že sedaj vsebuje več kot 1000 vrstic izvorne kode.
Zanima ma če obstajajo kakšne druge funkcije s katerimi bi lažje naredil to igro...
Lp enadiz

c00L3r ::

Vse gre naredit z IF stavki. Je pa zelo nepregledno. Sam si napiši svoje pomožne funkcije. Kot recimo preveriKonec(), poisciPotezo() ipd... Uporabljaš kake podatkovne strukture? Kako imaš shranjeno igralno polje? Kot 2 dimenzionalno tabelo 3x3?

enadiz ::

Spodaj je primer kode...
Sem začetnik, zato z funkcijami in podatkovnimi strukturami še nisem delal ...
Prosim, pokaži mi primer...

else
          if (a ==3 && b == 5) 
         {
                
cout << "_______________________________" <<  endl;
cout << "|       |           |         | " <<  endl;
cout << "|       |           |    X    | " <<  endl;
cout << "_______________________________" <<  endl;
cout << "_______________________________" <<  endl;
cout << "|       |           |         | " <<  endl;
cout << "|       |    0       |         | " <<  endl;
cout << "_______________________________" <<  endl;
cout << "_______________________________" <<  endl;
cout << "|       |           |         | " <<  endl;
cout << "|       |           |         | " <<  endl;
cout << "_______________________________" <<  endl;  

}

c00L3r ::

Uporabljaš kako razvojno okolje? Dev C++? Sam sem začel v Pascal in C++. Jaz vsakemu začetniku v programiranju priporočam sicer Javo ali C#, ker je po mojem mnenju preprosteje. Sintaksa pa je zelo podobna c/c++.
Primer funkcij v c++

Sicer pa ti svetujem da si namestiš Visual C# express za programiranje v C#. Že pa želiš delati v Javi pa Eclipse ali NetBeans za Javo.

Lahko pa seveda nadaljuješ tudi v C++.

Prva stvar, ki bo jo jaz naredil je funkcija
izpisVrstice(int stVrstice)

-ta metoda pogleda kaj je v kerem polju shranjeno, na kerem mestu in izpiše X ali O, če je tam kaj, sicer presledek.

Igralno polje bi shranil v dvodimenzionalno polje. 3x3 polje narediš tako:
int igralnoPolje [3][3];

AndrejS ::

Pogledam kodo in jooooj !

crush ::

@enadiz: iz tvojega primera je jasno razvidno, da ti manjka precej osnovne logike programiranja. Jst ti svetujem, da zaceno opustis "krizce-krozce" in raje naredis kak osnoven tutorial o programiranju - lahko zacnes tudi v C++.

p.s.: moja opazka je letela na vse tiste vrstice, ki si jih potreboval za izpisovanje

Monster ::

... predvsem si poglej zanke ;)
Ka zaboga...

enadiz ::

c00L3r: ja uporabljam Dev C++, če se je res lažje naučiti programirati v C# ali v Javi potem se bom odločil za enega od teh dveh... Zanimam me kaj je lažje narediti(čemu je namenjen) C# in Java
Drugače se pa C++ učim ene 14 dni prek youtuba...

crush: verjamem da je tale koda slaba, kar ni tako čudno če upoštevaš da se programiranja učim 14 dni ter da
hodim v OŠ...

Hvala za odgovore...

dr eu ::

Poglej si kodo na moji strani, morda ti bo v pomoč:
cpp-beginner.freehost386.com/kode1.htm#sTicTacToe

c00L3r ::

Kar se tiče primerjave C#/Java proti C++. Knjižnice, ki jih dobiš zraven .Net (c#) in Java SE ogrodja so lažje za uporabo. Logiko programa naredit je enako težko. Prav tako v C#/Java nimaš kazalcev in ročnega dodeljevanja pomnilnika. Ko prideš malo naprej v znanju programiranja ugotoviš, da je tudi dedovanje razredov in overload-anje metod lažje. Večino teh stvari, kaj sem ti napisal, boš razumel, ko jih boš moral prvič uporabit.

golobich ::

Igralno polje bi shranil v dvodimenzionalno polje. 3x3 polje narediš tako:
int igralnoPolje [3][3];


dvodimenzionalna tabela nemore bit tipa int, ker v tabelo nebomo vpisovali številke.
Ker imamo x in o ---> se pravi en sam znak, bi morala biti tabela tipa char!
In če si prihranimo trud, bi bilo dobro, da ta tabela ni lokalna spremenljika ampak globalna!
se pravi jo napišemo takoj pod using namespace std;

se pravi...
#include <iostream>
using namespace std;
char igralnoPolje[3][3];

----------------------------
zdej se moreš vprašat naslednje:
- bo igral uporabnik proti računalniku ali
- bo igral uporabnik proti uporabniku (2 igralca)

v prvi primer se nečem spuščat ker nimam veliko znanja o samem programu in se ga šele učim!
Glede druzga primera ti lahko pomagam.
Prvo lahko vprašaš igralca al bo igral z križci al z krožci in bo vnesel svojo izbiro...
se pravi...ena spremenljivka, vprašanje...izbira...vnos.

približno takole:

   int a;    
    cout<<"Igra je za dva igralca!"<<endl;
    cout<<"Izberite številko pred odgovorom! Z katerimi zelite igrati?"<<endl;
    cout<<"1) Krizci"<<endl;
    cout<<"2) Krozci"<<endl;
    cin>>a;


Gremo naprej...Bistvene razlike ni če izbereš ena ali če izbereš dva.
Razlika je smo v tem da zaštartajo v prvem primeru križci, v drugek ma krožci.
Se pravi potrebujemo dva if stavka (ali vnese uporabnik 1 ali 2).
Predlagam še eno for zanko, ki se bo izvedla samo enkrat, da bomo lahko uporabli ukaz brake.

if (a==1)
    {
             bool konec=false;
             for (int i=0; i<1; i++)
             {


Videt je, da sem uporabil novo spremenljivko tipa bool (pravilno, nepravilno).
Zakaj sm jo uporabu...ta spremenljivka nam bo povedala ali so križci ali krožci postavljeni tri v vrsto.
Saj veste...trije enaki znaki horizontalno, vertikalno ali diagonalno.

no zj moreš pa samo še funkcijo napisat ki bo preverla ali so vsi trije znaki horizontalno ali vertikalno ali diagonalno in rezultat preneseš v spremenljivko konec (namig: funkcija bo tipa bool in bo vrnla vrednost ---> return.

konec=konec_zm_krozci ();
                            if (konec==true)
                            {
                                            break;
                            }



Potem moreš še naredt funkcijo ki bo preverla ali je na poziciji na kero želiš postavit križec ali krožec že znak (če je, tam pač nebo mogoče postavit znaka). Seveda potrebuješ še funkcijo za izpis tabele (dve for zanke ki gresta od 0 do 2), funkcijo za vstavljanje x-e in o-e (ali pa če narediš z zanko). Sm še kaj pozabu? Niti ne. Nakoncu te naše for zanke ki se enkrat izvede, ponucamo if stavek da se fprašamo kakšno vrednost ma konec (ki je tipa bol)...če ima vrednost false, potem ni zmagovalca:

if (konec==false)
                            {
                                             cout<<"Rezultat je neodlocen";
                            }

če je true, pa do if stavka sploh nebo prišlo ker se bo zanka končala (break stavek).

No in ko vse to narediš za izbiro 1, narediš enako za izbiro 2 (ni ti treba vse funkcije pol še enkrat pisat xD) enostavno zamenjaš. Tam ki so bli prej v for zanki ki se enkrat izvede križci bojo sedaj krožci in obratno.
Drugače pa sm si vzeu cajt pa pisu ta program v šoli med poukom, dokončau ga pa doma ;)

To je pač moj način, seveda obstaja veliko več načinov kako narediti to igrco. Vglavnem moje znanje c++ ni veliko. Znam strukture, zanke, tabele, stringe, funkcije, nekej malega pisanja v datoteke, tak da sm prišel do rešitve oz. do napisanega tega algoritma po dolgi poti. Veliko nepotrebne kode, bi se dalo veliko spremenit in skrajšat. Ampak, to pustim za drugič ko bom več znau. ;)

Vglavnem obilo sreče z to igrico, če boš meu pa kaka vprašanja, pa kr na dan z njim ;)

Lp golobich

c00L3r ::

golobich dobro napisano. Bi pa povdaril, da je tabela tipa integer zelo primerna za shranjevanje križcev in krogcev.
0 -> prazno polje
1 -> križec
2 -> krogec

Potem moraš samo primerjat cela števila, kar pa je lažje, kot nize znakov. Za lažje programiranje, bi si jaz naredil razred v katerem bi imel statično shranjene te vrednosti. Če delamo brez objektne orientiranosti, bi namesto tega uporabil globalne spremenljivke. Ne spomnim se več točno C++, ampak mislim, da obstaja rezervirana beseda const.

Nekaj v tem stilu:
const int praznoPolje = 0;
const int krizec = 1;
const int krogec = 2;


Ne morem popravit izpisa kode. Sem že večkrat poskusil. Prava koda je ta:
const int praznoPolje = 0;
const int krizec = 1;
const int krogec = 2;

Zgodovina sprememb…

  • spremenil: c00L3r ()

golobich ::

ja beseda konc je rezervirana beseda v C++ in pač spremenljivka je konstantna ;)
Drgače pa, kot sem rekel, obstaja veliko načinov, enega od načinov sem pa jaz prej gor napisu.

Ko sem šu jaz pisat kodo za to igro, sm si pač predstavlal tabelo in znake, zato sem dal tabelo tipa char.
Drugače sem pa 3 letnik računalniške in razredi pridejo šele zdaj na vrsto, tako da nevem kaj veliko o njih.
Naj bi bli samo podobni strukturam, samo da je razlica v public pa private ne? :D

Drugače pa, ja, če gledamo tako kot si napisal c00l3r, je lažje zaradi številk (preverjanje,...).
V mojem primeru je res zelo veliko kode ;)

Lp golobich

c00L3r ::

golobich s tvojim pristopom ni nič narobe. Lahko bi uporabil tudi char tip, ki mislim, da se v pomnilniku predstavi enako kot integer. Uporaba string-a oz. niza znakov pa je slabša iz performančnih razlogov.

Je pa izdelava takšne igre zelo dobra (a tudi kar težka) vaja pri učenju. Jaz sem 1x naredil tudi vislice. Tudi dobra vaja.

golobich ::

c00l3r, pa saj nisem nikjer uporabil stringa.
uporabil sem char ;)

poglej kodo zgoraj ;)
#include <iostream>
//tukaj tudi vidiš da ni uporabljen string (#include <string>) ;)
using namespace std;
char IgralnoPolje[3][3];

Gosh ::

Vem, da je tema stara a vseeno ne bom ustvaril neke nove z istim vprašanjem.
Imam sledeče vprašanje: kako izrisat križec ali krožec v že ustvarjeno polje? Izriže mi 'o' ali 'x' vendar mi ne izriše celotnega ostalega polja ampak neke številke. Delam s polji in ko vnesem velikost polja se mi celotno polje napolni z 0. Zdaj kaj rabim je, da mi v izbran stolpec na izbrano mesto izriše 'x' ali 'o'.

Del kode ko izriše polje.
void narisi(){
     srand(time(NULL));
     int polje[n][n];
     for(int i=0; i<n; i++){
             for(int j=0; j<n; j++){
                     polje[i][j] = rand()%1;
                     cout << polje[i][j] << " ";
             }cout << endl;
     }
}

del kode ko bi naj izrisal krožec 'o'.
case 2:{
       int stolpec, mesto;
       cout << "V kateri stolpec zelite vnesto o: "; cin >> stolpec;
       cout << "Na katero mesto?: "; cin >> mesto;
       narisi_o(stolpec, mesto);
}break;

funkcija:
void narisi_o(int stolpec, int mesto){
     int polje[n][n];
     for(int i=1; i<=n; i++){
             for(int j=1; j<=n; j++){
                     if(i==stolpec && j==mesto){
                                   cout << polje[stolpec][mesto] << "o";
                     }
             }cout << endl;
     }
}

izriše mi nekaj takega:

Izbira: 2
V kateri stolpec zelite vnesto o: 2
Na katero mesto?: 1

2686720o

Hvala za pomoč.

Zgodovina sprememb…

  • spremenil: Gosh ()

klemen93 ::

Prvo moraš določiti vrednosti dvodimenzionalni tabeli polje, če jo želiš izpisati.

Predvidevam pa da želiš narediti nekaj takega da ti v to polje, ki ga dobi funkcija kot argument, shrani krožec. Torej zamenji to vrstico kode:
cout << polje[stolpec][mesto] << "o";


s tem:
polje[stolpec][mesto] = 'o';


pred tem pa še moraš spremeniti int polje[n][n]; v char polje[n][n];

Če pa želiš izpisati polje, pa mu moraš prvo nastaviti vrednosti, poskušaj ga napolniti z praznimi znaki, nato pa ko uporabnik vnese stolpec in vrstico, na to mesto v polju dodaj križec ali krožec.

FuI2cY ::

Mogoče bi bilo dobro, če bi naredil 2 enaki matriki, vendar različnega tipa...eno matriko imaš tipa char, kjer boš risal križce in krogce, mogoče tudi mrežo, če želiš
npr: 3x3....tukaj bo malo bolj smešno narisalo mrežo :D ampak vsaj približno se bo vidlo kak sem mislil
- - -
| |O| |
- - -
| |X| |
- - -
| | |X|
- - -

in eno matriko tipa int. če uporabnik vnese 1 1 za vnos X, shraniš v int polje na koordinatah 1 1 število 1, potem ko izrisuješ pa preverjaš, vmes ali je v tem polju X, O ali pa je še zmeri prazno. v matriko tipa int prvo vse vrednostosti nastaviš na 0, torej je prazno, če pa uporabnik nariše X, daš na tisto mesto število 1, če pa uporabnik riše O pa daš na tisto mesto število 2. Upam, da si razumel kaj sem mislil :D

Zgodovina sprememb…

  • spremenil: FuI2cY ()

Gosh ::

Velikost matrike/polja poda uporabnik. Izpis prazne matrike/polja sem spremenil
cout << "[" << " " << "]";

Za izris 'o' imam v for zaknah (2)
if(i==stolpec && j==vrstica){
            matrika[stolpec][vrstica] = 'o';
}

a mi vseeno izriše prazno matriko/polje...

FuI2cY ::

ne vem kako kodo maš v celoti, težko je tak vedet, če napišeš samo 1 vrstico kode

klemen93 ::

Za izris se moraš pomakniti po vseh poljih znotraj dvodimenzionalne tabele.

for (int vrstica = 0; vrstica < vrstic_tabele; vrstica++)
{
   for(int stolpec = 0; stolpec < stolpcev_tabele; stolpec++)
   {
     cout<<matrika[vrstica][stolpec];
   }
}


Za vpis pa ne potrebuješ zank.

void vpisi_o(int stolpec, int mesto)
{
   matrika[mesto][stolpec] = 'o';
}

aljazko1995 ::

dej nej zdej lepo prosm eden napiše celoten program

MisterR ::

Da ti na faxu oz. v šoli neboš rabil?

Kockica ::

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

void iniciliziraj(short kk[][3], int n)
{int i,j;
 for (i=0;i<n;i++)
   for (j=0;j<n;j++)
     kk[i][j]=-1;
}

void izris (short kk[][3], int n)
{int i, j, k;
printf("\n");
for (i=0; i<n; i++)
{for (j=0; j<3; j++)
  {if (kk[i][j]==0) printf("O");
   else if (kk[i][j]==1) printf("X");
     else printf(" ");
   if (j<2) printf("|");}
 printf("\n");}
for (k=0; k<2*n-1;k++) printf("-");
printf("\n");
}

void vnos (short kk[][3], int n)
{int i, x, y;
 for (i=0; i<4; i++)
 {printf ("Vnesi pozicijo za %d krizec:",i);
  scanf("%d %d", &x, &y);
  while (kk[x-1][y-1]!=-1)
  {printf("to mesto je že zasedeno!!!ponovi vnos\n");
   scanf("%d %d", &x, &y);}
   kk[x-1][y-1]=1;
   izris(kk,3);
   printf ("vnesi pozicijo za %d krozec:",i);
   scanf("%d%d", &x, &y);
   while (kk[x-1][y-1]!=-1)
   {printf("to mesto je že zasedeno!!!ponovi vnos\n");
    scanf("%d %d", &x, &y);}
   kk[x-1][y-1]=0;
   izris(kk,3);
   }
   printf ("vnesi pozicijo za %d krizec:",i);
   scanf("%d %d", &x, &y);
   while (kk[x-1][y-1]!=-1)
   {printf("to mesto je že zasedeno!!!ponovi vnos\n");
   scanf("%d %d", &x, &y);}
   kk[x-1][y-1]=1;
   izris(kk,3);
}


int main(int argc, char *argv[])
{short tab[3][3];

iniciliziraj(tab,3);
vnos(tab,3);
//izpis(tab,3);
system("PAUSE");	
return 0;
}


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Tehnik računalništva

Oddelek: Šola
396259 (4239) janezekk
»

Namig za rešitev naloge

Oddelek: Programiranje
131585 (1384) vojko20
»

zacetniska vprasanja pri Visual Basicu 6

Oddelek: Programiranje
111621 (1372) mte
»

OpenGL texture modifying

Oddelek: Programiranje
71002 (910) BigWhale
»

VB6 problem

Oddelek: Programiranje
221449 (1072) StratOS

Več podobnih tem