#include <iostream>
#include <stdexcept>
#include <cstring>
using namespace std;
const int NUMROWS = 7;// CAN BE CHANGED FOR DIFFERENT GAME PLAY
const int NUMCOLS = 10;// CAN BE CHANGED FOR DIFFERENT GAME PLAY
const int TAILLENGTH = 15;// CAN BE CHANGED FOR DIFFERENT GAME PLAYstruct _cell {
char marker; int moveNumber;
};
void initBoard (_cell board[NUMROWS][NUMCOLS]) {
for (int i = 0; i < NUMROWS; ++i) {
for (int j = 0; j < NUMCOLS; ++j) {
board[i][j].marker = '_';
board[i][j].moveNumber = 0;
}
}
}
void showBoard (_cell board[NUMROWS][NUMCOLS], int &move) {
for (int i = 0; i < NUMROWS; ++i) {
for (int j = 0; j < NUMCOLS; ++j) {
if ((board[i][j].marker != '_') && (move - board[i][j].moveNumber > TAILLENGTH))
board[i][j].marker = '_';
cout << board[i][j].marker << " ";
}
cout << endl;
}
}
void placePiece (_cell board[NUMROWS][NUMCOLS], int row, int col, char player, int move) {
board[row][col].marker = player;
board[row][col].moveNumber = move;
}
void movePlayer (_cell board[NUMROWS][NUMCOLS], int &uRow, int &uCol, int move) {
board[uRow][uCol].marker = 'u';
cout << "Enter direction (N/S/E/W): ";
char direction;
cin >> direction;
if (direction == 'N')
uRow--;
if (direction == 'S')
uRow++;
if (direction == 'W')
uCol--;
if (direction == 'E')
uCol++;
if ((uRow < 0)||(uRow > NUMROWS - 1)||(uCol < 0)||(uCol > NUMCOLS - 1)) {
throw runtime_error("YOU FELL OFF THE BOARD!");
}
if (board[uRow][uCol].marker != '_'){
throw runtime_error("BANG! YOU ARE DEAD!");
}
placePiece(board, uRow, uCol, 'U', move);
}void moveOpponent (_cell board[NUMROWS][NUMCOLS], int &Row, int &Col, int move) {
board[Row][Col].marker = 'x';
if ((Row > 0) && (board[Row - 1][Col].marker == '_')) {
Row--;
placePiece(board, Row, Col, 'X', move);
}
if ((Row < NUMROWS - 1) && (board[Row + 1][Col].marker == '_')){
Row++;
placePiece(board, Row, Col, 'X', move);
}
if ((Col > 0) && (board[Row][Col - 1].marker == '_')){
Col--;
placePiece(board, Row, Col, 'X', move);
}
if ((Col < NUMCOLS - 1) && (board[Row][Col + 1].marker =='_')){
Col++;
placePiece(board, Row, Col, 'X', move);
}
throw runtime_error("");
}
bool processException (runtime_error excpt, bool status) {
cout << excpt.what() << endl;
return true;
}
int main() {
int uRow = 0, uCol = 0;
int oRow = NUMROWS - 1, oCol = NUMCOLS - 1;
bool win = true;
int move = 0;
_cell board[NUMROWS][NUMCOLS];
initBoard(board);
placePiece(board, uRow, uCol, 'U', move);
placePiece(board, oRow, oCol, 'X', move);
showBoard(board, move);
while (true) {
move++;
try {
movePlayer(board, uRow, uCol, move);
moveOpponent(board, oRow, oCol, move);
showBoard(board, move);
}
catch(runtime_error &excpt) {
processException(excpt, win);
break;
}
}
showBoard(board, move);
if(win)
cout << "*** YOU WIN! ***" << endl;
else
cout << "*** YOU LOSE! ***" << endl;
string tmp; getline(cin, tmp);
}