コード例 #1
0
        /// <summary>
        /// Parse a single playtest.
        /// </summary>
        /// <param name="fileName">The path to the playtest file</param>
        public void ParsePlaytest(string fileName)
        {
            if (File.Exists(fileName))
             {
            using (StreamReader sr = File.OpenText(fileName))
            {
               string line = "";
               Match mapMatch = null;
               DWFrame tmpFrame = null;

               line = sr.ReadLine();

               if (!mapRE.IsMatch(line))
               {
                  throw new Exception("KP Error: Unrecognized map line: " + line);
               }

               mapMatch = mapRE.Match(line);
               currentMap = mapMatch.Groups["mapName"].Value;

               knowledgeTree[currentMap] =
                  new Dictionary<int, Dictionary<PositionSelector,
                     Dictionary<PositionSelector, LinkedList<DWFrame>>>>();

               while ((line = sr.ReadLine()) != null)
               {
                  tmpFrame = currentFrame;
                  currentFrame = new DWFrame();

                  if (tmpFrame == null)
                  {
                     currentFrame.isHead = true;
                  }
                  else
                  {
                     tmpFrame.nextFrame = currentFrame;
                  }

                  currentFrame.prevFrame = tmpFrame;

                  parseTimeAndScore(line);

                  while (sr.Peek() != 't' && sr.Peek() != -1)
                  {
                     line = sr.ReadLine();

                     parsePlayerAndDisk(line);
                  }

                  putFrameInTree();
               }
            }
             }
             else
             {
            throw new FileNotFoundException("File not found! " + Directory.GetCurrentDirectory() + fileName);
             }
        }
コード例 #2
0
ファイル: GameState.cs プロジェクト: Trayus/cpgd_diskwars
        private void updateTimer(float gameTime)
        {
            timer -= gameTime;
            if (timer > Constants.TIMEMILLIS)
            {
                time.setText("start in " + ((int)(timer / 1000 + 1) - Constants.TIMEMILLIS / 1000) + " s");
                time.setColor(Color.White);

                large.setEnabled(true);
                large.setText("   " + ((int)(timer / 1000 + 1) - Constants.TIMEMILLIS / 1000) + "...");
            }
            else if (timer < 0)
            {
                time.setText("Game over!");
                time.setColor(Color.White);

                int winner = 0;
                if (players[1].score > players[winner].score) winner = 1;
                if (players[2].score > players[winner].score) winner = 2;
                if (players[3].score > players[winner].score) winner = 3;

                large.setEnabled(true);
                large.setText("Player " + (winner + 1) + " wins!");
                switch (winner)
                {
                    case 0: large.setColor(new Color(1f, 0.2f, 0.2f)); break;
                    case 1: large.setColor(new Color(1f, 1f, 0.2f)); break;
                    case 2: large.setColor(new Color(0.2f, 1f, 0.2f)); break;
                    case 3: large.setColor(new Color(0.2f, 0.2f, 1f)); break;
                }
            }
            else
            {
                time.setText((int)(timer / 1000 + 1) + "s");
                time.setColor(new Color((float)Math.Sin(timer / 100 + 1.6) / 2 + 1f,
                                        (float)Math.Sin(timer / 100 + 3.1) / 2 + 1f,
                                        (float)Math.Sin(timer / 100 + 0.0) / 2 + 1f));

                if (timer + 2000 > Constants.TIMEMILLIS)
                    large.setEnabled(true);
                else
                    large.setEnabled(false);
                large.setText("Begin!");

            }

            if (current != null)
                current = current.nextFrame;

            querytimer += gameTime;
            if (querytimer > Constants.QUERY_TIME || current == null)
            {
                Vector2[] disks = new Vector2[4];
                Vector2[] pls = new Vector2[4];
                int i = 0, a = 0;
                foreach (Player p in players)
                {
                    disks[i] = p.disk.getPosition();
                    pls[i] = p.animation.position;
                    i++;
                    if (p.alive) a++;
                }
                LinkedList<DWFrame> frames = Game1.kp.Map(mapname.Split('/')[1]).PlayersAlive(a).DiskPositions(disks).PlayerPositions(pls);

                if (frames.Count > 0)
                {
                    start = null;
                    foreach (DWFrame fr in frames)
                    {
                        if (Rand.Float() > 0.8f)
                        {
                            start = fr;
                            break;
                        }
                    }
                    if (start == null)
                        start = frames.First.Value;
                    current = start;
                }
                querytimer = 0;
            }
        }