PDA

Tam Sürümünü Görmek İçin : Mastermind oyunu(C++)


choldax
19/01/2008, 11:02
Mastermind oyununu bilenler olacaktır mutlaka. O oyunu yazdım. Ancak sayıyı seçip kontrol ettikten sonra (farklı basamaklı sayılar seçtikten sonra) program çalışmaya devam etmiyor. Yardım ederseniz çok sevinirim.

Selamlar

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

using namespace std;

class Game
{
public:
void play();
int sayitut();
int birlestir(int *);
void karsilastir(int *,int *);
int control(int *);
int * basamakayir(int);
int isnumberOK(int x);
};

int Game::sayitut()
{
int number;
int *basamaklar;

basamaklar = new int[4];

for(int i=0;i<4;i++)
basamaklar[i] = rand()%10;

if(control(basamaklar) == 0)
number = sayitut();

else
{
number = birlestir(basamaklar);
cout<<"sayitut() OK"<<endl;
return number;
}

}

int Game::birlestir(int *x)
{
int number;
number = x[0]*1000+x[1]*100+x[2]*10+x[3];
return number;
}

int * Game::basamakayir(int number)
{
int *x = new int[4];

x[0] = number/1000; cout<<x[0];
x[1] = (number%1000)/100; cout<<x[1];
x[2] = (number%100)/10; cout<<x[2];
x[3] = number%10; cout<<x[3]<<endl;

if(control(x) != 1)
number = sayitut();


return x;
}

int Game::control(int *x)
{
int c;
for(int j=0; j<4; j++)
{
for(int i=0; i<4; i++)
{
if(x[i] == x[j]) c = 0;
else c = 1;
}
}
cout<<"Control OK"<<endl;
return c;
}

void Game::karsilastir(int * guess, int * number)
{
int pluscount = 0;
int minuscount = 0;
for(int j=0; j<4; j++)
{
for(int i=0; i<4; i++)
{
if(guess[i] == number[j] && i == j)
pluscount++;
else if(guess[i] == number[j] && i != j)
minuscount++;
}
}
cout<<pluscount<<"+ "<<minuscount<<"- "<<endl;
}

int Game::isnumberOK(int x)
{
int c = 0;
if(1000<x && x<10000 && control(basamakayir(x)) == 1)
c = 1;

return c;
}


void Game::play()
{
int guess,number;
int *b;
int *a;
cout<<"Hello"<<endl;
guess = 0;
number = sayitut();
cout<<number<<endl;
while(guess != number)
{
cout<<"Enter your guess: ";
cin>>guess;
while(isnumberOK(number) != 1)
{
cout<<"You have to enter a 4 digit number with different decimals"<<endl;
cout<<"Enter your guess: ";
cin>>guess;
}
karsilastir(basamakayir(guess),basamakayir(number) );
}
cout<<"Correct!"<<endl;
}

int main()
{
srand(time(NULL));
Game oyun;
oyun.play();
return 0;
}


acehreli
19/01/2008, 16:07
Programi calistirmadim ama su denetimde herhalde 'guess'i kullanmak istiyorsun, 'number'i degil:

cin>>guess;
while(isnumberOK(number) != 1)

Bir tane daha: 'isnumberOK' 'basamakayir'i cagiriyor, o 'control'u cagiriyor, o da 'sayitut'u cagiriyor. Bir kere bunda bir gariplik var: nasil olur da 'isnumberOK' gibi bir denetleme fonksiyonu, kendisine verilen sayida degisiklik yapmaya kalkar.

Ama zaten degistiremiyor da, cunku number = sayitut() dediginde kullandigi 'number', bir yerel degisken!

Bence bu programi adim adim calistirip her adimda neler olduguna bakma zamani gelmis. :) Veya ekrana bir seyler yazdirarak her degerin nasil degistigini gormek de ise yarayabilir.

Ali

choldax
20/01/2008, 22:32
yardımların için çok teşekkürler :) üzerinde uğraşıyorum