============= 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