Nachdem ich mir einige Berichte über das schreiben eigener Schach KI-s durchgelesen habe, bekam ich das Gefühl das Viergewinnt einen guten Einstieg darstellen dürfte. 
Umsetzen möchte ich das ganze mit c++, weil es mehr möglichkeiten bietet als Java/Python (Die einzigen anderen Sprachen, welche ich genutzt habe). Die Geschwindigkeitsvorteile nehme ich gerne mit.
Sonderlich viel Programmiert habe ich bisher nicht, lediglich einfache Project Euler aufgaben gelöst und die Aufgaben an der Schule/Uni bearbeitet. Dadurch habe ich hoffentlich zuminindest Theoretisch die entsprechenden Grundlagen.
Um die Vererbung/Objektorierntierung mal praktisch anzuwenden, dachte ich hier daran das Spielfeld und die KI als eigene Klassen zu erstellen (Wer hättes blos erwartet
).
Dadurch könnte ich das ganze dann auch bei anderen Spielen wie Schach (bzw. erstmal einfacheren Varianten davon) weiternutzen.
Das Spielfeld habe ich als grundgerüst soweit fertig, demnächst währe dann die KI dran
Da vor aber erstmal ein paar Grundlegende Fragen, da ich c++ bisher nur privat genutzt habe.
1) Habe ich das ganze sinnvol in .cpp/.header aufgeteilt oder ist das kompletter murks?--> Erledigt
2) Habe ich irgendwelche anderen gravierenden Fehler drin?
3) Vor allem, wie muss ich die copy Methode überarbeiten, damit ich das spielfeld (2d vector) richtig kopiere? Mit Zeigern tu ich mich da realtiv schwer.
Ansonsten fehlt mir natürlich noch die gesamte Speicherverwaltung, für den fall, dass das Programm später mal nicht direkt nach dem ersten spiel beendet wird, sondern weitere folgen.
Hier das Spielfeld:
und hier ist meine Spielfeld.cpp datei:
Die KI soll später ihre eigene Kopie des Spielfeldes erhalten, auf dem sie beliebig Züge ausführen und zurücknehmen kann, ohne dass die Züge ausgegeben werden. Entsprechende Funktionen stellt das Spielfeld.
Schonmal vielen dank für alle Hinweise
Umsetzen möchte ich das ganze mit c++, weil es mehr möglichkeiten bietet als Java/Python (Die einzigen anderen Sprachen, welche ich genutzt habe). Die Geschwindigkeitsvorteile nehme ich gerne mit.
Sonderlich viel Programmiert habe ich bisher nicht, lediglich einfache Project Euler aufgaben gelöst und die Aufgaben an der Schule/Uni bearbeitet. Dadurch habe ich hoffentlich zuminindest Theoretisch die entsprechenden Grundlagen.
Um die Vererbung/Objektorierntierung mal praktisch anzuwenden, dachte ich hier daran das Spielfeld und die KI als eigene Klassen zu erstellen (Wer hättes blos erwartet
Dadurch könnte ich das ganze dann auch bei anderen Spielen wie Schach (bzw. erstmal einfacheren Varianten davon) weiternutzen.
Das Spielfeld habe ich als grundgerüst soweit fertig, demnächst währe dann die KI dran
Da vor aber erstmal ein paar Grundlegende Fragen, da ich c++ bisher nur privat genutzt habe.
1) Habe ich das ganze sinnvol in .cpp/.header aufgeteilt oder ist das kompletter murks?--> Erledigt
2) Habe ich irgendwelche anderen gravierenden Fehler drin?
3) Vor allem, wie muss ich die copy Methode überarbeiten, damit ich das spielfeld (2d vector) richtig kopiere? Mit Zeigern tu ich mich da realtiv schwer.
Ansonsten fehlt mir natürlich noch die gesamte Speicherverwaltung, für den fall, dass das Programm später mal nicht direkt nach dem ersten spiel beendet wird, sondern weitere folgen.
Hier das Spielfeld:
Hier ist meine Spielfeld.h datei
Code:
#pragma once
#include <iostream>
#include <vector>
using namespace::std;
class Spielfeld
{
public:
Spielfeld(int, int, short, bool, bool); // breite, hoehe, benoetigte steine in einer reihe, ausgabe, stop nach sieg
void cpy(Spielfeld);
bool setzen(short);
short winner();
void undo();
short movenum();
bool getplayer();
void setplayer(bool);
bool getactive();
void setactive(bool);
void nextplayer();
short getbreite();
short gethoehe();
void ausgeben();
void free(){
}
private:
short move = 0; // Anzahl getaetigter züge
std::vector<short> movesx;
std::vector<short> movesy;
std::vector<std::vector<short>> feld; // Spielfeld
int breite, hoehe;
bool player; // Spieler der aktuell am Zug ist
short chainlength; // Benoetigte Steine in einer Reihe um zu gewinnen
bool active, ausgabe, stoppen; // Spiel noch aktiv?, zuege ausgeben?, nach Sieg spiel beenden? (zuruecknehmen nicht mgl)
short winner(short b, short h){
// effizienterer Algorithmus, der nur Steine in der Umgebung des zuletztgesetzten überprüft
return 0;
}
};
und hier ist meine Spielfeld.cpp datei:
Code:
#include "stdafx.h"
#include "Spielfeld.h"
Spielfeld::Spielfeld(int b, int h, short c, bool a, bool s)
{
breite = b; hoehe = h; player = 0; chainlength = c, ausgabe = a, stoppen = s;
feld.resize(breite, vector<short>(hoehe));
movesx.resize(breite * hoehe);
movesy.resize(breite * hoehe);
active = true;
}
void Spielfeld::cpy(Spielfeld s)
{
s.move = this->move;
s.breite = this->breite;
s.hoehe = this->hoehe;
s.player = this->player;
s.chainlength = this->chainlength;
s.active = this->active;
s.ausgabe = this->ausgabe;
this->feld.resize(breite, vector<short>(hoehe));
this->movesx.resize(breite * hoehe);
this->movesx = movesx;
this->movesy.resize(breite * hoehe);
this->movesy = movesy;
}
bool Spielfeld::setzen(short b)
{
if (getactive() == false || b < 0 || b >= breite || feld[b][hoehe - 1] != 0)
return false;
int h = 0;
for (; h < hoehe & feld[b][h] != 0; h++);
if (feld[b][h] != 0)
return false;
feld[b][h] = (getplayer() + 1);
movesx[move] = b;
movesy[move] = h;
nextplayer();
move++;
if (ausgabe)
{
system("cls");
ausgeben();
}
winner();
return true;
}
short Spielfeld::winner()
{
for (int y = 0; y < hoehe; y++){
for (int x = 0; x < breite; x++){
//cout << x << "/" << y << " tested " << endl;
if (x < breite - chainlength && feld[x][y] != 0 && feld[x][y] == feld[x + 1][y] &&
feld[x + 2][y] == feld[x + 3][y] && feld[x + 1][y] == feld[x + 2][y]) {
if (stoppen == true)setactive(false);
cout << "GAME ENDED (horizontal win)" << endl;
return feld[x][y];
}
if (y < hoehe - chainlength && feld[x][y] != 0 && feld[x][y] == feld[x][y + 1] &&
feld[x][y + 2] == feld[x][y + 3] && feld[x][y + 1] == feld[x][y + 2]) {
if (stoppen == true)setactive(false);
cout << "GAME ENDED (vertical win)" << endl;
//cout << "There is a row from " << x << "|" << y << " to " << x << "|" << (y+4) << endl;
return feld[x][y];
}
if (y < hoehe - chainlength && x < breite - chainlength && feld[x][y] != 0 && feld[x][y] == feld[x + 1][y + 1] &&
feld[x + 2][y + 2] == feld[x + 3][y + 3] && feld[x + 1][y + 1] == feld[x + 2][y + 2]) {
if (stoppen == true)setactive(false);
cout << "GAME ENDED (diagonal win)" << endl;
//cout << "There is a row from " << x << "|" << y << " to " << x << "|" << (y+4) << endl;
return feld[x][y];
}
if (y < hoehe - chainlength && x - (chainlength - 1) >= 0 && feld[x][y] != 0 && feld[x][y] == feld[x - 1][y + 1] &&
feld[x - 2][y + 2] == feld[x - 3][y + 3] && feld[x - 1][y + 1] == feld[x - 2][y + 2]) {
if (stoppen == true)setactive(false);
cout << "GAME ENDED (diagonal win)" << endl;
//cout << "There is a row from " << x << "|" << y << " to " << x << "|" << (y-4) << endl;
return feld[x][y];
}
}
}
return 0;
}
void Spielfeld::undo()
{
move--;
feld[movesx[move]][movesy[move]] = 0;
movesx[move] = 0;
movesy[move] = 0;
nextplayer();
}
short Spielfeld::movenum()
{
return move;
}
bool Spielfeld::getplayer()
{
return player;
}
void Spielfeld::setplayer(bool b)
{
player = b;
}
bool Spielfeld::getactive()
{
return active;
}
void Spielfeld::setactive(bool b)
{
active = b;
}
void Spielfeld::nextplayer()
{
player = !player;
}
short Spielfeld::getbreite()
{
return breite;
}
short Spielfeld::gethoehe()
{
return hoehe;
}
void Spielfeld::ausgeben()
{
for (int h = hoehe - 1; h >= 0; h--){
for (int b = 0; b < breite; b++)
cout << feld[b][h] << " ";
cout << endl;
}
cout << endl;
}
Die KI soll später ihre eigene Kopie des Spielfeldes erhalten, auf dem sie beliebig Züge ausführen und zurücknehmen kann, ohne dass die Züge ausgegeben werden. Entsprechende Funktionen stellt das Spielfeld.
Schonmal vielen dank für alle Hinweise
Zuletzt bearbeitet:
(Überarbeiteten Code eingefügt)