예제 #1
0
        public static string GetBoardString(GameBoard gameBoard)
        {
            var sb = new StringBuilder();

            //sb.Append("    A.  B.  C.  D.  E.  F.  G.  H.  I.  J. \n");
            sb.Append("    ");
            for (int j = 0; j < Rules.Boardcolumns - 1; j++)
            {
                sb.Append(GameBoard.Coordinates[j]);
                sb.Append(".  ");
            }
            sb.Append(GameBoard.Coordinates[Rules.Boardcolumns - 1]);
            sb.Append(". \n");
            int i = 0;

            foreach (var boardRow in gameBoard.Board)
            {
                sb.Append(" " + GetRowSeparator(boardRow.Count) + "\n");
                sb.Append((i + 1).ToString());
                if ((i + 1) < 10)
                {
                    sb.Append(" ");
                }
                i++;
                sb.Append(GetRowWithData(boardRow) + "\n");
            }
            sb.Append(" " + GetRowSeparator(gameBoard.Board.First().Count));
            return(sb.ToString());
        }
예제 #2
0
        public static void RunPvPGame()
        {
            Abort = false;
            var Board1  = new GameBoard(Rules.Boardrows, Rules.Boardcolumns);
            var Board2  = new GameBoard(Rules.Boardrows, Rules.Boardcolumns);
            var Map1    = new GameBoard(Rules.Boardrows, Rules.Boardcolumns);
            var Map2    = new GameBoard(Rules.Boardrows, Rules.Boardcolumns);
            var Player1 = new Player("Player 1", Board1, Map1);
            var Player2 = new Player("Player 2", Board2, Map2);

            Console.Clear();
            SetUpGame(Player1, Player2);
            PlayGame(Player1, Player2);
        }
예제 #3
0
 public static void FillSquares(AppDbContext ctx, Domain.GameBoard ogboard, GameBoard tofillboard)
 {
     for (int i = 0; i < ogboard.Board.Count; i++)//p1 board
     {
         for (int j = 0; j < ogboard.Board[i].Count; j++)
         {
             var gameBoardSquare = new GameboardSquare()
             {
                 GameBoard = tofillboard, x = i, y = j, Value = ogboard.Board[i][j].ToString()
             };
             tofillboard.Squares.Add(gameBoardSquare);
             ctx.GameboardSquares.Add(gameBoardSquare);
         }
     }
 }
예제 #4
0
//        public int BoardShipsID { get; set; }
//        public List<Ship> BoardShips { get; set; }
        public Domain.GameBoard GetDomainBoard()
        {
            var domainboard = new Domain.GameBoard(rows, cols);

            //var board = new List<List<Domain.BoardSquareState>>(rows);
            foreach (var square in this.Squares)
            {
                domainboard.Board[square.x][square.y] = Domain.GameBoard.Convert(square.Value);
            }

            foreach (var ship in Ships)
            {
                Console.WriteLine("ship");
                domainboard.Ships.Add(ship.GetDomainShip());
            }
            return(domainboard);
        }
예제 #5
0
        public static void FillShips(AppDbContext ctx, Domain.GameBoard ogboard, GameBoard tofillboard)
        {
            foreach (var ship in ogboard.Ships)//p1
            {
                var lastship = new Ship()
                {
                    Health = ship.Health, Length = ship.Length
                };
                //ctx.BoardShips.Add(new BoardShips(){GameBoard = tofillboard, Ship = lastship});
                foreach (var location in ship.Locations)
                {
                    var loc = new ShipsLocation()
                    {
                        y = location[0], x = location[1], Ship = lastship
                    };
                    lastship.ShipsLocations.Add(loc);
                }

                lastship.GameBoard = tofillboard;
                tofillboard.Ships.Add(lastship);
            }
        }
예제 #6
0
        public static void DrawPlacing(Player player, int shipLen,
                                       bool rotation, int[] coords, ConsoleColor shipcolor, string right)
        {
            Console.Clear();
            GameBoard previewBoard = new GameBoard(player.Board.Board.Count, player.Board.Board[0].Count);

            previewBoard = GameBoard.CloneBoard(player.Board);
            AI.SetPlace(previewBoard, coords, shipLen, rotation);
            var lines           = Regex.Split(GetBoardString(previewBoard), "\r\n|\r|\n");
            var rightlines      = new string[lines.Length];
            var rightlinessplit = Regex.Split(right, "\r\n|\r|\n");

            for (int i = 0; i < lines.Length; i++)
            {
                if (i < rightlinessplit.Length)
                {
                    rightlines[i] = rightlinessplit[i];
                }
                else
                {
                    rightlines[i] = " ";
                }
            }
            Console.WriteLine(GetHeader(player));
            bool drawship = false;

            if (rotation)
            {
                for (int i = 0; i < lines.Length; i++)
                {
                    if (coords[0] * 2 + 2 == i)
                    {
                        drawship = true;
                    }
                    if (coords[0] * 2 + 2 + shipLen * 2 - 1 == i)
                    {
                        drawship = false;
                    }

                    if (drawship)
                    {
                        for (int j = 0; j < lines[i].Length; j++)
                        {
                            if (j == coords[1] * 4 + 3)
                            {
                                Console.ForegroundColor = shipcolor;
                            }
                            if (j == coords[1] * 4 + 2 + 4)
                            {
                                Console.ResetColor();
                            }
                            Console.Write(lines[i][j]);
                        }
                        Console.Write(GetSeparator());
                        Console.Write(rightlines[i]);
                        Console.Write("\n");
                    }
                    else
                    {
                        Console.Write(lines[i]);
                        Console.Write(GetSeparator());
                        Console.Write(rightlines[i]);
                        Console.Write("\n");
                    }
                }
            }
            else
            {
                for (int i = 0; i < lines.Length; i++)
                {
                    if (coords[0] * 2 + 2 == i)
                    {
                        for (int j = 0; j < lines[i].Length; j++)
                        {
                            if (j == coords[1] * 4 + 3)
                            {
                                Console.ForegroundColor = shipcolor;
                            }

                            if (j == coords[1] * 4 + 2 + shipLen * 4 - 1)
                            {
                                Console.ResetColor();
                            }
                            Console.Write(lines[i][j]);
                        }
                        Console.Write(GetSeparator());
                        Console.Write(rightlines[i]);
                        Console.Write("\n");
                    }
                    else
                    {
                        Console.Write(lines[i]);
                        Console.Write(GetSeparator());
                        Console.Write(rightlines[i]);
                        Console.Write("\n");
                    }
                }
            }
            Console.WriteLine(GetFooter(player));
        }
예제 #7
0
        public static void Placing(Player player, GameBoard board, int[] coords = null)
        {
            player.Ships = new List <Ship>(Rules.Ships);
            if (coords == null)
            {
                coords = new[] { 0, 0 };
            }
            bool         rotation     = false;
            var          shipsAmount  = player.Ships.Count;
            ConsoleColor shipcolor    = ConsoleColor.Green;
            Ship         selectedShip = player.Ships[0];

            DrawPlacing(player, selectedShip.Length, rotation, coords, shipcolor, DrawSwitcher(player, selectedShip));
            while (shipsAmount > 0)
            {
                if (Abort)
                {
                    break;
                }
                shipsAmount = player.Ships.Count;
                if (shipsAmount == 0)
                {
                    break;
                }
                switch (Console.ReadKey(true).Key)
                {
                case ConsoleKey.UpArrow:
                    if (rotation)
                    {
                        if (coords[0] == 0)
                        {
                            coords[0] = board.Board.Count - 1 - selectedShip.Length + 1;
                        }
                        else
                        {
                            coords[0]--;
                        }
                    }
                    else
                    {
                        if (coords[0] == 0)
                        {
                            coords[0] = board.Board.Count - 1;
                        }
                        else
                        {
                            coords[0]--;
                        }
                    }

                    break;

                case ConsoleKey.DownArrow:
                    coords[0]++;
                    break;

                case ConsoleKey.RightArrow:
                    coords[1]++;
                    break;

                case ConsoleKey.LeftArrow:
                    if (!rotation)
                    {
                        if (coords[1] == 0)
                        {
                            coords[1] = (board.Board[0].Count - 1) - selectedShip.Length + 1;
                        }
                        else
                        {
                            coords[1]--;
                        }
                    }
                    else
                    {
                        if (coords[1] == 0)
                        {
                            coords[1] = (board.Board[0].Count - 1);
                        }
                        else
                        {
                            coords[1]--;
                        }
                    }


                    break;

                case ConsoleKey.Enter:
                    if (shipcolor == ConsoleColor.Green)
                    {
                        AI.SetPlace(board, coords, selectedShip.Length, rotation);
                        player.Ships.Remove(selectedShip);
                        if (player.Ships.Count != 0)
                        {
                            selectedShip = player.Ships[0];
                        }
                    }
                    break;

                case ConsoleKey.X:
                    Abort = true;
                    break;

                case ConsoleKey.D1:    //switch
                    if (player.Ships.IndexOf(selectedShip) == player.Ships.Count - 1)
                    {
                        selectedShip = player.Ships[0];
                    }
                    else
                    {
                        selectedShip = player.Ships[player.Ships.IndexOf(selectedShip) + 1];
                    }
                    break;

                case ConsoleKey.D2:    //rotate
                    if (rotation)
                    {
                        rotation = false;
                    }
                    else
                    {
                        rotation = true;
                    }
                    break;

                case ConsoleKey.D3:
                    try
                    {
                        var shiptoremove = AI.FindShip(player.Board, Target("Use the arrow keys to select\nEnter - remove", player, coords));
                        foreach (var point in shiptoremove.Locations)
                        {
                            board.Board[point[0]][point[1]] = BoardSquareState.Empty;
                        }
                        player.Ships.Add(shiptoremove);
                        board.Ships.Remove(shiptoremove);
                        selectedShip = shiptoremove;
                    }
                    catch (Exception)
                    {
                        break;
                    }
                    break;

                case ConsoleKey.D4:
                    AI.AIPlacing(player.Ships, board);
                    break;
                }

                if (rotation == false)
                {
                    if (coords[0] > (board.Board.Count - 1))
                    {
                        coords[0] = 0;
                    }
                    if (coords[1] > (board.Board[0].Count - 1) - selectedShip.Length + 1)
                    {
                        coords[1] = 0;
                    }
                }

                if (rotation)
                {
                    if (coords[0] > (board.Board.Count - 1) - selectedShip.Length + 1)
                    {
                        coords[0] = 0;
                    }
                    if (coords[1] > (board.Board[0].Count - 1))
                    {
                        coords[1] = 0;
                    }
                }
                if (AI.CheckPlace(board, coords, selectedShip.Length, rotation))
                {
                    shipcolor = ConsoleColor.Green;
                }
                else
                {
                    shipcolor = ConsoleColor.Red;
                }
                var menu = DrawSwitcher(player, selectedShip);

                DrawPlacing(player, selectedShip.Length, rotation, coords, shipcolor, menu);
            }

            if (!Abort)
            {
                var sb = new StringBuilder();
                sb.Append("PRESS ANY KEY TO CONFIRM");
                Draw(player, GetBoardString(board), sb.ToString());
                switch (Console.ReadKey(true).Key)
                {
                case ConsoleKey.Enter:
                    break;

                case ConsoleKey.X:
                    break;
                }
            }
        }
예제 #8
0
        public static void PlayGame(Player Player1, Player Player2, bool P2turn = false)
        {
            //game starts
            Abort = false;
            var coords = new int[2] {
                0, 0
            };
            var status = "|";

            while (Abort == false)//cycle
            {
                if (!P2turn)
                {
                    coords = Target(GetBoardString(Player1.Map), Player1, coords, true);
                    if (Player1.Map.Board[coords[0]][coords[1]] != BoardSquareState.Empty || Abort)
                    {
                        continue;
                    }
                    status = GameBoard.Shoot(Player2.Board, coords, Player1.Map);
                    Draw(Player1, GetBoardString(Player1.Board), GetBoardString(Player1.Map), status);
                    if (status == "MISS ")
                    {
                        P2turn = true;
                        if (!Player2.AI)
                        {
                            coords[0] = 0;
                            coords[1] = 0;
                        }
                    }
                }
                else
                {
                    if (Player2.AI)
                    {
                        FullscreenMessage("The AI is making a move.");
                        status = AI.AIShoot(Player1.Board, Player2.Map);
                        Draw(Player1, GetBoardString(Player1.Board), GetBoardString(Player1.Map), status);
                        if (status == "MISS ")
                        {
                            P2turn = false;
                        }
                    }
                    else
                    {
                        Draw(Player2, GetBoardString(Player2.Board), GetBoardString(Player2.Map));
                        coords = Target(GetBoardString(Player2.Map), Player2, coords, true);
                        if (Player2.Map.Board[coords[0]][coords[1]] != BoardSquareState.Empty || Abort)
                        {
                            continue;
                        }

                        status = GameBoard.Shoot(Player1.Board, coords, Player2.Map);
                        Draw(Player2, GetBoardString(Player2.Board), GetBoardString(Player2.Map), status);
                        if (status == "MISS ")
                        {
                            P2turn    = false;
                            coords[0] = 0;
                            coords[1] = 0;
                        }
                    }
                }
                //check win
                if (AI.GetWinner(Player1, Player2) != null)
                {
                    StringBuilder sb = new StringBuilder();
                    sb.Append(AI.GetWinner(Player1, Player2));
                    sb.Append(" won!");
                    var wstate = new State(new Player(Player1), new Player(Player2), Rules.CanTouch, P2turn);
                    wstate.Status = "[Finished: " + sb.ToString() + "]";
                    SaveSystem.GameStates.Add(wstate);
                    FullscreenMessage(sb.ToString());
                    break;
                }
                Console.WriteLine("PRESS ENY KEY TO CONTINUE");
                switch (Console.ReadKey(true).Key)
                {
                case ConsoleKey.Enter:
                    break;
                }

                if (status == "MISS " && !Player1.AI && !Player2.AI)
                {
                    FullscreenMessage("PASS THE PC TO THE NEXT PLAYER");
                }

                var state = new State(new Player(Player1), new Player(Player2), Rules.CanTouch, P2turn);
                SaveSystem.GameStates.Add(state);
            }

            if (SaveSystem.GameStates.Count != 0)
            {
                if (SaveSystem.GameStates.Last().Status == null)
                {
                    SaveSystem.GameStates.Last().Status = "[" + SaveSystem.GameStates.Last().P1.ToString() +
                                                          ": " + SaveSystem.GameStates.Last().P1.Board.Ships.Count +
                                                          " Ships, " +
                                                          SaveSystem.GameStates.Last().P2.ToString() +
                                                          ": " + SaveSystem.GameStates.Last().P2.Board.Ships.Count +
                                                          " Ships]";
                }

                SaveSystem.SavesList.Add(new List <State>(SaveSystem.GameStates));
            }
            SaveSystem.GameStates = new List <State>();
        }
예제 #9
0
 public Player(string name, GameBoard board, GameBoard map)
 {
     Name  = name;
     Board = board;
     Map   = map;
 }
예제 #10
0
        public static void SaveToDb()
        {
            Console.WriteLine("Saving...");
            var ctx = new AppDbContext();

            foreach (var save in SaveSystem.SavesList)
            {
                var rules = new Rules()
                {
                    CanTouch = Domain.Rules.CanTouch,
                    Rows     = Domain.Rules.Boardrows,
                    Columns  = Domain.Rules.Boardcolumns
                };

                var player1 = new Player()
                {
                    Name = save[0].P1.Name, AI = save[0].P1.AI
                };
                var player2 = new Player()
                {
                    Name = save[0].P2.Name, AI = save[0].P2.AI
                };


                var ansave = new Save()
                {
                    Rules = rules, Player1 = player1, Player2 = player2, Replay = true
                };

                State laststate = new State();
                var   thissave  = save;
                if (Domain.Rules.SaveReplays == false)
                {
                    thissave = new List <Domain.State>()
                    {
                        save.Last()
                    };
                    ansave.Replay = false;
                }

//                var p1gb = new GameBoard();
//                var p2gb = new GameBoard();
//                var p1map = new GameBoard();
//                var p2map = new GameBoard();
                foreach (var state in thissave)
                {
                    var p1gb = new GameBoard()
                    {
                        rows = rules.Rows, cols = rules.Columns
                    };
                    var p2gb = new GameBoard()
                    {
                        rows = rules.Rows, cols = rules.Columns
                    };
                    var p1map = new GameBoard()
                    {
                        rows = rules.Rows, cols = rules.Columns
                    };
                    var p2map = new GameBoard()
                    {
                        rows = rules.Rows, cols = rules.Columns
                    };
                    laststate = new State()
                    {
                        Player1GB = p1gb, Player1Map = p1map,
                        Player2GB = p2gb, Player2Map = p2map, P2Turn = state.P2Turn
                    };
                    ctx.States.Add(laststate);

                    //filling in the squares
                    FillSquares(ctx, state.P1.Board, p1gb);
                    FillSquares(ctx, state.P2.Board, p2gb);
                    if (state == thissave.Last())
                    {
                        FillSquares(ctx, state.P1.Map, p1map);
                        FillSquares(ctx, state.P2.Map, p2map);
                        //placing ships
                        FillShips(ctx, state.P1.Board, p1gb);
                        FillShips(ctx, state.P2.Board, p2gb);
                    }
                    ansave.States.Add(laststate);
                    ctx.SaveChanges();
                }

                ansave.Status    = thissave.Last().Status;
                ansave.LastState = laststate;
                ctx.Saves.Add(ansave);
                ctx.SaveChanges();
            }
            SaveSystem.SavesList = new List <List <Domain.State> >();
        }