using System.Collections.Generic;
public static void Main(string[] args)
Dastan ThisGame = new Dastan(6, 6, 4);
Console.WriteLine("Goodbye!");
protected List<Square> Board;
protected int NoOfRows, NoOfColumns, MoveOptionOfferPosition;
protected List<Player> Players = new List<Player>();
protected List<string> MoveOptionOffer = new List<string>();
protected Player CurrentPlayer;
protected Random RGen = new Random();
public Dastan(int R, int C, int NoOfPieces)
Players.Add(new Player("Player One", 1));
Players.Add(new Player("Player Two", -1));
MoveOptionOfferPosition = 0;
CreatePieces(NoOfPieces);
CurrentPlayer = Players[0];
private void DisplayBoard()
Console.Write(Environment.NewLine + " ");
for (int Column = 1; Column <= NoOfColumns; Column++)
Console.Write(Column.ToString() + " ");
Console.Write(Environment.NewLine + " ");
for (int Count = 1; Count <= NoOfColumns; Count++)
for (int Row = 1; Row <= NoOfRows; Row++)
Console.Write(Row.ToString() + " ");
for (int Column = 1; Column <= NoOfColumns; Column++)
int Index = GetIndexOfSquare(Row * 10 + Column);
Console.Write("|" + Board[Index].GetSymbol());
Piece PieceInSquare = Board[Index].GetPieceInSquare();
if (PieceInSquare == null)
Console.Write(PieceInSquare.GetSymbol());
for (int Column = 1; Column <= NoOfColumns; Column++)
private void DisplayState()
Console.WriteLine("Move option offer: " + MoveOptionOffer[MoveOptionOfferPosition]);
Console.WriteLine(CurrentPlayer.GetPlayerStateAsString());
Console.WriteLine("Turn: " + CurrentPlayer.GetName());
private int GetIndexOfSquare(int SquareReference)
int Row = SquareReference / 10;
int Col = SquareReference % 10;
return (Row - 1) * NoOfColumns + (Col - 1);
private bool CheckSquareInBounds(int SquareReference)
int Row = SquareReference / 10;
int Col = SquareReference % 10;
if (Row < 1 || Row > NoOfRows)
else if (Col < 1 || Col > NoOfColumns)
private bool CheckSquareIsValid(int SquareReference, bool StartSquare)
if (!CheckSquareInBounds(SquareReference))
Piece PieceInSquare = Board[GetIndexOfSquare(SquareReference)].GetPieceInSquare();
if (PieceInSquare == null)
else if (CurrentPlayer.SameAs(PieceInSquare.GetBelongsTo()))
private bool CheckIfGameOver()
bool Player1HasMirza = false;
bool Player2HasMirza = false;
Piece PieceInSquare = S.GetPieceInSquare();
if (PieceInSquare != null)
if (S.ContainsKotla() && PieceInSquare.GetTypeOfPiece() == "mirza" && !PieceInSquare.GetBelongsTo().SameAs(S.GetBelongsTo()))
else if (PieceInSquare.GetTypeOfPiece() == "mirza" && PieceInSquare.GetBelongsTo().SameAs(Players[0]))
else if (PieceInSquare.GetTypeOfPiece() == "mirza" && PieceInSquare.GetBelongsTo().SameAs(Players[1]))
return !(Player1HasMirza && Player2HasMirza);
private int GetSquareReference(string Description)
Console.Write("Enter the square " + Description + " (row number followed by column number): ");
SelectedSquare = Convert.ToInt32(Console.ReadLine());
private void UseMoveOptionOffer()
Console.Write("Choose the move option from your queue to replace (1 to 5): ");
ReplaceChoice = Convert.ToInt32(Console.ReadLine());
CurrentPlayer.UpdateMoveOptionQueueWithOffer(ReplaceChoice - 1, CreateMoveOption(MoveOptionOffer[MoveOptionOfferPosition], CurrentPlayer.GetDirection()));
CurrentPlayer.ChangeScore(-(10 - (ReplaceChoice * 2)));
MoveOptionOfferPosition = RGen.Next(0, 5);
private int GetPointsForOccupancyByPlayer(Player CurrentPlayer)
ScoreAdjustment += (S.GetPointsForOccupancy(CurrentPlayer));
private void UpdatePlayerScore(int PointsForPieceCapture)
CurrentPlayer.ChangeScore(GetPointsForOccupancyByPlayer(CurrentPlayer) + PointsForPieceCapture);
private int CalculatePieceCapturePoints(int FinishSquareReference)
if (Board[GetIndexOfSquare(FinishSquareReference)].GetPieceInSquare() != null)
return Board[GetIndexOfSquare(FinishSquareReference)].GetPieceInSquare().GetPointsIfCaptured();
bool SquareIsValid = false;
Console.Write("Choose move option to use from queue (1 to 3) or 9 to take the offer: ");
Choice = Convert.ToInt32(Console.ReadLine());
while (Choice < 1 || Choice > 3);
int StartSquareReference = 0;
StartSquareReference = GetSquareReference("containing the piece to move");
SquareIsValid = CheckSquareIsValid(StartSquareReference, true);
int FinishSquareReference = 0;
FinishSquareReference = GetSquareReference("to move to");
SquareIsValid = CheckSquareIsValid(FinishSquareReference, false);
bool MoveLegal = CurrentPlayer.CheckPlayerMove(Choice, StartSquareReference, FinishSquareReference);
int PointsForPieceCapture = CalculatePieceCapturePoints(FinishSquareReference);
CurrentPlayer.ChangeScore(-(Choice + (2 * (Choice - 1))));
CurrentPlayer.UpdateQueueAfterMove(Choice);
UpdateBoard(StartSquareReference, FinishSquareReference);
UpdatePlayerScore(PointsForPieceCapture);
Console.WriteLine("New score: " + CurrentPlayer.GetScore() + Environment.NewLine);
if (CurrentPlayer.SameAs(Players[0]))
CurrentPlayer = Players[1];
CurrentPlayer = Players[0];
GameOver = CheckIfGameOver();
private void UpdateBoard(int StartSquareReference, int FinishSquareReference)
Board[GetIndexOfSquare(FinishSquareReference)].SetPiece(Board[GetIndexOfSquare(StartSquareReference)].RemovePiece());
private void DisplayFinalResult()
if (Players[0].GetScore() == Players[1].GetScore())
Console.WriteLine("Draw!");
else if (Players[0].GetScore() > Players[1].GetScore())
Console.WriteLine(Players[0].GetName() + " is the winner!");
Console.WriteLine(Players[1].GetName() + " is the winner!");
private void CreateBoard()
Board = new List<Square>();
for (int Row = 1; Row <= NoOfRows; Row++)
for (int Column = 1; Column <= NoOfColumns; Column++)
if (Row == 1 && Column == NoOfColumns / 2)
S = new Kotla(Players[0], "K");
else if (Row == NoOfRows && Column == NoOfColumns / 2 + 1)
S = new Kotla(Players[1], "k");
private void CreatePieces(int NoOfPieces)
for (int Count = 1; Count <= NoOfPieces; Count++)
CurrentPiece = new Piece("piece", Players[0], 1, "!");
Board[GetIndexOfSquare(2 * 10 + Count + 1)].SetPiece(CurrentPiece);
CurrentPiece = new Piece("mirza", Players[0], 5, "1");
Board[GetIndexOfSquare(10 + NoOfColumns / 2)].SetPiece(CurrentPiece);
for (int Count = 1; Count <= NoOfPieces; Count++)
CurrentPiece = new Piece("piece", Players[1], 1, "\"");
Board[GetIndexOfSquare((NoOfRows - 1) * 10 + Count + 1)].SetPiece(CurrentPiece);
CurrentPiece = new Piece("mirza", Players[1], 5, "2");
Board[GetIndexOfSquare(NoOfRows * 10 + (NoOfColumns / 2 + 1))].SetPiece(CurrentPiece);
private void CreateMoveOptionOffer()
MoveOptionOffer.Add("jazair");
MoveOptionOffer.Add("chowkidar");
MoveOptionOffer.Add("cuirassier");
MoveOptionOffer.Add("ryott");
MoveOptionOffer.Add("faujdar");
private MoveOption CreateRyottMoveOption(int Direction)
MoveOption NewMoveOption = new MoveOption("ryott");
Move NewMove = new Move(0, 1 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(0, -1 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(1 * Direction, 0);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(-1 * Direction, 0);
NewMoveOption.AddToPossibleMoves(NewMove);
private MoveOption CreateFaujdarMoveOption(int Direction)
MoveOption NewMoveOption = new MoveOption("faujdar");
Move NewMove = new Move(0, -1 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(0, 1 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(0, 2 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(0, -2 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
private MoveOption CreateJazairMoveOption(int Direction)
MoveOption NewMoveOption = new MoveOption("jazair");
Move NewMove = new Move(2 * Direction, 0);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(2 * Direction, -2 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(2 * Direction, 2 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(0, 2 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(0, -2 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(-1 * Direction, -1 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(-1 * Direction, 1 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
private MoveOption CreateCuirassierMoveOption(int Direction)
MoveOption NewMoveOption = new MoveOption("cuirassier");
Move NewMove = new Move(1 * Direction, 0);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(2 * Direction, 0);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(1 * Direction, -2 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(1 * Direction, 2 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
private MoveOption CreateChowkidarMoveOption(int Direction)
MoveOption NewMoveOption = new MoveOption("chowkidar");
Move NewMove = new Move(1 * Direction, 1 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(1 * Direction, -1 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(-1 * Direction, 1 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(-1 * Direction, -1 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(0, 2 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
NewMove = new Move(0, -2 * Direction);
NewMoveOption.AddToPossibleMoves(NewMove);
private MoveOption CreateMoveOption(string Name, int Direction)
return CreateChowkidarMoveOption(Direction);
else if (Name == "ryott")
return CreateRyottMoveOption(Direction);
else if (Name == "faujdar")
return CreateFaujdarMoveOption(Direction);
else if (Name == "jazair")
return CreateJazairMoveOption(Direction);
return CreateCuirassierMoveOption(Direction);
private void CreateMoveOptions()
Players[0].AddToMoveOptionQueue(CreateMoveOption("ryott", 1));
Players[0].AddToMoveOptionQueue(CreateMoveOption("chowkidar", 1));
Players[0].AddToMoveOptionQueue(CreateMoveOption("cuirassier", 1));
Players[0].AddToMoveOptionQueue(CreateMoveOption("faujdar", 1));
Players[0].AddToMoveOptionQueue(CreateMoveOption("jazair", 1));
Players[1].AddToMoveOptionQueue(CreateMoveOption("ryott", -1));
Players[1].AddToMoveOptionQueue(CreateMoveOption("chowkidar", -1));
Players[1].AddToMoveOptionQueue(CreateMoveOption("jazair", -1));
Players[1].AddToMoveOptionQueue(CreateMoveOption("faujdar", -1));
Players[1].AddToMoveOptionQueue(CreateMoveOption("cuirassier", -1));
protected string TypeOfPiece, Symbol;
protected int PointsIfCaptured;
protected Player BelongsTo;
public Piece(string T, Player B, int P, string S)
public string GetSymbol()
public string GetTypeOfPiece()
public Player GetBelongsTo()
public int GetPointsIfCaptured()
protected Piece PieceInSquare;
protected Player BelongsTo;
public virtual void SetPiece(Piece P)
public virtual Piece RemovePiece()
Piece PieceToReturn = PieceInSquare;
public virtual Piece GetPieceInSquare()
public virtual string GetSymbol()
public virtual int GetPointsForOccupancy(Player CurrentPlayer)
public virtual Player GetBelongsTo()
public virtual bool ContainsKotla()
if (Symbol == "K" || Symbol == "k")
public Kotla(Player P, string S) : base()
public override int GetPointsForOccupancy(Player CurrentPlayer)
if (PieceInSquare == null)
else if (BelongsTo.SameAs(CurrentPlayer))
if (CurrentPlayer.SameAs(PieceInSquare.GetBelongsTo()) && (PieceInSquare.GetTypeOfPiece() == "piece" || PieceInSquare.GetTypeOfPiece() == "mirza"))
if (CurrentPlayer.SameAs(PieceInSquare.GetBelongsTo()) && (PieceInSquare.GetTypeOfPiece() == "piece" || PieceInSquare.GetTypeOfPiece() == "mirza"))
protected List<Move> PossibleMoves;
public MoveOption(string N)
PossibleMoves = new List<Move>();
public void AddToPossibleMoves(Move M)
public bool CheckIfThereIsAMoveToSquare(int StartSquareReference, int FinishSquareReference)
int StartRow = StartSquareReference / 10;
int StartColumn = StartSquareReference % 10;
int FinishRow = FinishSquareReference / 10;
int FinishColumn = FinishSquareReference % 10;
foreach (var M in PossibleMoves)
if (StartRow + M.GetRowChange() == FinishRow && StartColumn + M.GetColumnChange() == FinishColumn)
protected int RowChange, ColumnChange;
public Move(int R, int C)
public int GetRowChange()
public int GetColumnChange()
private List<MoveOption> Queue = new List<MoveOption>();
public string GetQueueAsString()
string QueueAsString = "";
QueueAsString += Count.ToString() + ". " + M.GetName() + " ";
public void Add(MoveOption NewMoveOption)
Queue.Add(NewMoveOption);
public void Replace(int Position, MoveOption NewMoveOption)
Queue[Position] = NewMoveOption;
public void MoveItemToBack(int Position)
MoveOption Temp = Queue[Position];
Queue.RemoveAt(Position);
public MoveOption GetMoveOptionInPosition(int Pos)
private int Direction, Score;
private MoveOptionQueue Queue = new MoveOptionQueue();
public Player(string N, int D)
public bool SameAs(Player APlayer)
else if (APlayer.GetName() == Name)
public string GetPlayerStateAsString()
return Name + Environment.NewLine + "Score: " + Score.ToString() + Environment.NewLine + "Move option queue: " + Queue.GetQueueAsString() + Environment.NewLine;
public void AddToMoveOptionQueue(MoveOption NewMoveOption)
Queue.Add(NewMoveOption);
public void UpdateQueueAfterMove(int Position)
Queue.MoveItemToBack(Position - 1);
public void UpdateMoveOptionQueueWithOffer(int Position, MoveOption NewMoveOption)
Queue.Replace(Position, NewMoveOption);
public int GetDirection()
public void ChangeScore(int Amount)
public bool CheckPlayerMove(int Pos, int StartSquareReference, int FinishSquareReference)
MoveOption Temp = Queue.GetMoveOptionInPosition(Pos - 1);
return Temp.CheckIfThereIsAMoveToSquare(StartSquareReference, FinishSquareReference);