V
So klappts:
if (Wahl == '1')
{
cout << "\n\n Filename: ";
cin >> Filename;
Handle = _open(Filename, _O_RDONLY | O_BINARY);
ps:
typedef int Zug;//jetzt habe ich einen Typ gebaut mit Namen Zug, der eigentlich nur ein int ist
typedef int Stein;//jetzt habe ich einen Typ gebaut mit Namen Stein, der eigentlich nur ein int ist
Stein const LEER=0;
Stein const WEISS=1;
Stein const SCHWARZ=-1;
typedef int Reihe[3];//jetzt habe ich einen Typ gebaut mit Namen Reihe, der eigentlich nur ein Array
//mit 3 ints ist
//Ne Reihe ist eine Zeile oder Spalte oder Diagonale, also was, wo drei in einer Reihe vorkommen können
Reihe alleReihen[8]={
//Zuordnung der Ziffern siehe Nummerntastatur
//waagerecht
{1,2,3},
{4,5,6},
{7,8,9},
//senkrecht
{1,4,7},
{2,5,8},
{3,6,9},
//diagonal
{1,5,9},
{3,5,7}};
//Jetzt habe ich ein Array mit 8 Reihen gebaut, es heißt alleReihen
//int alleReihen[8][3];//Wäre eigentlich das selbe, mag ich aber net
Zug const KEINZUG=0;
// TODO: Zug und Feld zu Typen machen, nicht plattes int nehmen
struct TicTacToeSpiel
{
Stein feld[10];//Indizes von feld[0] bis feld[9], sind 10 stück
//aber die feld[0] benutze ich nicht, sind also feld[1] bis ferd[9],
//die ich benutzen will.
void starteSpiel()
{
for(int i=1;i<10;++i)
feld[i]=LEER;
}
char steinBild(Stein stein)
{
if(stein==LEER) return ' ';
if(stein==WEISS) return 'X';
if(stein==SCHWARZ) return 'O';
cout<<"Scheiße programmiert!"<<endl;
return 'S';
}
void spielfeldAusgabe()
{
unsigned char a=197; // kreuz Strich
unsigned char b=196; // horizontaler Strich
unsigned char c=179; // vertikaler Strich
cout<<'\t'<<steinBild(feld[7])<<c<<steinBild(feld[8])<<c<<steinBild(feld[9])<<endl;
cout<<'\t'<<b<<a<<b<<a<<b<<endl;
cout<<'\t'<<steinBild(feld[4])<<c<<steinBild(feld[5])<<c<<steinBild(feld[6])<<endl;
cout<<'\t'<<b<<a<<b<<a<<b<<endl;
cout<<'\t'<<steinBild(feld[1])<<c<<steinBild(feld[2])<<c<<steinBild(feld[3])<<endl<<endl;
}
void zugMensch()
{
spielfeldAusgabe();
Zug eingabe;
cin>>eingabe;
feld[eingabe]=SCHWARZ;
}
Zug findeGewinnZugInReihe(Reihe reihe,int farbe)
{
if(berechneReihenSumme(reihe)==2*farbe)
{
int a=reihe[0];if(feld[a]==LEER) return a;
int b=reihe[1];if(feld[b]==LEER) return b;
int c=reihe[2];if(feld[c]==LEER) return c;
}
return KEINZUG;
}
/*
Noch ne Lösung, diemal ohne Zwischenvariablen
Zug findeGewinnZugInReihe(Reihe reihe,int farbe)
{
if(feld[reihe[0]]+feld[reihe[1]]+feld[reihe[2]]==2*farbe)
{
if(feld[reihe[0]]==LEER) return reihe[0];
if(feld[reihe[1]]==LEER) return reihe[1];
if(feld[reihe[2]]==LEER) return reihe[2];
}
return KEINZUG;
}
*/
/* Die hier macht das gleiche und war ein Versuch, das mit Schleifen zu machen. Man sieht,
daß Schleifen machmal einfach nur schlechter sind, also totel unleserlichen Code bauen im Vergleich
zur anderen Lösung
Zug findeGewinnZugInReihe(Reihe reihe,int farbe)
{
int summe=0;
for(int i=0;i<3;++i)
summe=summe+reihe[i];
if(summe==2*farbe)
for(int i=0;i<3;++i)
if(feld[i]==LEER)
return i;
return KEINZUG;
}*/
Zug findeGewinnZugInAllenReihen(int farbe)
{
for(int i=0;i<8;++i)
{
Zug z=findeGewinnZugInReihe(alleReihen[i],farbe);
if(z!=KEINZUG) return z;
}
return KEINZUG;
}
Zug findeZufallsZug()
{
/*nochmal:
Zug wunschZug=rand()%9;//zufallzahl von 0 bis 8
wunschZug=wunschZug+1;//jetzt zufallzahl von 1 bis 9
if(feld[wunschZug]!=LEER) goto nochmal;
return wunschZug;*/
Zug wunschZug;
do
{
wunschZug=rand()%9;//zufallzahl von 0 bis 8
wunschZug=wunschZug+1;//jetzt zufallzahl von 1 bis 9
}while(feld[wunschZug]!=LEER);
return wunschZug;
}
Zug berechneRechnerZug()
{
//1. wenn er gewinnen kann, soll er's tun
int z=findeGewinnZugInAllenReihen(WEISS);
if(z!=KEINZUG) return z;
//2. wenn er abwehren kann, soll er's tun
z=findeGewinnZugInAllenReihen(SCHWARZ);
if(z!=KEINZUG) return z;
//3. zufall
z=findeZufallsZug();
return z;
}
void zugRechner()
{
Zug z=berechneRechnerZug();
feld[z]=WEISS;
}
int berechneReihenSumme(Reihe reihe)
{
int a=reihe[0];
int b=reihe[1];
int c=reihe[2];
return feld[a]+feld[b]+feld[c];
}
bool gewonnen()
{
for(int i=0;i<8;++i)
if(abs(berechneReihenSumme(alleReihen[i]))==3)
return true;
return false;
/* //TODO: klingt nach Schleife!
if(abs(feld[7]+feld[8]+feld[9])==3) return true;
if(abs(feld[4]+feld[5]+feld[6])==3) return true;
if(abs(feld[1]+feld[2]+feld[3])==3) return true;
if(abs(feld[7]+feld[4]+feld[1])==3) return true;
if(abs(feld[8]+feld[5]+feld[2])==3) return true;
if(abs(feld[9]+feld[6]+feld[3])==3) return true;
if(abs(feld[7]+feld[5]+feld[3])==3) return true;
if(abs(feld[9]+feld[5]+feld[1])==3) return true;
return false;*/
}
bool unentschieden()
{//funktioniert nur sicher, wenn nicht gleichzeitig gewonnen
for(int i=1;i<10;++i)
if(feld[i]==LEER)
return false;
return true;
}
};
int main()
{
//TODO: wer mogelt, verliert!
srand(time(0));
TicTacToeSpiel spiel;
for(int i=0;i<25;++i)
cout<<endl;
spiel.starteSpiel();
for(;;)//endlosschleife
{
spiel.zugRechner();
if(spiel.gewonnen())
{
cout<<"Rechner hat gewonnen!"<<endl;
break;
}
if(spiel.unentschieden())
{
cout<<"unentschieden!"<<endl;
break;
}
spiel.zugMensch();
if(spiel.gewonnen())
{
cout<<"Mensch hat gewonnen!"<<endl;
break;
}
if(spiel.unentschieden())
{
cout<<"unentschieden!"<<endl;
break;
}
}
spiel.spielfeldAusgabe();
return 0;
}