Пример #1
0
        public Board(GameSettings gameSettings, ContentManager content)
        {
            this.gameSettings = gameSettings;
            GenerateStones();
            Stand = new Stand(content);

            Init();
        }
Пример #2
0
        public AsciiBoard(GameSettings gameSettings, SpriteFont font, SpriteBatch sp)
        {
            this.gameSettings = gameSettings;
            this.font = font;
            this.spriteBatch = sp;

            GenerateStones();
            Init();
        }
Пример #3
0
		/// <summary>
		/// Process the actual game state
		/// </summary>
		/// <param name="gameLogic"></param>
		/// <param name="models"></param>
		/// <param name="gameSettings"></param>
		#region static public void Process(Game gameLogic, Models models, GameSettings gameSettings)
		static public void Process(Connect4Game gameLogic, GameSettings gameSettings, IBoard board)
		{
			// Gameplay for the chosen game mode
			switch (gameLogic.GameMode)
			{
				
			case GameSettings.GAMEMODE.SinglePlayer:
			{
				FSM_SinglePlayer(gameLogic, gameSettings, board);
				break;
			}
			case GameSettings.GAMEMODE.LocalMultiPlayer:
			{
				//FSM_MultiPlayer(gameLogic, gameSettings);
				break;
			}
			case GameSettings.GAMEMODE.CPUvsCPU:
			{
				//FSM_CPUvsCPU();
				break;
			}
			}
		}
Пример #4
0
        /// <summary>
        /// Constructor.
        /// </summary>
        public GameplayScreen()
        {
            TransitionOnTime = TimeSpan.FromSeconds (1.5);
            TransitionOffTime = TimeSpan.FromSeconds (0.5);

            gameSettings = new GameSettings();
            gameLogic = new Connect4Game (GameSettings.GAMEMODE.SinglePlayer,
                                         gameSettings.STARTING_PLAYER,
                                         gameSettings.AI_STRENGTH,
                                         gameSettings);

            player1 = new Player2 (gameSettings.PLAYER_RED_NAME, true);
            switch (gameSettings.AI_STRENGTH)
            {
                case GameSettings.DIFFICULTY.Easy:
                    {
                        player2 = new Player2 ("RookieBot", false);
                        break;
                    }
                case GameSettings.DIFFICULTY.Medium:
                    {
                        player2 = new Player2 ("TrainedBot", false);
                        break;
                    }
                case GameSettings.DIFFICULTY.Hard:
                    {
                        player2 = new Player2 ("Chief O'Bot", false);
                        break;
                    }
            }

            gameLogic.player1 = player1;
            gameLogic.player2 = player2;

            this.Reset(gameSettings);
        }
Пример #5
0
        public void SetGfxSkin(GameSettings.SkinType skinType)
        {
            if (skinType == SkinType.Classic)
            {
                if (GfxSkin == SkinType.Different)
                {
                    this.SkinChanged = true;
                }

                standPath = MEDIAPATH + "classic\\stand_classic.x";
                stoneRedPath = MEDIAPATH + "classic\\stone_red_classic.x";
                stoneYellowPath = MEDIAPATH + "classic\\stone_yellow_classic.x";
                GfxSkin = SkinType.Classic;
            }

            if (skinType == SkinType.Different)
            {
                if (GfxSkin == SkinType.Classic)
                {
                    this.SkinChanged = true;
                }

                standPath = MEDIAPATH + "new\\ball.x";
                standPath = MEDIAPATH + "new\\stand_different.x";
                stoneRedPath = MEDIAPATH + "new\\stone_red_different.x";
                stoneYellowPath = MEDIAPATH + "new\\stone_yellow_different.x";
                GfxSkin = SkinType.Different;
            }
        }
Пример #6
0
 public void Reset(GameSettings gameSettings)
 {
     gameLogic.ClearGame();
     FSM.IsFinished = false;
 }
Пример #7
0
        /*
        *	Das Eröffnungsbuch wird aus "connect-4.data.txt" eingelesen, die Zobrist Keys aus "zobristkeys.txt".
        *	"Log white.txt" und "Log black.txt" sind voreingestellt als Logfiles.
        */

        public ComputerPlayer(bool color, System.String name, bool bookEnabled, GameSettings.DIFFICULTY difficulty)
            : base(color, name)
        {
            InitBlock();
            this.bookEnabled = bookEnabled;

            InitAsync(difficulty);
        }
Пример #8
0
        async private void InitAsync(GameSettings.DIFFICULTY difficulty)
        {
            if (bookEnabled)
            {
                await readBook(@"Content\Book.txt");
               
                sortBook();
            }

            for (int i = 0; i < HASHSIZE; i++)
            {
                HashTable1[i] = new HashElement();
                HashTable2[i] = new HashElement();
                HashTable3[i] = new HashElement();
            }

            var zkReader = new ZobristKeys();


            char[] array;
            long x;
            int power;
            for (int i = 0; i < 42; i = i + 7)
            {
                for (int k = 0; k < 2; k++)
                {
                    array = zkReader.ReadLine().ToCharArray();
                    x = 0;
                    power = 0;
                    if (array[0] == '0')
                    {
                        for (int l = 63; l >= 1; l--)
                        {
                            x = x + ((array[l] == '1' ? 1 : 0) * (long)(System.Math.Pow(2.0, (double)power)));
                            power += 1;
                        }
                    }
                    if (array[0] == '1')
                    {
                        x = (long)(-System.Math.Pow(2.0, 63));
                        for (int l = 63; l >= 1; l--)
                        {
                            x = x + ((array[l] == '1' ? 1 : 0) * (long)(System.Math.Pow(2.0, (double)power)));
                            power += 1;
                        }
                    }
                    zobristKeys[i][k] = x;
                }
                if (i == 41)
                {
                    break;
                }
                if (i >= 35)
                {
                    i = (i + 8) % 42 - 7;
                }
            }

            // Set difficulty by defining the node limit 
            switch (difficulty)
            {
                case (GameSettings.DIFFICULTY.Easy):
                    {
                        Random rand = new Random();
                        NODELIMIT = rand.Next(10, 20);
                        break;
                    }
                case (GameSettings.DIFFICULTY.Medium):
                    {
                        Random rand = new Random();
                        NODELIMIT = rand.Next(50, 1000);
                        break;
                    }
                case (GameSettings.DIFFICULTY.Hard):
                    {
                        Random rand = new Random();
                        NODELIMIT = rand.Next(200000, 500000);
                        break;
                    }
            }
        }
Пример #9
0
		/// <summary>
		/// Single player mode
		/// </summary>
		/// <param name="gameLogic"></param>
		/// <param name="models"></param>
		/// <param name="gameSettings"></param>
		#region private static void FSM_SinglePlayer(...)
		private static void FSM_SinglePlayer(Connect4Game gameLogic, GameSettings gameSettings, IBoard board)
		{
			switch (gameLogic.GameState)
			{
			case GameSettings.GAMESTATE.S_BeforeGame:
			{
				if (gameLogic.STARTING_PLAYER == gameSettings.RED_PLAYER)
				{
					gameLogic.GameState = GameSettings.GAMESTATE.S_Player1Move;
					gameLogic.HUMAN_PLAYER = gameSettings.RED_PLAYER;
				}
				else
				{
					gameLogic.GameState = GameSettings.GAMESTATE.S_WaitForCPU;
					gameLogic.HUMAN_PLAYER = gameSettings.YELLOW_PLAYER;
				}

				break;
			}
			case GameSettings.GAMESTATE.S_Player1Move:
			{
				//HandleMouseInput(gameSettings, gameLogic);
				
				//HandleKeyInput(gameSettings, gameLogic);
				
				break;
			}
			case GameSettings.GAMESTATE.S_DropPlayerStone:
			{
				if (board.DropStone(gameLogic))
				{
					if (board.Bounce())
						gameLogic.GameState = GameSettings.GAMESTATE.S_SwitchPlayer;
				}
				
				break;
			}
			case GameSettings.GAMESTATE.S_SwitchPlayer:
			{
				// Change player
				gameLogic.SwitchPlayer();
				
				gameLogic.CheckIfFinished();
				
				
				if (gameLogic.NextGameState == GameSettings.GAMESTATE.S_GameFinished)
				{
					gameLogic.GameState = GameSettings.GAMESTATE.S_GameFinished;
				}
				else
				{
					board.SwitchStones(gameLogic);
					
					if (gameLogic.activePlayer == gameSettings.RED_PLAYER)
					{
						// Reset stone position for the next new stone
						gameLogic.SetNextPlayerStone();
						
						gameLogic.GameState = GameSettings.GAMESTATE.S_Player1Move;
					}
					else
					{
						gameLogic.GameState = GameSettings.GAMESTATE.S_WaitForCPU;
					}
				}
				
				break;
			}
			case GameSettings.GAMESTATE.S_WaitForCPU:
			{
				// Start the AI
				if (!gameLogic.AIStarted)
				{
					gameLogic.CPUMove();
				}
				
				if (gameLogic.NextGameState == GameSettings.GAMESTATE.S_DropCPUStone)
				{
					gameLogic.AbortAI();

					board.Update(gameLogic.column * board.ColumnDistance);
					
					gameLogic.GameState = GameSettings.GAMESTATE.S_DropCPUStone;
				}
				break;
			}
			case GameSettings.GAMESTATE.S_DropCPUStone:
			{
				if (board.DropStone(gameLogic))
				{
					if (board.Bounce())
						gameLogic.GameState = GameSettings.GAMESTATE.S_SwitchPlayer;
				}
				
				break;
			}
			case GameSettings.GAMESTATE.S_GameFinished:
			{
				IsFinished = true;
				break;
			}
			}
		}
Пример #10
0
		public static void HandleKeyInput(GameSettings gameSettings, Connect4Game gameLogic, KeyboardState keyboardState, IBoard board)
		{
			if(gameLogic.GameState != GameSettings.GAMESTATE.S_Player1Move)
				return;

			#region Right key
			if (!flagRight && !flagDown)
			{
				if (keyboardState.IsKeyDown(Keys.Right))
				{
					flagRight = true;
					
					if (gameLogic.column < gameSettings.COLUMNS - 1)
					{
						// Update gamefield information
						gameLogic.column++;
						gameLogic.SetRow(gameLogic.column);
					}
					else
					{
						// Update gamefield information
						gameLogic.column = 0;
						gameLogic.SetRow(gameLogic.column);
					}

					board.Update(gameLogic.column * board.ColumnDistance);
				}
			}
#endregion
			
			#region Left key
			if (!flagLeft && !flagDown)
			{
				if (keyboardState.IsKeyDown(Keys.Left))
				{
					flagLeft = true;
					
					if (gameLogic.column > 0)
					{
						// Update gamefield information
						gameLogic.column--;
						gameLogic.SetRow(gameLogic.column);
					}
					else
					{
						// Update gamefield information
						gameLogic.column = gameSettings.COLUMNS - 1;
						gameLogic.SetRow(gameLogic.column);
					}

					board.Update(gameLogic.column * board.ColumnDistance);
				}
			}
#endregion
			
			#region Down key
			if (!flagDown)
			{
				if (keyboardState.IsKeyDown(Keys.Down) && gameLogic.row != -1)
				{
					flagDown = true;

					gameLogic.SetRow(gameLogic.column);
					gameLogic.AddRowElement(gameLogic.column, gameLogic.row);
					
					// Update game field
					gameLogic.UpdateGameField();
					
					// Drop player stone
					gameLogic.GameState = GameSettings.GAMESTATE.S_DropPlayerStone;
					
				}
			}
#endregion
			
			// Reset flags
			if (!keyboardState.IsKeyDown(Keys.Right))
				flagRight = false;
			if (!keyboardState.IsKeyDown(Keys.Left))
				flagLeft = false;
			if (!keyboardState.IsKeyDown(Keys.Down))
				flagDown = false;
			
		}
Пример #11
0
        /// <summary>
        /// Start a new game
        /// </summary>
        /// <param name="mode"></param>
        public Connect4Game(GameSettings.GAMEMODE mode, int startingPlayer, GameSettings.DIFFICULTY difficulty, GameSettings settings)
        {
            startTime = DateTime.Now;

            RED_PLAYER = settings.RED_PLAYER;
            YELLOW_PLAYER = settings.YELLOW_PLAYER;

            COLUMNS = settings.COLUMNS;
            ROWS = settings.ROWS;

            this.aiStrength = difficulty;

            this.GameMode = mode;

            this.STARTING_PLAYER = startingPlayer;

            this.activePlayer = startingPlayer;

            map = new int[settings.COLUMNS, settings.ROWS];

            switch (GameMode)
            {
                case (GameSettings.GAMEMODE.SinglePlayer):
                    {
                        position = new Position();
                        zuege = new MoveList();
                        comp = new ComputerPlayer(Position.WHITE, "Machine", true, difficulty);

                        this.GameState = GameSettings.GAMESTATE.S_BeforeGame;

                        break;
                    }
                case (GameSettings.GAMEMODE.CPUvsCPU):
                    {
                        position = new Position();
                        zuege = new MoveList();
                        comp = new ComputerPlayer(Position.WHITE, "Machine1", true, difficulty);

                        if (this.STARTING_PLAYER == RED_PLAYER)
                        {
                            this.GameState = GameSettings.GAMESTATE.S_WaitForCPU;
                            this.HUMAN_PLAYER = RED_PLAYER;
                        }
                        else
                        {
                            this.GameState = GameSettings.GAMESTATE.S_WaitForCPU;
                            this.HUMAN_PLAYER = YELLOW_PLAYER;

                        }

                        break;
                    }
                case (GameSettings.GAMEMODE.LocalMultiPlayer):
                    {
                        position = new Position();
                        zuege = new MoveList();

                        this.GameState = GameSettings.GAMESTATE.S_BeforeGame;

                        break;
                    }
                case (GameSettings.GAMEMODE.NetworkGame):
                    {
                        position = new Position();
                        zuege = new MoveList();

                        /*string line = "";
                        using (StreamReader sr = new StreamReader("net.txt"))
                        {
                            string tmp;
                            while ((tmp = sr.ReadLine()) != null)
                            {
                                line = tmp;
                            }
                            sr.Close();
                        }

                        int port = Convert.ToInt32(line.Split(',')[0]);
                        string ip = line.Split(',')[1];

                        if (Convert.ToInt32(line.Split(',')[2]) == 2)
                        {
                            netStartPlayer = 1;
                        }
                        else
                        {
                            netStartPlayer = 2;
                        }

                        NetGame = new Networking(port, ip);*/
                        this.GameState = GameSettings.GAMESTATE.S_WaitForConnection;

                        break;
                    }
            }
        }
Пример #12
0
        public static int GetScore(GameSettings.DIFFICULTY AIStrength, int turn, DateTime startTime)
        {
            int points;

            long gameDuration = (DateTime.Now.Ticks - startTime.Ticks)/10000000;

            switch (AIStrength)
            {

                case (GameSettings.DIFFICULTY.Confused):
                    {
                        points = 1;
                        break;
                    }
                case (GameSettings.DIFFICULTY.Easy):
                    {
                        points = 1000000 / (turn + Convert.ToInt32(gameDuration));
                        break;
                    }
                case (GameSettings.DIFFICULTY.Medium):
                    {
                        points = 10000000 / (turn + Convert.ToInt32(gameDuration));
                        break;
                    }
                case (GameSettings.DIFFICULTY.Hard):
                    {
                        points = 100000000 / (turn + Convert.ToInt32(gameDuration));
                        break;
                    }
                default:
                    {
                        points = -1;
                        break;
                    }
            }

            return points;
        }