Example #1
0
        // Saving

        /*
         *  Input file format:
         *  LINE: |PlayerName:Str|PlayerColor:Str|Points:int
         *  LINE: |PlayerName:Str|PlayerColor:Str|Points:int
         *  LINE: |ActivePlayerInd(0|1):int|FieldSize:int
         *  LINE: |LineCount:int
         *  1...LineCount -> [
         *  LINE: |P1.X P1.Y|P2.X P2.Y|PlayerInd(0|1):int
         *  ]
         *  LINE: |RegisteredRectCount:int
         *  1...RegisteredRectCount -> [
         *  LINE: |P1.X P1.Y|P2.X P2.Y|PlayerInd(0|1):int
         *  ]
         *  EOF
         */
        public async Task SaveGameAsync(GameStateWrapper state, String path)
        {
            try
            {
                using (StreamWriter writer = new StreamWriter(path))
                {
                    //Writing players
                    Player         p = state.PlayerOne;
                    ColorConverter colorConverter = new ColorConverter();
                    await writer.WriteLineAsync(String.Format("{0} {1} {2}", p.PlayerName, colorConverter.ConvertToString(p.PlayerColor), p.Points));

                    p = state.PlayerTwo;
                    await writer.WriteLineAsync(String.Format("{0} {1} {2}", p.PlayerName, colorConverter.ConvertToString(p.PlayerColor), p.Points));

                    //ActivePlayerInd and FieldSize
                    int activeP = (state.ActivePlayer == state.PlayerOne) ? 0 : 1;
                    await writer.WriteLineAsync(String.Format("{0} {1}", activeP, state.FieldSize));

                    //LineCount and lines
                    await writer.WriteLineAsync(state.Lines.Count.ToString());

                    for (int i = 0; i < state.Lines.Count; ++i)
                    {
                        activeP = (state.Lines[i].Item3 == state.PlayerOne) ? 0 : 1;
                        await writer.WriteLineAsync(String.Format("{0} {1} {2} {3} {4}",
                                                                  state.Lines[i].Item1.X,
                                                                  state.Lines[i].Item1.Y,
                                                                  state.Lines[i].Item2.X,
                                                                  state.Lines[i].Item2.Y,
                                                                  activeP
                                                                  ));
                    }

                    //RegisteredRectanglesCount and rectangles
                    await writer.WriteLineAsync(state.RegisteredRectCount.ToString());

                    for (int i = 0; i < state.RegisteredRectCount; ++i)
                    {
                        activeP = (state.Rectangles[i].Item3 == state.PlayerOne) ? 0 : 1;
                        await writer.WriteLineAsync(String.Format("{0} {1} {2} {3} {4}",
                                                                  state.Rectangles[i].Item1.X,
                                                                  state.Rectangles[i].Item1.Y,
                                                                  state.Rectangles[i].Item2.X,
                                                                  state.Rectangles[i].Item2.Y,
                                                                  activeP
                                                                  ));
                    }

                    writer.Flush();
                    writer.Close();
                }
            }
            catch
            {
                throw new Exception("Error occured during saving process");
            }
        }
        //========= Properties =========//

        // ISquaresGameDataAccess INTERFACE IMPLEMENTATION
        // Loading

        /*
         *  Input file format:
         *  LINE: |PlayerName:Str|PlayerColor:Str|Points:int
         *  LINE: |PlayerName:Str|PlayerColor:Str|Points:int
         *  LINE: |ActivePlayerInd(0|1):int|FieldSize:int
         *  LINE: |LineCount:int
         *  1...LineCount -> [
         *  LINE: |P1.X P1.Y|P2.X P2.Y|PlayerInd(0|1):int
         *  ]
         *  LINE: |RegisteredRectCount:int
         *  1...RegisteredRectCount -> [
         *  LINE: |P1.X P1.Y|P2.X P2.Y|PlayerInd(0|1):int
         *  ]
         *  EOF
         */
        public async Task <GameStateWrapper> LoadGameAsync(String path)
        {
            GameStateWrapper state = new GameStateWrapper();

            Player[] players = new Player[2];

            String line;

            String[] splitLine;

            try
            {
                using (StreamReader reader = new StreamReader(path))
                {
                    //Reading Players
                    for (int i = 0; i < 2; ++i)
                    {
                        //Reading
                        line = await reader.ReadLineAsync();

                        splitLine = line.Split();

                        //Populate Player
                        String pName  = splitLine[0];
                        Color  pColor = Color.FromArgb(int.Parse(splitLine[1]));
                        int    points = int.Parse(splitLine[2]);
                        players[i] = new Player(pName, pColor, points);
                    }
                    state.PlayerOne = players[0];
                    state.PlayerTwo = players[1];

                    //Read Active Player
                    line = await reader.ReadLineAsync();

                    splitLine          = line.Split();
                    state.ActivePlayer = players[int.Parse(splitLine[0])];
                    //Read FieldSize
                    state.FieldSize = int.Parse(splitLine[1]);

                    //Read Lines
                    line = await reader.ReadLineAsync();

                    splitLine = line.Split();
                    int linesLength = int.Parse(splitLine[0]);

                    for (int i = 0; i < linesLength; ++i)
                    {
                        line = await reader.ReadLineAsync();

                        splitLine = line.Split();

                        Point p1        = new Point(int.Parse(splitLine[0]), int.Parse(splitLine[1]));
                        Point p2        = new Point(int.Parse(splitLine[2]), int.Parse(splitLine[3]));
                        int   playerInd = int.Parse(splitLine[4]);
                        state.Lines.Add(new Tuple <Point, Point, Player>(p1, p2, players[playerInd]));
                    }

                    //Read Rectangles
                    line = await reader.ReadLineAsync();

                    splitLine = line.Split();
                    state.RegisteredRectCount = int.Parse(splitLine[0]);

                    for (int i = 0; i < state.RegisteredRectCount; i++)
                    {
                        line = await reader.ReadLineAsync();

                        splitLine = line.Split();

                        Point p1        = new Point(int.Parse(splitLine[0]), int.Parse(splitLine[1]));
                        Point p2        = new Point(int.Parse(splitLine[2]), int.Parse(splitLine[3]));
                        int   playerInd = int.Parse(splitLine[4]);
                        state.Rectangles.Add(new Tuple <Point, Point, Player>(p1, p2, players[playerInd]));
                    }
                    reader.Close();
                }
                return(state);
            } catch {
                throw new Exception("File not exists or invalid");
            }
        }