drpingoo
Erfahrenes Mitglied
Hallo zusammen,
ich bin noch lange nicht fertig, aber ich wollte das Spiel Mühle mal programmieren. Es wird eine ganz einfache Ausgabe auf der Dos-Konsole. Komischerweise wird der Zug jedoch immer 3x in einer Diagonalen gezeichnet, obwohl nur ein Zug, der von mir gewählte ist. Ich konnte leider den Fehler nicht finden und wende mich nun deshalb an euch. Ausserdem, falls ihr einen Tipp habt die Dos-Ausgabe schöner darzustellen, dann nur zu. Bei mir erscheinen die Spielsteine immer etwas oberhalb, was ein bisschen doof und unübersichtlich aussieht.
Unten findet ihr die cpp und die headerdatei. Es ist ziemlich viel eingeslasht, weil ich ausprobieren wollte, wo der Fehler lag. Diese Version da funktioniert, jedoch eben mit seltsamer Ausgabe.
mfg
drpingoo
ich bin noch lange nicht fertig, aber ich wollte das Spiel Mühle mal programmieren. Es wird eine ganz einfache Ausgabe auf der Dos-Konsole. Komischerweise wird der Zug jedoch immer 3x in einer Diagonalen gezeichnet, obwohl nur ein Zug, der von mir gewählte ist. Ich konnte leider den Fehler nicht finden und wende mich nun deshalb an euch. Ausserdem, falls ihr einen Tipp habt die Dos-Ausgabe schöner darzustellen, dann nur zu. Bei mir erscheinen die Spielsteine immer etwas oberhalb, was ein bisschen doof und unübersichtlich aussieht.
Unten findet ihr die cpp und die headerdatei. Es ist ziemlich viel eingeslasht, weil ich ausprobieren wollte, wo der Fehler lag. Diese Version da funktioniert, jedoch eben mit seltsamer Ausgabe.
mfg
drpingoo
C++:
#include "m.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using std::cout;
using std::endl;
using std::cin;
int counter = 0;
int speicherarrayzeile [9];
int speicherarrayspalte [9];
// Konstruktor der Board-Klasse
// initialisiert das Spielbrett
Board::Board() {
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
board[i][j] = noone;
}
}
}
// drawRow: Zeichnet eine Zeile des Spielfelds
void Board::drawRow(unsigned int i) const {
cout << " " << symbol[board[i][0]]
<< " " << symbol[board[i][1]]
<< " " << symbol[board[i][2]]
<< " " << symbol[board[i][3]]
<< " " << symbol[board[i][4]]
<< " " << symbol[board[i][5]]
<< " " << symbol[board[i][6]]
<< endl;
}
// print: Gibt das aktuelle Spielbrett aus, z. B.:
// | |
// ---|---|---
// X | | O
// ---|---|---
// X | O |
void Board::print() const {
drawRow(0);
cout << "0 .-----------.-----------." << endl;
drawRow(1);
cout << "1 | . |" << endl;
drawRow(2);
cout << "2 | .-----.-----. |" << endl;
drawRow(3);
cout << "3 .-----. .-----." << endl;
drawRow(4);
cout << "4 | .-----.-----. |" << endl;
drawRow(5);
cout << "5 | . |" << endl;
drawRow(6);
cout << "6 .-----------.-----------." << endl;
cout << " 0 1 2 3 4 5 6 " << endl;
cout << endl << endl;
}
// gibt den Wert des Spielfelds [r,c] zurueck
int Board::getVal(unsigned int r, unsigned int c) const {
return board[r][ c];
}
// Setzt das Spielfeld [r,c] auf val und gibt true zurueck, sofern [r,c] noch
// nicht belegt ist. Sonst gibt die Funktion false zurueck
bool Board::setVal(unsigned int r, unsigned int c, player val) {
if(board[r][ c]==noone&&((r==0&&c==0)||(r==0&&c==3)||(r==0&&c==6)||(r==1&&c==3)||(r==2&&c==4)||(r==2&&c==2)||(r==2&&c==3)||(r==3&&c==0)||(r==3&&c==1)||(r==3&&c==2)||(r==3&&c==4)||(r==3&&c==5)||(r==3&&c==6)||(r==4&&c==2)||(r==4&&c==3)||(r==4&&c==4)||(r==5&&c==3)||(r==6&&c==0)||(r==6&&c==3)||(r==6&&c==6))){
board[r][ c]=val;
return true;}
else {return false;}
}
// hasWon: Prueft ob der Spieler gewonnen hat anhand des Spielbretts board
player Board::getWinner() const {
if(board[0][0]==player1&&board[0][3]==player1&&board[0][6]==player1||board[6][0]==player1&&board[6][3]==player1&&board[6][6]==player1)
return player1;
else if(board[0][6]==player1&&board[3][6]==player1&&board[6][6]==player1||board[0][0]==player1&&board[3][0]==player1&&board[6][0]==player1)
return player1;
else if(board[3][0]==player1&&board[3][1]==player1&&board[3][2]==player1)
return player1;
else if(board[3][4]==player1&&board[3][5]==player1&&board[3][6]==player1)
return player1;
else if(board[2][2]==player1&&board[2][3]==player1&&board[2][4]==player1||board[4][2]==player1&&board[4][3]==player1&&board[4][4]==player1)
return player1;
else if(board[0][3]==player1&&board[1][3]==player1&&board[2][3]==player1||board[4][3]==player1&&board[5][3]==player1&&board[6][3]==player1)
return player1;
else if (board[0][0]==player2&&board[0][3]==player2&&board[0][6]==player2||board[6][0]==player2&&board[6][3]==player2&&board[6][6]==player2)
return player2;
else if(board[0][6]==player2&&board[3][6]==player2&&board[6][6]==player2||board[0][0]==player2&&board[3][0]==player2&&board[6][0]==player2)
return player2;
else if(board[3][0]==player2&&board[3][1]==player2&&board[3][2]==player2)
return player2;
else if(board[3][4]==player2&&board[3][5]==player2&&board[3][6]==player2)
return player2;
else if(board[2][2]==player2&&board[2][3]==player2&&board[2][4]==player2||board[4][2]==player2&&board[4][3]==player2&&board[4][4]==player2)
return player2;
else if(board[0][3]==player2&&board[1][3]==player2&&board[2][3]==player2||board[4][3]==player2&&board[5][3]==player2&&board[6][3]==player2)
return player2;
else return noone;
}
// Konstruktor der Player-Klasse
Player::Player(player playerNumber) {
p = playerNumber;
}
player Player::getPlayer() const {
return p;
}
// makeMove: macht einen zufaelligen Zug auf dem Spielbrett
void Player::makeMove(Board &b) {
/*if(counter <9){
bool wahr = true;
while(wahr){
int zeile = rand()%7;
int spalte = rand()%7;
if(b.setVal(zeile,spalte,p)==true){
wahr = false;
speicherarrayzeile[counter]=zeile;
speicherarrayspalte[counter]=spalte;
counter++;}
}
}*/
if(counter <9){
bool wahr = true;
while(wahr){
int zeile;
int spalte;
cout << "Zeile: " ; cin >> zeile; cout << endl;
cout << "Spalte: "; cin >> spalte; cout << endl;
if(b.getVal(zeile,spalte)==noone){
b.setVal(zeile,spalte,p);
wahr = false;
speicherarrayzeile[counter]=zeile;
speicherarrayspalte[counter]=spalte;
counter++;}
}
}
/*else{
bool wahr = true;
while(wahr){
int sparray = rand()%9;
int abwechslung1 = rand()%2;
int abwechslung2 = rand()%2;
if(b.setVal(speicherarrayzeile[sparray]+abwechslung1,speicherarrayspalte[sparray]+abwechslung2,p)==true)
wahr = false;
}
}*/
}
// Konstruktor der Game-Klasse
Game::Game(Player &pl1, Player &pl2){
p1=&pl1;
p2=&pl2;
}
// play: Spielt ein Spiel Tic-Tac-Toe und gibt den Gewinner zurueck
Player* Game::play() {
bool wahr = true;
while(wahr){
p1->makeMove(b);
b.print();
if(player1==b.getWinner()){
wahr = false;
cout << "Spieler 1 hat gewonnen!" << endl;
return p1;
}
/*p2->makeMove(b);
b.print();
if(player2==b.getWinner()){
wahr = false;
cout << "Spieler 2 hat gewonnen!" << endl;
return p2;
}*/
}
}
int main() {
// initialisierung des Zufallszahlen-Generators
srand(time(NULL));
//Todo... Setzte Spiel auf und spiele...
Board b1 = Board();
b1.print();
Player one = Player(player1);
Player two = Player(player2);
Game the_game = Game(one,two);
the_game.play();
return 0;
}
C++:
#ifndef M_H
#define M_H_
// enum-Typ fuer die beiden Spieler
enum player {noone, player1, player2};
// Klassen-Definition Board
class Board {
protected:
player board[3][3];
static const char symbol[3];
void drawRow(unsigned int i) const;
public:
Board();
void print() const;
int getVal(unsigned int r, unsigned int c) const;
bool setVal(unsigned int r, unsigned int c, player val);
player getWinner() const;
};
const char Board::symbol[3] = {' ', 'X', 'O'};
// Klassen-Definition Player-Basisklasse
class Player {
private:
player p;
public:
player getPlayer() const;
Player(player playerNumber);
virtual ~Player() {};
void makeMove(Board &b) ; //in 1.2 virtual
};
// Klassen-Definition Game
class Game {
protected:
Player *p1, *p2;
Board b;
public:
Game(Player &p1, Player &p2);
Player* play();
};
#endif
Zuletzt bearbeitet von einem Moderator: