Rodex_ icon

connect_4

Rodex_ | PRO | 04/26/17 07:02:28 PM UTC | 0 ⭐ | 207 👁️ | Never ⏰ | []
C++ |

7.56 KB

|

None

|

0 👍

/

0 👎

============= Player.h ==============
#include <string>
#include <vector>
 
 
#ifndef CONNECT_FOUR_PLAYERS_H
#define CONNECT_FOUR_PLAYERS_H
 
class player{
public:
    virtual ~player() {}
    virtual int playTurn(int max) {return -1;}
};
 
class HumanPlayer : public player {
 
public:
    HumanPlayer() {}
    ~HumanPlayer() {}
    int playTurn(int max);
 
};
 
class ComputerPlayer : public player{
 
public:
    ComputerPlayer();
    ~ComputerPlayer() {}
    int playTurn(int max);
 
};
 
 
 
class field{
private:
    int m_height;
    int m_width;
    char ** gameboard;
 
public:
    field(int height, int width);
    ~field();
 
    void print();
 
    bool setTurn(char player, int column);
 
    bool check_win(char player, int last_turn);
 
    bool check_draw();
 
};
 
 
#endif //CONNECT_FOUR_PLAYERS_H
 
 
 
============== Player.cpp =============
#include "players.h"
#include <iostream>
#include <time.h>
#include <cstdlib>
 
using namespace std;
 
field::field(int height, int width){
    m_height = height;
    m_width = width;
    gameboard = new char *[height];
 
    for (int i = 0; i < height; i++) {
        gameboard[i] = new char[width];
    }
 
    for (int j = 0; j < height ; ++j) {
        for (int i = 0; i < width; ++i) {
            gameboard[j][i] = '.';
        }
    }
}
 
field::~field() {
    for (int i = 0; i < m_height; i++) {
        delete[] gameboard[i];
    }
    delete[] gameboard;
}
 
bool field::setTurn(char player, int column) {
    for (int i = m_height - 1; i >= 0; --i) {
        if(gameboard[i][column - 1] == '.'){
            gameboard[i][column - 1] = player;
            return true;
        }
    }
    return false;
}
 
bool field::check_win(char player, int column){
    column --;
    int row = 0;
    int check_win = 0;
    for (int i = 0; i < m_height; ++i) {
        if(gameboard[i][column] == player){
            row = i;
            break;
        }
    }
 
    ///senkrechte Überprüfung
    for (int j = row; j < m_height; ++j) {
        if(gameboard[j][column] == player){
            check_win ++;
        }else{
            break;
        }
    }
 
    if (check_win == 4){
        return true;
    }
 
    ///Waagrechte Überprüfung
    check_win = 0;
    for (int j = column + 1; j < m_width ; ++j) {
        if(gameboard[row][j] == player){
            check_win ++;
        }else{
            break;
        }
    }
    for (int j = column - 1; j >= 0; --j) {
        if(gameboard[row][j] == player){
            check_win ++;
        }else{
            break;
        }
    }
    if (check_win == 3){
        return true;
    }
 
    ///Diagonale Überprüfung
    int row_tmp = row;
    check_win = 0;
    ///links oben -> rechts unten
    for (int j = column; j <  m_width; ++j) {
        if(gameboard[row_tmp][j] == player){
            if(row_tmp == m_height - 1){
                check_win ++;
                break;
            }else{
                row_tmp ++;
                check_win ++;
            }
        }else{
            break;
        }
    }
 
    if (row != 0) {
        row_tmp = row - 1;
        for (int j = column - 1; j > m_width; --j) {
            if (gameboard[row_tmp][j] == player) {
                if (row_tmp == 0) {
                    check_win++;
                    break;
                } else {
                    row_tmp--;
                    check_win++;
                }
            } else {
                break;
            }
        }
    }
    if (check_win == 4){
        return true;
    }
    ///rechts oben -> links unten
 
    row_tmp = row;
    check_win = 0;
 
    for (int j = column; j < m_width; ++j) {
        if(gameboard[row_tmp][j] == player){
            if(row_tmp == 0){
                check_win ++;
                break;
            }else{
                row_tmp --;
                check_win ++;
            }
        }else{
            break;
        }
    }
 
    if(row != m_height - 1){
        row_tmp = row + 1;
        for (int j = column - 1; j >= 0; --j) {
            if(gameboard[row_tmp][j] == player){
                if(row_tmp == m_height - 1){
                    check_win ++;
                    break;
                }else{
                    row_tmp ++;
                    check_win ++;
                }
            }else{
                break;
            }
        }
    }
 
    if (check_win == 4){
        return true;
    }else{
        return false;
    }
}
 
bool field::check_draw() {
    for (int i = 0; i < m_width; ++i) {
        if(gameboard[0][i] == '.'){
            return false;
        }
    }
    return true;
}
 
void field::print() {
    for (int j = 0; j < m_height; ++j) {
        for (int i = 0; i < m_width; ++i) {
            cout << gameboard[j][i];
        }
        cout << j + 1;
        cout << endl;
    }
    for (int k = 0; k < m_width; ++k) {
        cout << k + 1;
    }
    cout << endl;
}
 
ComputerPlayer::ComputerPlayer() {
    srand((unsigned)time(NULL));
}
 
int HumanPlayer::playTurn(int max) {
    int column;
    cout << "Welche Spalte soll die Muenze eingeworfen werden: 1-" << max << endl;
        cin >> column;
    return column;
}
 
int ComputerPlayer::playTurn(int max) {
    return rand() % max + 1;
}
 
 
=============== connect4.cpp =============
#include <iostream>
#include "players.h"
 
using namespace std;
 
int main() {
    int height, width, gamemode, turn;
    bool check_win = false;
    bool check_turn = false;
 
    cout << "Height: " << endl;
        cin >> height;
    cout << "Width: " << endl;
        cin >> width;
    cout << "Gamemode:" << endl << "1 = Player vs Player" << endl << "2 = Player vs Computer" << endl << "3 = Computer vs Computer" << endl;
        cin >> gamemode;
 
    field *GameBoard = new field (height, width);
 
    player *Player1;
    player *Player2;
    switch  (gamemode){
        case 1:
            Player1 = new HumanPlayer();
            Player2 = new HumanPlayer();
            break;
 
        case 2:
            Player1 = new HumanPlayer();
            Player2 = new ComputerPlayer();
            break;
 
 
        default:
            Player1 = new ComputerPlayer();
            Player2 = new ComputerPlayer();
            break;
    }
 
    while (!check_win) {
        check_turn = false;
        GameBoard->print();
        while(!check_turn) {
            turn = Player1->playTurn(width);
            check_turn = GameBoard->setTurn('X', turn);
        }
        if(GameBoard->check_win('X', turn)) {
            check_win = true;
            GameBoard->print();
            cout << "Player 1 wins!" << endl;
        }
        if(GameBoard->check_draw()){
            check_win = true;
            GameBoard->print();
            cout << "It's a draw" << endl;
        }
        if(!check_win){
            GameBoard->print();
            check_turn = false;
            while(!check_turn){
                turn = Player2->playTurn(width);
                check_turn = GameBoard->setTurn('O', turn);
            }
            if(GameBoard->check_draw()){
                check_win = true;
                GameBoard->print();
                cout << "It's a draw" << endl;
            }
            if(GameBoard->check_win('O', turn)) {
                check_win = true;
                GameBoard->print();
                cout << "Player 2 wins!" << endl;
            }
        }
    }
 
    delete Player1;
    delete Player2;
    delete GameBoard;
    return 0;
}

Comments