├── Checkers ├── App.ico ├── Sounds │ ├── Begin.wav │ ├── Drop.wav │ ├── Jump.wav │ ├── King.wav │ ├── Lost.wav │ ├── BadMove.wav │ ├── EndGame.wav │ ├── MsgRecv.wav │ ├── MsgSend.wav │ ├── Select.wav │ ├── Winner.wav │ ├── Deselect.wav │ ├── ForceEnd.wav │ └── JumpMultiple.wav ├── Presets │ ├── Seth │ │ ├── King.png │ │ └── Pawn.png │ ├── Smiley │ │ ├── King.png │ │ └── Pawn.png │ ├── Cyclops │ │ ├── King.png │ │ └── Pawn.png │ ├── Video Games │ │ ├── Kirby │ │ │ ├── King.png │ │ │ └── Pawn.png │ │ ├── Megaman │ │ │ ├── King.png │ │ │ └── Pawn.png │ │ ├── Metriod │ │ │ ├── King.png │ │ │ └── Pawn.png │ │ ├── Tetris │ │ │ ├── King.png │ │ │ └── Pawn.png │ │ ├── Bomberman │ │ │ ├── King.png │ │ │ └── Pawn.png │ │ ├── Super Mario │ │ │ ├── Boo │ │ │ │ ├── King.png │ │ │ │ └── Pawn.png │ │ │ ├── Fish │ │ │ │ ├── King.png │ │ │ │ └── Pawn.png │ │ │ ├── Shell │ │ │ │ ├── King.png │ │ │ │ └── Pawn.png │ │ │ ├── Yoshi │ │ │ │ ├── King.png │ │ │ │ └── Pawn.png │ │ │ ├── Shyguy │ │ │ │ ├── King.png │ │ │ │ └── Pawn.png │ │ │ ├── Thwomp │ │ │ │ ├── King.png │ │ │ │ └── Pawn.png │ │ │ ├── Mushroom │ │ │ │ ├── King.png │ │ │ │ └── Pawn.png │ │ │ └── Koopa Troopa │ │ │ │ ├── King.png │ │ │ │ └── Pawn.png │ │ └── Legend of Zelda │ │ │ ├── Fairy │ │ │ ├── King.png │ │ │ └── Pawn.png │ │ │ ├── Guard │ │ │ ├── King.png │ │ │ └── Pawn.png │ │ │ └── Link │ │ │ ├── King.png │ │ │ └── Pawn.png │ └── Operating Systems │ │ ├── Apple │ │ ├── King.png │ │ └── Pawn.png │ │ ├── Unix │ │ ├── King.png │ │ └── Pawn.png │ │ └── Windows │ │ ├── King.png │ │ └── Pawn.png ├── Properties │ └── AssemblyInfo.cs ├── TcpClient.cs ├── TcpClientCollection.cs ├── Program.cs ├── AboutDialog.cs ├── Settings.cs ├── AboutDialog.Designer.cs ├── PreferencesDialog.cs ├── Checkers.csproj ├── PreferencesDialog.resx └── MainForm.resx ├── Graphics ├── App.ico ├── Swap.png ├── KingIcon.png ├── Logo (Big).ico ├── Logo (Small).ico ├── ToolboxBitmap.png ├── Game Panel │ ├── TurnP1.png │ ├── TurnP1.psp │ ├── TurnP2.png │ ├── TurnP2.psp │ ├── Winner.png │ └── Winner.psp ├── Game Types │ ├── Game1P.png │ ├── Game2P.png │ └── GameNet.png ├── Pieces │ ├── King (Red).png │ ├── Pawn (Red).png │ ├── King (Black).png │ ├── King (Gold).png │ ├── King (White).png │ ├── Pawn (Black).png │ ├── Pawn (Gold).png │ └── Pawn (White).png ├── Preferences │ ├── General.png │ ├── Sounds.png │ └── Game Board.png └── Screenshots │ ├── checkers-screenshot-01.png │ ├── checkers-screenshot-02.png │ ├── checkers-screenshot-03.png │ ├── checkers-screenshot-04.png │ ├── checkers-screenshot-05.png │ └── checkers-screenshot-06.png ├── Checkers.UI ├── ToolboxBitmap.png ├── CheckersDesigner.cs ├── Properties │ └── AssemblyInfo.cs ├── Timer.cs ├── Checkers.UI.csproj └── CheckersUI.resx ├── References ├── Minimax Explained - AI Depot.URL ├── The Standard Laws of Checkers.URL └── Heuristics & Techniques of AI Checkers.URL ├── .gitignore ├── LICENSE ├── Checkers.Framework ├── Properties │ └── AssemblyInfo.cs ├── Agents │ ├── RandomAgent.cs │ ├── MinMaxSimpleAgent.cs │ ├── MinMaxComplexAgent.cs │ ├── MostJumpsAgent.cs │ └── MinMaxAgent.cs ├── CheckersAgent.cs ├── CheckersPieceCollection.cs ├── CheckersPiece.cs ├── Checkers.Framework.csproj └── CheckersMove.cs ├── README.md ├── Checkers.sln └── ToDo.txt /Checkers/App.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/App.ico -------------------------------------------------------------------------------- /Graphics/App.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/App.ico -------------------------------------------------------------------------------- /Graphics/Swap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Swap.png -------------------------------------------------------------------------------- /Graphics/KingIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/KingIcon.png -------------------------------------------------------------------------------- /Checkers/Sounds/Begin.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/Begin.wav -------------------------------------------------------------------------------- /Checkers/Sounds/Drop.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/Drop.wav -------------------------------------------------------------------------------- /Checkers/Sounds/Jump.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/Jump.wav -------------------------------------------------------------------------------- /Checkers/Sounds/King.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/King.wav -------------------------------------------------------------------------------- /Checkers/Sounds/Lost.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/Lost.wav -------------------------------------------------------------------------------- /Graphics/Logo (Big).ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Logo (Big).ico -------------------------------------------------------------------------------- /Graphics/Logo (Small).ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Logo (Small).ico -------------------------------------------------------------------------------- /Checkers/Sounds/BadMove.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/BadMove.wav -------------------------------------------------------------------------------- /Checkers/Sounds/EndGame.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/EndGame.wav -------------------------------------------------------------------------------- /Checkers/Sounds/MsgRecv.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/MsgRecv.wav -------------------------------------------------------------------------------- /Checkers/Sounds/MsgSend.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/MsgSend.wav -------------------------------------------------------------------------------- /Checkers/Sounds/Select.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/Select.wav -------------------------------------------------------------------------------- /Checkers/Sounds/Winner.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/Winner.wav -------------------------------------------------------------------------------- /Graphics/ToolboxBitmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/ToolboxBitmap.png -------------------------------------------------------------------------------- /Checkers.UI/ToolboxBitmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers.UI/ToolboxBitmap.png -------------------------------------------------------------------------------- /Checkers/Presets/Seth/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Seth/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Seth/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Seth/Pawn.png -------------------------------------------------------------------------------- /Checkers/Sounds/Deselect.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/Deselect.wav -------------------------------------------------------------------------------- /Checkers/Sounds/ForceEnd.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/ForceEnd.wav -------------------------------------------------------------------------------- /Graphics/Game Panel/TurnP1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Game Panel/TurnP1.png -------------------------------------------------------------------------------- /Graphics/Game Panel/TurnP1.psp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Game Panel/TurnP1.psp -------------------------------------------------------------------------------- /Graphics/Game Panel/TurnP2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Game Panel/TurnP2.png -------------------------------------------------------------------------------- /Graphics/Game Panel/TurnP2.psp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Game Panel/TurnP2.psp -------------------------------------------------------------------------------- /Graphics/Game Panel/Winner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Game Panel/Winner.png -------------------------------------------------------------------------------- /Graphics/Game Panel/Winner.psp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Game Panel/Winner.psp -------------------------------------------------------------------------------- /Graphics/Game Types/Game1P.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Game Types/Game1P.png -------------------------------------------------------------------------------- /Graphics/Game Types/Game2P.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Game Types/Game2P.png -------------------------------------------------------------------------------- /Graphics/Pieces/King (Red).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Pieces/King (Red).png -------------------------------------------------------------------------------- /Graphics/Pieces/Pawn (Red).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Pieces/Pawn (Red).png -------------------------------------------------------------------------------- /Checkers/Presets/Smiley/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Smiley/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Smiley/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Smiley/Pawn.png -------------------------------------------------------------------------------- /Checkers/Sounds/JumpMultiple.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Sounds/JumpMultiple.wav -------------------------------------------------------------------------------- /Graphics/Game Types/GameNet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Game Types/GameNet.png -------------------------------------------------------------------------------- /Graphics/Pieces/King (Black).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Pieces/King (Black).png -------------------------------------------------------------------------------- /Graphics/Pieces/King (Gold).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Pieces/King (Gold).png -------------------------------------------------------------------------------- /Graphics/Pieces/King (White).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Pieces/King (White).png -------------------------------------------------------------------------------- /Graphics/Pieces/Pawn (Black).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Pieces/Pawn (Black).png -------------------------------------------------------------------------------- /Graphics/Pieces/Pawn (Gold).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Pieces/Pawn (Gold).png -------------------------------------------------------------------------------- /Graphics/Pieces/Pawn (White).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Pieces/Pawn (White).png -------------------------------------------------------------------------------- /Graphics/Preferences/General.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Preferences/General.png -------------------------------------------------------------------------------- /Graphics/Preferences/Sounds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Preferences/Sounds.png -------------------------------------------------------------------------------- /Checkers/Presets/Cyclops/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Cyclops/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Cyclops/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Cyclops/Pawn.png -------------------------------------------------------------------------------- /Graphics/Preferences/Game Board.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Preferences/Game Board.png -------------------------------------------------------------------------------- /References/Minimax Explained - AI Depot.URL: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://ai-depot.com/LogicGames/MiniMax.html 3 | -------------------------------------------------------------------------------- /References/The Standard Laws of Checkers.URL: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://www.jimloy.com/checkers/rules.htm 3 | -------------------------------------------------------------------------------- /References/Heuristics & Techniques of AI Checkers.URL: -------------------------------------------------------------------------------- 1 | [InternetShortcut] 2 | URL=http://math.hws.edu/~codere/cs453/heuristics.html 3 | -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Kirby/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Kirby/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Kirby/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Kirby/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Megaman/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Megaman/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Megaman/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Megaman/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Metriod/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Metriod/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Metriod/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Metriod/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Tetris/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Tetris/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Tetris/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Tetris/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Bomberman/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Bomberman/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Bomberman/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Bomberman/Pawn.png -------------------------------------------------------------------------------- /Graphics/Screenshots/checkers-screenshot-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Screenshots/checkers-screenshot-01.png -------------------------------------------------------------------------------- /Graphics/Screenshots/checkers-screenshot-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Screenshots/checkers-screenshot-02.png -------------------------------------------------------------------------------- /Graphics/Screenshots/checkers-screenshot-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Screenshots/checkers-screenshot-03.png -------------------------------------------------------------------------------- /Graphics/Screenshots/checkers-screenshot-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Screenshots/checkers-screenshot-04.png -------------------------------------------------------------------------------- /Graphics/Screenshots/checkers-screenshot-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Screenshots/checkers-screenshot-05.png -------------------------------------------------------------------------------- /Graphics/Screenshots/checkers-screenshot-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Graphics/Screenshots/checkers-screenshot-06.png -------------------------------------------------------------------------------- /Checkers/Presets/Operating Systems/Apple/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Operating Systems/Apple/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Operating Systems/Apple/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Operating Systems/Apple/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Operating Systems/Unix/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Operating Systems/Unix/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Operating Systems/Unix/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Operating Systems/Unix/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Operating Systems/Windows/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Operating Systems/Windows/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Operating Systems/Windows/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Operating Systems/Windows/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Boo/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Boo/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Boo/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Boo/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Fish/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Fish/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Fish/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Fish/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Shell/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Shell/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Shell/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Shell/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Yoshi/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Yoshi/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Yoshi/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Yoshi/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Shyguy/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Shyguy/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Shyguy/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Shyguy/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Thwomp/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Thwomp/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Thwomp/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Thwomp/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Legend of Zelda/Fairy/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Legend of Zelda/Fairy/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Legend of Zelda/Fairy/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Legend of Zelda/Fairy/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Legend of Zelda/Guard/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Legend of Zelda/Guard/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Legend of Zelda/Guard/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Legend of Zelda/Guard/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Legend of Zelda/Link/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Legend of Zelda/Link/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Legend of Zelda/Link/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Legend of Zelda/Link/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Mushroom/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Mushroom/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Mushroom/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Mushroom/Pawn.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Koopa Troopa/King.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Koopa Troopa/King.png -------------------------------------------------------------------------------- /Checkers/Presets/Video Games/Super Mario/Koopa Troopa/Pawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joeyespo/checkers/HEAD/Checkers/Presets/Video Games/Super Mario/Koopa Troopa/Pawn.png -------------------------------------------------------------------------------- /Checkers.UI/CheckersDesigner.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms.Design; 3 | 4 | namespace Checkers.UI 5 | { 6 | class CheckersDesigner : ControlDesigner 7 | { 8 | public override SelectionRules SelectionRules 9 | { 10 | get 11 | { 12 | return SelectionRules.Visible | SelectionRules.Moveable; 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Contents copied from .hgignore 2 | 3 | # C/C-Sharp Files 4 | *.ncb 5 | *.nlb 6 | *.aps 7 | *.clw 8 | 9 | # VB6 Files 10 | *.scc 11 | *.vbw 12 | *.pdb 13 | *.log 14 | 15 | # Python Files 16 | *.pyc 17 | 18 | # .NET Files 19 | *.dep 20 | *.aps 21 | *.vbw 22 | *.suo 23 | *.obj 24 | *.ncb 25 | *.plg 26 | *.bsc 27 | *.ilk 28 | *.exp 29 | *.sbr 30 | *.opt 31 | *.pdb 32 | *.idb 33 | *.pch 34 | *.res 35 | *.user 36 | *.sln.cache 37 | ./Resharp* 38 | 39 | # Build and Debug Files 40 | build/* 41 | Build/* 42 | BUILD/* 43 | bin/* 44 | Bin/* 45 | BIN/* 46 | obj/* 47 | Obj/* 48 | OBJ/* 49 | *.exe 50 | *.ex_ 51 | 52 | # Misc and OS Files 53 | Desktop.ini 54 | Thumbs.db 55 | .DS_Store 56 | -------------------------------------------------------------------------------- /Checkers/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | 4 | // 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | // 9 | [assembly: AssemblyTitle("Checkers")] 10 | [assembly: AssemblyDescription("Play checkers against a computer or another player, locally or remotely over a network.")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("Checkers")] 14 | [assembly: AssemblyCopyright("")] 15 | [assembly: AssemblyTrademark("")] 16 | [assembly: AssemblyCulture("")] 17 | 18 | // 19 | // Version information for an assembly consists of the following four values: 20 | // 21 | // Major Version 22 | // Minor Version 23 | // Build Number 24 | // Revision 25 | // 26 | // You can specify all the values or you can default the Revision and Build Numbers 27 | // by using the '*' as shown below: 28 | 29 | [assembly: AssemblyVersion("2.0")] 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Checkers.Framework/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | 4 | // 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | // 9 | [assembly: AssemblyTitle("Checkers Gaming Library")] 10 | [assembly: AssemblyDescription("Everything you need to design your own checkers game.")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("Checkers Gaming Library")] 14 | [assembly: AssemblyCopyright("")] 15 | [assembly: AssemblyTrademark("")] 16 | [assembly: AssemblyCulture("")] 17 | 18 | // 19 | // Version information for an assembly consists of the following four values: 20 | // 21 | // Major Version 22 | // Minor Version 23 | // Build Number 24 | // Revision 25 | // 26 | // You can specify all the values or you can default the Revision and Build Numbers 27 | // by using the '*' as shown below: 28 | 29 | [assembly: AssemblyVersion("2.0")] 30 | -------------------------------------------------------------------------------- /Checkers.UI/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | 4 | // 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | // 9 | [assembly: AssemblyTitle("Checkers UI")] 10 | [assembly: AssemblyDescription("The user interface to the Checkers Gaming Library for customizable checkers games.")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("Checkers UI")] 14 | [assembly: AssemblyCopyright("")] 15 | [assembly: AssemblyTrademark("")] 16 | [assembly: AssemblyCulture("")] 17 | 18 | // 19 | // Version information for an assembly consists of the following four values: 20 | // 21 | // Major Version 22 | // Minor Version 23 | // Build Number 24 | // Revision 25 | // 26 | // You can specify all the values or you can default the Revision and Build Numbers 27 | // by using the '*' as shown below: 28 | 29 | [assembly: AssemblyVersion("2.0")] 30 | -------------------------------------------------------------------------------- /Checkers/TcpClient.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net.Sockets; 3 | using System.Net; 4 | 5 | namespace Checkers 6 | { 7 | // Workaround class to be able to access sockets directly 8 | public class TcpClient : System.Net.Sockets.TcpClient 9 | { 10 | private object tag = null; 11 | 12 | public TcpClient() 13 | { 14 | } 15 | public TcpClient(string host, int port) 16 | : base(host, port) 17 | { 18 | } 19 | public TcpClient(IPEndPoint endPoint) 20 | : base(endPoint) 21 | { 22 | } 23 | public TcpClient(Socket socket) 24 | { 25 | Client = socket; 26 | } 27 | 28 | public Socket Socket 29 | { 30 | get 31 | { 32 | return Client; 33 | } 34 | } 35 | 36 | public object Tag 37 | { 38 | get 39 | { 40 | return tag; 41 | } 42 | set 43 | { 44 | tag = value; 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Checkers.Framework/Agents/RandomAgent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | 4 | namespace Checkers.Agents 5 | { 6 | /// A Checkers agent that selects the next move completely randomly. 7 | public class CheckersRandomAgent : CheckersAgent 8 | { 9 | public static string AgentName 10 | { 11 | get 12 | { 13 | return "Random Move Agent"; 14 | } 15 | } 16 | 17 | private Random rand; 18 | 19 | public CheckersRandomAgent() 20 | { 21 | rand = new Random(); 22 | } 23 | public CheckersRandomAgent(int seed) 24 | { 25 | rand = new Random(seed); 26 | } 27 | 28 | public override CheckersMove NextMove(CheckersGame game) 29 | { 30 | CheckersPiece[] movable = game.EnumMovablePieces(); 31 | CheckersMove move = game.BeginMove(movable[rand.Next(movable.Length)]); 32 | while(move.MustMove) 33 | { 34 | Point[] moves = move.EnumMoves(); 35 | move.Move(moves[rand.Next(moves.Length)]); 36 | } 37 | return move; 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Checkers 2 | -------- 3 | 4 | Play Checkers with multiple levels of difficulty, with another player, or over 5 | the net, which features a fully functional in-game chat. The game is fully 6 | customizable and you can even select your own piece images. 7 | 8 | 9 | Screenshots 10 | ----------- 11 | 12 | ![Checkers Screenshot 1](http://i.imgur.com/8FY7V.png) 13 | 14 | The game. 15 | 16 | 17 | ![Checkers Screenshot 2](http://i.imgur.com/9k3qc.png) 18 | 19 | It starts. Player against computer. 20 | 21 | 22 | ![Checkers Screenshot 3](http://i.imgur.com/ekLYk.png) 23 | 24 | Player is winning! 25 | 26 | 27 | ![Checkers Screenshot 4](http://i.imgur.com/ymOqp.png) 28 | 29 | The New Game dialog with custom pieces. 30 | 31 | 32 | ![Checkers Screenshot 5](http://i.imgur.com/6EFCR.png) 33 | 34 | Setting up a network game on the New Game dialog. 35 | 36 | 37 | ![Checkers Screenshot 6](http://i.imgur.com/nrPl8.png) 38 | 39 | Player vs computer with custom pieces! 40 | 41 | 42 | View album on [imgur](http://imgur.com/a/Lbf3q). 43 | 44 | 45 | Implementation Details 46 | ---------------------- 47 | 48 | The project's solution is partitioned into three Visual Studio (2008) solution 49 | file projects. 50 | 51 | 1. Checkers.Framework -- A fully functional and modular Checkers game API 52 | 2. Checkers.UI -- A customizable user control based on Checkers.Framework 53 | 3. Checkers -- The application EXE with all the extra bells and whistles 54 | 55 | These modular assemblies can easily be dropped into other projects. 56 | -------------------------------------------------------------------------------- /Checkers/TcpClientCollection.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | 4 | namespace Checkers 5 | { 6 | public class TcpClientCollection : CollectionBase, IEnumerable 7 | { 8 | 9 | public int Add(TcpClient item) 10 | { 11 | return InnerList.Add(item); 12 | } 13 | 14 | public void AddRange(TcpClient[] items) 15 | { 16 | foreach(TcpClient item in items) 17 | Add(item); 18 | } 19 | 20 | public void Insert(int index, TcpClient item) 21 | { 22 | InnerList.Insert(index, item); 23 | } 24 | 25 | public void Remove(TcpClient item) 26 | { 27 | InnerList.Remove(item); 28 | } 29 | 30 | public bool Contains(TcpClient item) 31 | { 32 | return InnerList.Contains(item); 33 | } 34 | 35 | public int IndexOf(TcpClient item) 36 | { 37 | return InnerList.IndexOf(item); 38 | } 39 | 40 | public void CopyTo(TcpClient[] array, int index) 41 | { 42 | InnerList.CopyTo(array, index); 43 | } 44 | 45 | public TcpClient this[int index] 46 | { 47 | get 48 | { 49 | return (TcpClient)InnerList[index]; 50 | } 51 | set 52 | { 53 | InnerList[index] = value; 54 | } 55 | } 56 | 57 | public TcpClient[] ToArray() 58 | { 59 | return (TcpClient[])InnerList.ToArray(typeof(TcpClient)); 60 | } 61 | 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Checkers.Framework/CheckersAgent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Checkers 4 | { 5 | #region AgentTick Class and Delegate 6 | 7 | public class AgentTickEventArgs : EventArgs 8 | { 9 | CheckersGame game; 10 | object tag; 11 | 12 | public AgentTickEventArgs() 13 | { 14 | this.game = null; 15 | } 16 | public AgentTickEventArgs(CheckersGame game) 17 | { 18 | this.game = game; 19 | } 20 | 21 | public CheckersGame Game 22 | { 23 | get 24 | { 25 | return game; 26 | } 27 | set 28 | { 29 | game = value; 30 | } 31 | } 32 | 33 | public object Tag 34 | { 35 | get 36 | { 37 | return tag; 38 | } 39 | set 40 | { 41 | tag = value; 42 | } 43 | } 44 | } 45 | 46 | public delegate void AgentTickEventHandler(object sender, AgentTickEventArgs e); 47 | 48 | #endregion 49 | 50 | public abstract class CheckersAgent 51 | { 52 | public event AgentTickEventHandler Tick; 53 | 54 | public CheckersAgent() 55 | { 56 | } 57 | 58 | /// Returns the best possible next move using the current move-finding technique. 59 | /// The next best possible move. 60 | public abstract CheckersMove NextMove(CheckersGame game); 61 | 62 | protected void OnTick(CheckersGame game) 63 | { 64 | if(Tick != null) 65 | Tick(this, new AgentTickEventArgs(game)); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Checkers.Framework/Agents/MinMaxSimpleAgent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Checkers.Agents 4 | { 5 | public class MinMaxSimpleAgent : MinMaxBaseAgent 6 | { 7 | public MinMaxSimpleAgent(int maxSearchDepth) 8 | : base(maxSearchDepth) 9 | { 10 | } 11 | public MinMaxSimpleAgent() 12 | : base() 13 | { 14 | } 15 | 16 | 17 | protected override int CalculateStrength(CheckersGame initGame, CheckersGame curGame) 18 | { 19 | int player = ((curGame.Turn != 1) ? (2) : (1)); 20 | int opponent = ((curGame.Turn != 1) ? (1) : (2)); 21 | int strength = 0; 22 | 23 | // Strength Heuristics 24 | // -------------------- 25 | 26 | // Heuristic: Stronger for each player pawn and king the player still has on the board 27 | strength += 3 * curGame.GetPawnCount(player); 28 | strength += 10 * curGame.GetKingCount(player); 29 | 30 | // Heuristic: Stronger if opponent was jumped 31 | strength += 2 * ((initGame.GetPawnCount(opponent) - curGame.GetPawnCount(opponent))); 32 | strength += 5 * (initGame.GetKingCount(opponent) - curGame.GetKingCount(opponent)); 33 | 34 | // Weakness Heuristics 35 | // -------------------- 36 | 37 | // Heuristic: Weaker for each opponent pawn and king the player still has on the board 38 | strength -= 3 * curGame.GetPawnCount(opponent); 39 | strength -= 10 * curGame.GetKingCount(opponent); 40 | 41 | // Heuristic: Weaker if player was jumped 42 | strength -= 2 * ((initGame.GetPawnCount(player) - curGame.GetPawnCount(player))); 43 | strength -= 5 * (initGame.GetKingCount(player) - curGame.GetKingCount(player)); 44 | 45 | // Return the difference of strengths 46 | return strength; 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Checkers.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 10.00 2 | # Visual Studio 2008 3 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Checkers", "Checkers\Checkers.csproj", "{B7585220-DD42-48B2-B68E-DBB2AC645642}" 4 | EndProject 5 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Checkers.Framework", "Checkers.Framework\Checkers.Framework.csproj", "{EF66778A-5067-49AA-91AC-70D048F482F8}" 6 | EndProject 7 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Checkers.UI", "Checkers.UI\Checkers.UI.csproj", "{66C6B81B-5C99-4A60-8F4A-A3E46FFB97D4}" 8 | EndProject 9 | Global 10 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 11 | Debug|Any CPU = Debug|Any CPU 12 | Release|Any CPU = Release|Any CPU 13 | EndGlobalSection 14 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 15 | {B7585220-DD42-48B2-B68E-DBB2AC645642}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 16 | {B7585220-DD42-48B2-B68E-DBB2AC645642}.Debug|Any CPU.Build.0 = Debug|Any CPU 17 | {B7585220-DD42-48B2-B68E-DBB2AC645642}.Release|Any CPU.ActiveCfg = Release|Any CPU 18 | {B7585220-DD42-48B2-B68E-DBB2AC645642}.Release|Any CPU.Build.0 = Release|Any CPU 19 | {EF66778A-5067-49AA-91AC-70D048F482F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 20 | {EF66778A-5067-49AA-91AC-70D048F482F8}.Debug|Any CPU.Build.0 = Debug|Any CPU 21 | {EF66778A-5067-49AA-91AC-70D048F482F8}.Release|Any CPU.ActiveCfg = Release|Any CPU 22 | {EF66778A-5067-49AA-91AC-70D048F482F8}.Release|Any CPU.Build.0 = Release|Any CPU 23 | {66C6B81B-5C99-4A60-8F4A-A3E46FFB97D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 24 | {66C6B81B-5C99-4A60-8F4A-A3E46FFB97D4}.Debug|Any CPU.Build.0 = Debug|Any CPU 25 | {66C6B81B-5C99-4A60-8F4A-A3E46FFB97D4}.Release|Any CPU.ActiveCfg = Release|Any CPU 26 | {66C6B81B-5C99-4A60-8F4A-A3E46FFB97D4}.Release|Any CPU.Build.0 = Release|Any CPU 27 | EndGlobalSection 28 | GlobalSection(SolutionProperties) = preSolution 29 | HideSolutionNode = FALSE 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /Checkers.Framework/CheckersPieceCollection.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | 4 | namespace Checkers 5 | { 6 | public class CheckersPieceCollection : CollectionBase, IEnumerable 7 | { 8 | public int Add(CheckersPiece item) 9 | { 10 | return InnerList.Add(item); 11 | } 12 | 13 | public void AddRange(CheckersPiece[] items) 14 | { 15 | foreach(CheckersPiece item in items) 16 | Add(item); 17 | } 18 | 19 | public void Insert(int index, CheckersPiece item) 20 | { 21 | InnerList.Insert(index, item); 22 | } 23 | 24 | public void Remove(CheckersPiece item) 25 | { 26 | InnerList.Remove(item); 27 | } 28 | 29 | public bool Contains(CheckersPiece item) 30 | { 31 | return InnerList.Contains(item); 32 | } 33 | 34 | public int IndexOf(CheckersPiece item) 35 | { 36 | return InnerList.IndexOf(item); 37 | } 38 | 39 | public void CopyTo(CheckersPiece[] array, int index) 40 | { 41 | InnerList.CopyTo(array, index); 42 | } 43 | 44 | /// Creates a shallow copy of the CheckersPieceCollection. 45 | public CheckersPieceCollection Clone() 46 | { 47 | CheckersPieceCollection clone = new CheckersPieceCollection(); 48 | clone.AddRange(ToArray()); 49 | return clone; 50 | } 51 | 52 | public CheckersPiece this[int index] 53 | { 54 | get 55 | { 56 | return (CheckersPiece)InnerList[index]; 57 | } 58 | set 59 | { 60 | InnerList[index] = value; 61 | } 62 | } 63 | 64 | public CheckersPiece[] ToArray() 65 | { 66 | return (CheckersPiece[])InnerList.ToArray(typeof(CheckersPiece)); 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /Checkers.Framework/Agents/MinMaxComplexAgent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Checkers.Agents 4 | { 5 | public class MinMaxComplexAgent : MinMaxSimpleAgent 6 | { 7 | public MinMaxComplexAgent(int maxSearchDepth) 8 | : base(maxSearchDepth) 9 | { 10 | } 11 | public MinMaxComplexAgent() 12 | : base() 13 | { 14 | } 15 | 16 | protected override int CalculateStrength(CheckersGame initGame, CheckersGame curGame) 17 | { 18 | int player = ((curGame.Turn != 1) ? (2) : (1)); 19 | int opponent = ((curGame.Turn != 1) ? (1) : (2)); 20 | int strength = base.CalculateStrength(initGame, curGame); 21 | 22 | // Sum all player's piece heuristic values 23 | foreach(CheckersPiece piece in curGame.Pieces) 24 | { 25 | if(piece.Player == player) 26 | strength += CalculatePieceStrength(piece); 27 | else 28 | strength -= CalculatePieceStrength(piece); 29 | } 30 | 31 | return strength; 32 | } 33 | 34 | int CalculatePieceStrength(CheckersPiece piece) 35 | { 36 | int strength = 0; 37 | 38 | // Heuristic: Stronger simply because another piece is present 39 | strength += 1; 40 | 41 | // Rank-specific heuristics 42 | if(piece.Rank == CheckersRank.Pawn) 43 | { 44 | // Heuristic: stronger if in primary position on board 45 | if(piece.Direction == CheckersDirection.Up) 46 | { 47 | if(piece.Location.Y == CheckersGame.BoardBounds.Bottom) 48 | strength += 1; 49 | } 50 | else 51 | { 52 | if(piece.Location.Y == CheckersGame.BoardBounds.Top) 53 | strength += 1; 54 | } 55 | } 56 | else 57 | { 58 | // Heuristic: Stronger if king is on board 59 | strength += 19; 60 | } 61 | 62 | return strength; 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Checkers.Framework/Agents/MostJumpsAgent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Collections; 4 | 5 | namespace Checkers.Agents 6 | { 7 | public class CheckersMostJumpsAgent : CheckersAgent 8 | { 9 | private Random rand; 10 | 11 | public CheckersMostJumpsAgent() 12 | { 13 | rand = new Random(); 14 | } 15 | public CheckersMostJumpsAgent(int seed) 16 | { 17 | rand = new Random(seed); 18 | } 19 | 20 | public override CheckersMove NextMove(CheckersGame game) 21 | { 22 | int maxJumps = 0; 23 | CheckersPiece[] movables = game.EnumMovablePieces(); 24 | ArrayList possibleMoves = new ArrayList(movables.Length); 25 | foreach(CheckersPiece movable in movables) 26 | possibleMoves.Add(game.BeginMove(movable)); 27 | // Get all possible jump combos 28 | ArrayList finishedMoves = new ArrayList(); 29 | while(possibleMoves.Count > 0) 30 | { 31 | CheckersMove move = (CheckersMove)possibleMoves[0]; 32 | possibleMoves.RemoveAt(0); 33 | Point[] points = move.EnumMoves(); 34 | if(points.Length == 0) 35 | { 36 | // Move is complete; add to finished moves and test for current max jumps 37 | finishedMoves.Add(move); 38 | if(maxJumps < move.Jumped.Length) 39 | maxJumps = move.Jumped.Length; 40 | continue; 41 | } 42 | // Enumerate all moves from this point and append them to the possible moves array 43 | foreach(Point p in points) 44 | { 45 | CheckersMove next = move.Clone(); 46 | next.Move(p); 47 | possibleMoves.Add(next); 48 | } 49 | } 50 | // Get list of max jumps 51 | ArrayList moveList = new ArrayList(); 52 | foreach(CheckersMove move in finishedMoves) 53 | { 54 | if(move.Jumped.Length != maxJumps) 55 | continue; 56 | moveList.Add(move); 57 | } 58 | // Choose at random between any path with same number of jumps 59 | if(moveList.Count == 0) 60 | return null; 61 | return (CheckersMove)moveList[rand.Next(moveList.Count)]; 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /Checkers/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.ObjectModel; 4 | using System.ComponentModel; 5 | using System.Text; 6 | using System.Windows.Forms; 7 | using System.IO; 8 | 9 | namespace Checkers 10 | { 11 | /// 12 | /// Defines the entry point of the application. 13 | /// 14 | public static class Program 15 | { 16 | /// 17 | /// The main entry point for the application. 18 | /// 19 | [STAThread] 20 | public static void Main() 21 | { 22 | Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ThreadException); 23 | using(MainForm form = new MainForm()) 24 | Application.Run(form); 25 | } 26 | 27 | /// 28 | /// Catches any unhandled exceptions on the main thread and logs them. 29 | /// 30 | /// The sender. 31 | /// The instance containing the event data. 32 | private static void ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 33 | { 34 | try 35 | { 36 | int ext = 1; 37 | string filename; 38 | 39 | while(true) 40 | { 41 | filename = "ErrorLog [" + DateTime.Now.ToShortDateString() + "]"; 42 | filename = filename.Replace('/', '-').Replace('\\', '-'); 43 | filename += ext != 1 44 | ? " (" + ext + ")" 45 | : string.Empty; 46 | if(!File.Exists(Path.GetDirectoryName(Application.ExecutablePath) + "\\" + filename + ".log")) 47 | break; 48 | ++ext; 49 | } 50 | 51 | filename = Path.GetDirectoryName(Application.ExecutablePath) + "\\" + filename + ".log"; 52 | using(StreamWriter fs = File.CreateText(filename)) 53 | { 54 | fs.WriteLine(Application.ProductName + " " + Application.ProductVersion); 55 | fs.WriteLine(DateTime.Now.ToLongDateString() + " at " + DateTime.Now.ToLongTimeString()); 56 | fs.WriteLine(); 57 | fs.WriteLine(e.ToString()); 58 | } 59 | } 60 | finally 61 | { 62 | // Rethrow the exception, crashing the application 63 | throw e.Exception; 64 | } 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Checkers.UI/Timer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.InteropServices; 3 | using System.Security; 4 | 5 | namespace Checkers 6 | { 7 | /// 8 | /// Represents a timer. 9 | /// 10 | internal class Timer 11 | { 12 | private static bool isTimerInitialized = false; 13 | private static bool m_bUsingQPF = false; 14 | private static long m_llQPFTicksPerSec = 0; 15 | private static long m_llBaseTime = 0; 16 | private static double m_fBaseTime = 0; 17 | 18 | 19 | /// 20 | /// Returns the current pc time in seconds. 21 | /// Note that this value should be used relatively, not on its own since the source may vary. 22 | /// 23 | /// 24 | public static float Query() 25 | { 26 | if(!isTimerInitialized) 27 | { 28 | isTimerInitialized = true; 29 | 30 | // Use QueryPerformanceFrequency() to get frequency of timer. If QPF is 31 | // not supported, we will timeGetTime() which returns milliseconds. 32 | long qwTicksPerSec = 0; 33 | m_bUsingQPF = QueryPerformanceFrequency(ref qwTicksPerSec); 34 | 35 | // Get base times 36 | if(m_bUsingQPF) 37 | { 38 | m_llQPFTicksPerSec = qwTicksPerSec; 39 | QueryPerformanceCounter(ref m_llBaseTime); 40 | } 41 | else 42 | { 43 | m_fBaseTime = (float)(timeGetTime() * 0.001); 44 | } 45 | 46 | // Return INIT 47 | return 0; 48 | } 49 | 50 | // !!!!! Check for overflow 51 | 52 | // Return elapsed time 53 | if(m_bUsingQPF) 54 | { 55 | long qwTime = 0; 56 | QueryPerformanceCounter(ref qwTime); 57 | return (float)((double)(qwTime - m_llBaseTime) / (double)(m_llQPFTicksPerSec)); 58 | } 59 | else 60 | { 61 | double dTime = (timeGetTime() * 0.001); 62 | return (float)(dTime - m_fBaseTime); 63 | } 64 | } 65 | 66 | #region Win32 Members 67 | 68 | [SuppressUnmanagedCodeSecurity] // We won't use this maliciously 69 | [DllImport("kernel32")] 70 | static extern bool QueryPerformanceFrequency(ref long PerformanceFrequency); 71 | 72 | [SuppressUnmanagedCodeSecurity] // We won't use this maliciously 73 | [DllImport("kernel32")] 74 | static extern bool QueryPerformanceCounter(ref long PerformanceCount); 75 | 76 | [SuppressUnmanagedCodeSecurity] // We won't use this maliciously 77 | [DllImport("winmm.dll")] 78 | static extern int timeGetTime(); 79 | 80 | #endregion 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /ToDo.txt: -------------------------------------------------------------------------------- 1 | Checkers ToDo 2 | ------------- 3 | 4 | * Time remaining 5 | * Create king PictureBox in 'New Game' for custom king images (initially holds default king icon) 6 | * Naming players 7 | * Save/load settings 8 | * Create Checkers.ini file if doesnt exist when first run 9 | * Sounds 10 | * Button to 'show last move' 11 | * Show 'Nice!' and 'Winner!' 12 | * Have a 'default' button for each color 13 | * Window flashing 14 | * Send/receive message sounds 15 | * Make all settings work 16 | * Checkers agents for higher difficulties 17 | * Hint Option: use an agent on player's turn to highlight a useful move 18 | x Option: Delay AI movement 19 | x Fix up context menu issue in frmNewGame 20 | - Detach Agents from project .. allow to be plug-in-able 21 | - Preference: Remember last game info for a new game 22 | - Easter eggs - pieces, etc 23 | - Tournament mode: human vs. pc's or other humans 24 | - No help button in tourneys 25 | - Game snapshots for later review 26 | - Game logging and reviewing (playback) 27 | 28 | Checkers Agents 29 | ---------------- 30 | - Make separate entity (plugins) 31 | - Use a endgame database 32 | - Improve heuristics 33 | - Make endgame heuristics aim differently.. deeper search 34 | - Use BFS so can evaluate up to a certain time instead of depth (use a min time and depth method) 35 | - If best move is found, remember it 36 | - Detect definite wins, losses, and stalemates (according to agent's movement) 37 | 38 | Checkers Netplay 39 | ----------------- 40 | 41 | * Net gaming 42 | * Chat: sounds in new game window 43 | * Chat window context menu (std edit menu + "save...") 44 | * Chatting .. when a msg is received and the textbox loses/restores focus, it highlights your prev send-message 45 | x In 'frmNewGame' flash window when opponent clicks "I'm Ready" 46 | - The 'Copy' menu item in the chat window --> copies entire text, make it copy only selected text 47 | - Better network handling in 'frmNewGame' (prevent deadlock; separate client and host windows) 48 | - Allow spectators 49 | - Allow host to be a spectator (dedicated game server) 50 | - Separate into own entity.. a game plugin (as an agent?) 51 | - Net tournament mode 52 | - Get WAN from net 53 | 54 | Checkers UI 55 | ----------- 56 | 57 | * Make event-based in case coder uses internal game structure to play 58 | * Be sure no 'game' objects can throw NullReferenceException in public functions 59 | * Allow clickable movements; instead of dragable movements 60 | * Hide 'jumped' in the process of a double-jump 61 | * Show last move 62 | * Show more subtle 'Must jump' message (Option) 63 | * Property: 'Text' -- shows text on the board (using ForeColor) 64 | * Property: 'TextAlign' 65 | * Stalemates (through game) 66 | x With optional jumping, if double-jump is available keep going .. if piece is placed on same spot, end turn 67 | - Preference: Smooth animations (frame-based animation) 68 | 69 | Checkers Game 70 | ------------- 71 | 72 | * Remember last CheckersPiece that moved: LastMoved 73 | * Stalemates 74 | x Make game able to play with optional jumping 75 | - Make less strict mode (allow user to do illegal moves, manipulate the board/pieces, etc) 76 | - Remake to use new data structure model: board as linked list and matrix, moves as linked list 77 | Functions include board analyzation and manipulation 78 | -------------------------------------------------------------------------------- /Checkers/AboutDialog.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Collections; 4 | using System.ComponentModel; 5 | using System.Windows.Forms; 6 | 7 | namespace Checkers 8 | { 9 | /// 10 | /// Represents the about dialog. 11 | /// 12 | public sealed partial class frmAbout : Form 13 | { 14 | /// 15 | /// Initializes a new instance of the class. 16 | /// 17 | public frmAbout() 18 | { 19 | InitializeComponent(); 20 | 21 | lblTitle.Text = AppTitle; 22 | lblDescription.Text = AppDescription; 23 | } 24 | 25 | #region Event Handler Methods 26 | 27 | /// 28 | /// Handles the Load event of the frmAbout control. 29 | /// 30 | /// The source of the event. 31 | /// The instance containing the event data. 32 | private void frmAbout_Load(object sender, System.EventArgs e) 33 | { 34 | string m_strProductVersion; 35 | string m_strVersion; 36 | string m_strRevision; 37 | int i; 38 | 39 | m_strProductVersion = System.Windows.Forms.Application.ProductVersion; 40 | 41 | i = m_strProductVersion.IndexOf("."); 42 | if(i >= 0) 43 | i = m_strProductVersion.IndexOf(".", (i + 1)); 44 | m_strVersion = ((i >= 0) ? (m_strProductVersion.Substring(0, i)) : ("0")); 45 | 46 | if(i >= 0) 47 | i = m_strProductVersion.IndexOf(".", (i + 1)); 48 | m_strRevision = ((i >= 0) ? (m_strProductVersion.Substring(i + 1)) : ("0")); 49 | 50 | lblVersion.Text = "Version: " + m_strVersion; 51 | lblRevision.Text = "[Revision: " + m_strRevision + "]"; 52 | } 53 | 54 | /// 55 | /// Handles the LinkClicked event of the lnkWebLink control. 56 | /// 57 | /// The source of the event. 58 | /// The instance containing the event data. 59 | private void lnkWebLink_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) 60 | { 61 | try 62 | { 63 | // Call the Process.Start method to open the default browser with a URL: 64 | System.Diagnostics.Process.Start("http://joeyespo.com"); 65 | } 66 | catch(Win32Exception) 67 | { 68 | } 69 | catch 70 | { 71 | // Failsafe 72 | MessageBox.Show(this, "Could not start browser process.", AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 73 | } 74 | } 75 | 76 | /// 77 | /// Handles the MouseEnter event of the lnkWebLink control. 78 | /// 79 | /// The source of the event. 80 | /// The instance containing the event data. 81 | private void lnkWebLink_MouseEnter(object sender, System.EventArgs e) 82 | { 83 | lnkWebLink.LinkColor = lnkWebLink.ActiveLinkColor; 84 | } 85 | 86 | /// 87 | /// Handles the MouseLeave event of the lnkWebLink control. 88 | /// 89 | /// The source of the event. 90 | /// The instance containing the event data. 91 | private void lnkWebLink_MouseLeave(object sender, System.EventArgs e) 92 | { 93 | lnkWebLink.LinkColor = lnkWebLink.ForeColor; 94 | } 95 | 96 | /// 97 | /// Handles the Resize event of the lblVersion control. 98 | /// 99 | /// The source of the event. 100 | /// The instance containing the event data. 101 | private void lblVersion_Resize(object sender, System.EventArgs e) 102 | { 103 | lblRevision.Left = lblVersion.Left + lblVersion.Width; 104 | } 105 | 106 | #endregion 107 | 108 | private const string AppTitle = "Checkers"; 109 | private const string AppDescription = "Play checkers against a computer or another player, locally or remotely over a network."; 110 | 111 | // >> Icon is located on the window 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /Checkers.Framework/CheckersPiece.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | 4 | namespace Checkers 5 | { 6 | public enum CheckersRank 7 | { 8 | Pawn = 0, 9 | King = 1, 10 | } 11 | 12 | public enum CheckersDirection 13 | { 14 | Up = 0, 15 | Down = 1, 16 | } 17 | 18 | public class CheckersPiece 19 | { 20 | private CheckersGame owner; 21 | private int player; 22 | private CheckersRank rank; 23 | private Point location; 24 | private bool inPlay; 25 | 26 | /// Creates a new generic CheckersPiece object that is not currently in play. 27 | /// The player index of the piece. 28 | /// The piece's rank. 29 | public CheckersPiece(int player, CheckersRank rank) 30 | : this(null, player, rank, Point.Empty, false) 31 | { 32 | } 33 | /// Creates a new generic CheckersPiece object that is in play. 34 | /// The player index of the piece. 35 | /// The piece's rank. 36 | /// The piece's location on the board. 37 | public CheckersPiece(int player, CheckersRank rank, Point location) 38 | : this(null, player, rank, location, true) 39 | { 40 | } 41 | internal CheckersPiece(CheckersGame owner, int player, CheckersRank rank, Point location, bool inPlay) 42 | { 43 | if((player < 1) || (player > 2)) 44 | throw new ArgumentOutOfRangeException("player", player, "Argument 'player' must be a valid player number (a number greater or equal to 1)."); 45 | if((location.X < 0) || (location.X >= CheckersGame.BoardSize.Width) || (location.Y < 0) || (location.Y >= CheckersGame.BoardSize.Height)) 46 | throw new ArgumentOutOfRangeException("location", player, "Argument 'location' must be a valid position on the board."); 47 | this.owner = owner; 48 | this.player = player; 49 | this.rank = rank; 50 | this.location = location; 51 | this.inPlay = inPlay; 52 | } 53 | 54 | public CheckersGame Owner 55 | { 56 | get 57 | { 58 | return owner; 59 | } 60 | } 61 | 62 | public bool InPlay 63 | { 64 | get 65 | { 66 | return inPlay; 67 | } 68 | } 69 | 70 | public int Player 71 | { 72 | get 73 | { 74 | return player; 75 | } 76 | } 77 | 78 | /// 79 | /// The piece's primary direction relative to the point-of-view of the internal board. 80 | /// Note: if no direction, will return CheckersDirection.Up, therefore invalid for pieces without a valid player. 81 | /// 82 | public CheckersDirection Direction 83 | { 84 | get 85 | { 86 | return ((player != 1) ? (CheckersDirection.Down) : (CheckersDirection.Up)); 87 | } 88 | } 89 | 90 | public CheckersRank Rank 91 | { 92 | get 93 | { 94 | return rank; 95 | } 96 | } 97 | 98 | public Point Location 99 | { 100 | get 101 | { 102 | return location; 103 | } 104 | } 105 | 106 | 107 | internal void Moved(Point location) 108 | { 109 | this.location = location; 110 | } 111 | 112 | internal void Promoted() 113 | { 114 | rank = CheckersRank.King; 115 | } 116 | 117 | internal void RemovedFromPlay() 118 | { 119 | location = Point.Empty; 120 | inPlay = false; 121 | } 122 | 123 | /// Creates a duplicate Checkers piece object from an identical (possibly cloned) game. 124 | /// The new Checkers piece object. 125 | public CheckersPiece Clone(CheckersGame game) 126 | { 127 | CheckersPiece clonedPiece = game.PieceAt(Location); 128 | // Make sure piece exists 129 | if(clonedPiece == null) 130 | return null; 131 | // Make sure piece is equivalent 132 | if((clonedPiece.Player != Player) || (clonedPiece.InPlay != InPlay) || (clonedPiece.Rank != Rank)) 133 | return null; 134 | // Return cloned piece 135 | return clonedPiece; 136 | } 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /Checkers.UI/Checkers.UI.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Local 4 | 9.0.21022 5 | 2.0 6 | {66C6B81B-5C99-4A60-8F4A-A3E46FFB97D4} 7 | Debug 8 | AnyCPU 9 | 10 | 11 | 12 | 13 | Checkers.UI 14 | 15 | 16 | JScript 17 | Grid 18 | IE50 19 | false 20 | Library 21 | Checkers.UI 22 | 23 | 24 | 25 | 26 | 27 | 28 | 0.0 29 | 30 | 31 | ..\Bin\ 32 | false 33 | 285212672 34 | false 35 | 36 | 37 | DEBUG;TRACE 38 | 39 | 40 | true 41 | 4096 42 | false 43 | false 44 | false 45 | false 46 | 4 47 | full 48 | prompt 49 | 50 | 51 | ..\Bin\ 52 | false 53 | 285212672 54 | false 55 | 56 | 57 | TRACE 58 | 59 | 60 | false 61 | 4096 62 | true 63 | false 64 | false 65 | false 66 | 4 67 | none 68 | prompt 69 | 70 | 71 | 72 | System 73 | 74 | 75 | System.Data 76 | 77 | 78 | System.Design 79 | 80 | 81 | System.Drawing 82 | 83 | 84 | System.Windows.Forms 85 | 86 | 87 | System.XML 88 | 89 | 90 | CheckersLib 91 | {EF66778A-5067-49AA-91AC-70D048F482F8} 92 | {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 93 | 94 | 95 | 96 | 97 | Code 98 | 99 | 100 | Code 101 | 102 | 103 | UserControl 104 | 105 | 106 | Code 107 | 108 | 109 | CheckersUI.cs 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /Checkers.Framework/Checkers.Framework.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Local 4 | 9.0.21022 5 | 2.0 6 | {EF66778A-5067-49AA-91AC-70D048F482F8} 7 | Debug 8 | AnyCPU 9 | 10 | 11 | 12 | 13 | Checkers.Framework 14 | 15 | 16 | JScript 17 | Grid 18 | IE50 19 | false 20 | Library 21 | Checkers.Framework 22 | 23 | 24 | 25 | 26 | 27 | 28 | 0.0 29 | 30 | 31 | ..\Bin\ 32 | false 33 | 285212672 34 | false 35 | 36 | 37 | DEBUG;TRACE 38 | 39 | 40 | true 41 | 4096 42 | false 43 | false 44 | false 45 | false 46 | 4 47 | full 48 | prompt 49 | 50 | 51 | ..\Bin\ 52 | false 53 | 285212672 54 | false 55 | 56 | 57 | TRACE 58 | 59 | 60 | false 61 | 4096 62 | true 63 | false 64 | false 65 | false 66 | 4 67 | none 68 | prompt 69 | 70 | 71 | 72 | System 73 | 74 | 75 | System.Data 76 | 77 | 78 | System.Drawing 79 | 80 | 81 | System.XML 82 | 83 | 84 | 85 | 86 | Code 87 | 88 | 89 | Code 90 | 91 | 92 | Code 93 | 94 | 95 | Code 96 | 97 | 98 | Code 99 | 100 | 101 | Code 102 | 103 | 104 | Code 105 | 106 | 107 | Code 108 | 109 | 110 | Code 111 | 112 | 113 | Code 114 | 115 | 116 | Code 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /Checkers.UI/CheckersUI.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | text/microsoft-resx 89 | 90 | 91 | 1.3 92 | 93 | 94 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 95 | 96 | 97 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 98 | 99 | 100 | 109, 17 101 | 102 | 103 | 17, 17 104 | 105 | 106 | CheckersUI 107 | 108 | -------------------------------------------------------------------------------- /Checkers/Settings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Text; 4 | using System.Reflection; 5 | using System.ComponentModel; 6 | using System.Runtime.Serialization; 7 | using System.Runtime.Serialization.Formatters.Soap; 8 | using System.Collections; 9 | using System.Drawing; 10 | using System.Windows.Forms; 11 | 12 | namespace Checkers 13 | { 14 | public enum CheckersSounds : int 15 | { 16 | [DefaultValue("Begin.wav")] 17 | Begin = 0, 18 | 19 | [DefaultValue("ForceEnd.wav")] 20 | ForceEnd = 1, 21 | 22 | [DefaultValue("Winner.wav")] 23 | Winner = 2, 24 | 25 | [DefaultValue("EndGame.wav")] 26 | EndGame = 3, 27 | 28 | [DefaultValue("Select.wav")] 29 | Select = 4, 30 | 31 | [DefaultValue("Deselect.wav")] 32 | Deselect = 5, 33 | 34 | [DefaultValue("BadMove.wav")] 35 | BadMove = 6, 36 | 37 | [DefaultValue("Drop.wav")] 38 | Drop = 7, 39 | 40 | [DefaultValue("Jump.wav")] 41 | Jump = 8, 42 | 43 | [DefaultValue("JumpMultiple.wav")] 44 | JumpMultiple = 9, 45 | 46 | [DefaultValue("King.wav")] 47 | King = 10, 48 | 49 | [DefaultValue("Lost.wav")] 50 | Lost = 11, 51 | 52 | [DefaultValue("MsgSend.wav")] 53 | SendMessage = 12, 54 | 55 | [DefaultValue("MsgRecv.wav")] 56 | ReceiveMessage = 13, 57 | } 58 | 59 | [Serializable()] 60 | public class CheckersSettings 61 | { 62 | public static readonly int Port = 6000; 63 | 64 | // General settings 65 | [DefaultValue(true)] 66 | public bool HighlightSelection; 67 | 68 | [DefaultValue(true)] 69 | public bool HighlightPossibleMoves; 70 | 71 | [DefaultValue(true)] 72 | public bool ShowJumpMessage; 73 | 74 | // Net settings 75 | [DefaultValue(true)] 76 | public bool FlashWindowOnGameEvents; 77 | 78 | [DefaultValue(true)] 79 | public bool FlashWindowOnTurn; 80 | 81 | [DefaultValue(true)] 82 | public bool FlashWindowOnMessage; 83 | 84 | [DefaultValue(true)] 85 | public bool ShowNetPanelOnMessage; 86 | 87 | [DefaultValue(true)] 88 | public bool ShowTextFeedback; 89 | 90 | // Board appearance 91 | [DefaultValue(typeof(Color), "White")] 92 | public Color BackColor; 93 | 94 | [DefaultValue(typeof(Color), "DarkSeaGreen")] 95 | public Color BoardBackColor; 96 | 97 | [DefaultValue(typeof(Color), "OldLace")] 98 | public Color BoardForeColor; 99 | 100 | [DefaultValue(typeof(Color), "Gray")] 101 | public Color BoardGridColor; 102 | 103 | // Sounds 104 | public string[] sounds; 105 | 106 | [DefaultValue(false)] 107 | public bool MuteSounds; 108 | 109 | 110 | public CheckersSettings() 111 | { 112 | // Properties 113 | foreach(FieldInfo field in GetType().GetFields()) 114 | { 115 | if((!field.IsPublic) || (field.IsSpecialName)) 116 | continue; 117 | object[] attr = field.GetCustomAttributes(typeof(DefaultValueAttribute), true); 118 | if(attr.Length == 0) 119 | continue; 120 | field.SetValue(this, ((DefaultValueAttribute)attr[0]).Value); 121 | } 122 | // Sounds 123 | ArrayList soundList = new ArrayList(); 124 | foreach(FieldInfo field in typeof(CheckersSounds).GetFields()) 125 | { 126 | if((!field.IsPublic) || (field.IsSpecialName)) 127 | continue; 128 | object[] attr = field.GetCustomAttributes(typeof(DefaultValueAttribute), true); 129 | if(attr.Length == 0) 130 | continue; 131 | soundList.Add(((DefaultValueAttribute)attr[0]).Value); 132 | } 133 | sounds = (string[])soundList.ToArray(typeof(string)); 134 | } 135 | 136 | 137 | public void Save() 138 | { 139 | Save(Path.GetDirectoryName(Application.ExecutablePath) + "\\Checkers.ini"); 140 | } 141 | public void Save(string fileName) 142 | { 143 | FileStream fs = File.OpenWrite(fileName); 144 | try 145 | { 146 | (new SoapFormatter()).Serialize(fs, this); 147 | } 148 | catch(SerializationException e) 149 | { 150 | MessageBox.Show("Could not save settings:\n" + e.Message, "Checkers", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 151 | } 152 | fs.Close(); 153 | } 154 | public static CheckersSettings Load() 155 | { 156 | return FromFile(Path.GetDirectoryName(Application.ExecutablePath) + "\\Checkers.ini"); 157 | } 158 | public static CheckersSettings FromFile(string fileName) 159 | { 160 | CheckersSettings settings = null; 161 | if(File.Exists(fileName)) 162 | { 163 | FileStream fs = File.OpenRead(fileName); 164 | try 165 | { 166 | settings = (CheckersSettings)(new SoapFormatter()).Deserialize(fs); 167 | } 168 | catch(SerializationException e) 169 | { 170 | MessageBox.Show("Could not load settings:\n" + e.Message + "\n\nUsing default settings.", "Checkers", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 171 | } 172 | fs.Close(); 173 | } 174 | if((settings != null) && ((settings.sounds == null) || (settings.sounds.Length != (new CheckersSettings()).sounds.Length))) 175 | { 176 | MessageBox.Show("Settings are corrupt.\n\nUsing default settings.", "Checkers", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 177 | settings = null; 178 | } 179 | if(settings == null) 180 | { 181 | settings = new CheckersSettings(); 182 | settings.Save(); 183 | } 184 | return settings; 185 | } 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /Checkers.Framework/Agents/MinMaxAgent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | 4 | namespace Checkers.Agents 5 | { 6 | public abstract class MinMaxBaseAgent : CheckersAgent 7 | { 8 | /* 9 | class MinMaxMove 10 | { 11 | //bool isMin; 12 | CheckersGame curGame; 13 | int depth; 14 | int alpha; 15 | int beta; 16 | } 17 | 18 | Queue minFringe = new Queue(48, 3); 19 | */ 20 | 21 | int searchDepth; 22 | bool increasingSearchDepth; 23 | 24 | public MinMaxBaseAgent(int searchDepth, bool increasingSearchDepth) 25 | { 26 | this.searchDepth = searchDepth; 27 | this.increasingSearchDepth = increasingSearchDepth; 28 | } 29 | public MinMaxBaseAgent(int searchDepth) 30 | : this(searchDepth, true) 31 | { 32 | } 33 | public MinMaxBaseAgent() 34 | : this(2) 35 | { 36 | } 37 | 38 | public int SearchDepth 39 | { 40 | get 41 | { 42 | return searchDepth; 43 | } 44 | } 45 | public bool IncreasingSearchDepth 46 | { 47 | get 48 | { 49 | return increasingSearchDepth; 50 | } 51 | } 52 | 53 | public override CheckersMove NextMove(CheckersGame game) 54 | { 55 | const int minValue = int.MaxValue; 56 | int maxValue = int.MinValue; 57 | CheckersMove bestMove = null; 58 | // Enumerate all moves 59 | foreach(CheckersMove move in game.EnumLegalMoves()) 60 | { 61 | if(!game.IsPlaying) 62 | break; 63 | CheckersGame nextGameState = game.Clone(); 64 | nextGameState.MovePiece(move.Clone(nextGameState)); 65 | int curValue = minMove(game, nextGameState, 1, maxValue, minValue); 66 | if((curValue > maxValue) || (bestMove == null)) 67 | { 68 | maxValue = curValue; 69 | bestMove = move; 70 | } 71 | OnTick(game); 72 | } 73 | return bestMove; 74 | } 75 | 76 | int maxMove(CheckersGame initGame, CheckersGame curGame, int depth, int alpha, int beta) 77 | { 78 | // Check algorithm limits..end prematurely, but with an educated approximation 79 | if(doCutOff(initGame, curGame, depth)) 80 | return doCalculateStrength(initGame, curGame); 81 | 82 | // Make move with all possibilities 83 | foreach(CheckersMove move in curGame.EnumLegalMoves()) 84 | { 85 | // Create next move 86 | CheckersGame nextGameState = move.Game.Clone(); 87 | CheckersMove nextMoveState = move.Clone(nextGameState); 88 | 89 | // Make next move and search move space 90 | if(!nextGameState.MovePiece(nextMoveState)) 91 | continue; 92 | int value = minMove(initGame, nextGameState, depth + 1, alpha, beta); 93 | 94 | if(value > alpha) 95 | { 96 | // Get new max value 97 | alpha = value; 98 | } 99 | 100 | if(alpha > beta) 101 | { 102 | // Return max value with pruning 103 | return beta; 104 | } 105 | } 106 | // Return alpha (max value) 107 | return alpha; 108 | } 109 | 110 | int minMove(CheckersGame initGame, CheckersGame curGame, int depth, int alpha, int beta) 111 | { 112 | // Check algorithm limits..end prematurely, but with an educated approximation 113 | if(doCutOff(initGame, curGame, depth)) 114 | return -doCalculateStrength(initGame, curGame); 115 | 116 | // Make move with all possibilities 117 | foreach(CheckersMove move in curGame.EnumLegalMoves()) 118 | { 119 | // Create next move 120 | CheckersGame nextGameState = move.Game.Clone(); 121 | CheckersMove nextMoveState = move.Clone(nextGameState); 122 | 123 | // Make next move and search move space 124 | if(!nextGameState.MovePiece(nextMoveState)) 125 | continue; 126 | int value = maxMove(initGame, nextGameState, depth + 1, alpha, beta); 127 | 128 | if(value < beta) 129 | { 130 | // Get new min value 131 | beta = value; 132 | } 133 | 134 | if(beta < alpha) 135 | { 136 | // Return min value with pruning 137 | return alpha; 138 | } 139 | } 140 | // Return alpha (max value) 141 | return beta; 142 | } 143 | 144 | protected virtual int doCalculateStrength(CheckersGame initGame, CheckersGame curGame) 145 | { 146 | int player = ((curGame.Turn != 1) ? (2) : (1)); 147 | int opponent = ((curGame.Turn != 1) ? (1) : (2)); 148 | 149 | // Heuristic: Check for player won state 150 | if(curGame.Winner == player) 151 | return int.MaxValue; 152 | 153 | // Heuristic: Check for player lost state 154 | if(curGame.Winner == opponent) 155 | return int.MinValue; 156 | 157 | return CalculateStrength(initGame, curGame); 158 | } 159 | 160 | bool doCutOff(CheckersGame initGame, CheckersGame curGame, int depth) 161 | { 162 | OnTick(initGame); 163 | // Test the game-oriented cut-offs 164 | if((!curGame.IsPlaying) || (!initGame.IsPlaying)) 165 | return true; 166 | // Test the depth cut-off 167 | int curSearchDepth = searchDepth; 168 | if(increasingSearchDepth) 169 | { 170 | int totalPieces = CheckersGame.PiecesPerPlayer * CheckersGame.PlayerCount; 171 | //int removed = (CheckersGame.PiecesPerPlayer*CheckersGame.PlayerCount) - curGame.GetRemainingCount(); 172 | //int factor = (int)Math.Log(removed, 3); 173 | int factor = (int)Math.Log(curGame.GetRemainingCount(), 3), mfactor = (int)Math.Log(totalPieces, 3); 174 | curSearchDepth += (mfactor - factor); 175 | } 176 | if((depth >= 0) && (depth > curSearchDepth)) 177 | return true; 178 | // Test the extended cut-off 179 | return CutOff(initGame, curGame, depth); 180 | } 181 | 182 | 183 | /// 184 | /// Calculates current player's strength at current point in game. 185 | /// This gives us a reasonable approximation of a particular player's chances of winning. 186 | /// This heuristic given is used once the min-max algorithm has reached its max search depth. 187 | /// 188 | protected abstract int CalculateStrength(CheckersGame initGame, CheckersGame curGame); 189 | 190 | /// 191 | /// Calculates the cut-off point in the game. 192 | /// 193 | protected virtual bool CutOff(CheckersGame initGame, CheckersGame curGame, int depth) 194 | { 195 | return false; 196 | } 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /Checkers/AboutDialog.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace Checkers 2 | { 3 | partial class frmAbout 4 | { 5 | /// 6 | /// Disposes of the resources (other than memory) used by the . 7 | /// 8 | /// true to release both managed and unmanaged resources; false to release only unmanaged resources. 9 | protected override void Dispose(bool disposing) 10 | { 11 | if(disposing) 12 | { 13 | if(components != null) 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() 26 | { 27 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmAbout)); 28 | this.lblVersion = new System.Windows.Forms.Label(); 29 | this.picLogo = new System.Windows.Forms.PictureBox(); 30 | this.panAbout = new System.Windows.Forms.Panel(); 31 | this.lnkWebLink = new System.Windows.Forms.LinkLabel(); 32 | this.lblWebTitle = new System.Windows.Forms.Label(); 33 | this.lblAuthor = new System.Windows.Forms.Label(); 34 | this.picDescription = new System.Windows.Forms.Panel(); 35 | this.lblDescription = new System.Windows.Forms.Label(); 36 | this.lblTitle = new System.Windows.Forms.Label(); 37 | this.btnClose = new System.Windows.Forms.Button(); 38 | this.lblRevision = new System.Windows.Forms.Label(); 39 | ((System.ComponentModel.ISupportInitialize)(this.picLogo)).BeginInit(); 40 | this.panAbout.SuspendLayout(); 41 | this.picDescription.SuspendLayout(); 42 | this.SuspendLayout(); 43 | // 44 | // lblVersion 45 | // 46 | this.lblVersion.AutoSize = true; 47 | this.lblVersion.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 48 | this.lblVersion.Location = new System.Drawing.Point(12, 220); 49 | this.lblVersion.Name = "lblVersion"; 50 | this.lblVersion.Size = new System.Drawing.Size(45, 13); 51 | this.lblVersion.TabIndex = 3; 52 | this.lblVersion.Text = "Version:"; 53 | this.lblVersion.Resize += new System.EventHandler(this.lblVersion_Resize); 54 | // 55 | // picLogo 56 | // 57 | this.picLogo.Image = ((System.Drawing.Image)(resources.GetObject("picLogo.Image"))); 58 | this.picLogo.Location = new System.Drawing.Point(12, 8); 59 | this.picLogo.Name = "picLogo"; 60 | this.picLogo.Size = new System.Drawing.Size(32, 32); 61 | this.picLogo.TabIndex = 10; 62 | this.picLogo.TabStop = false; 63 | // 64 | // panAbout 65 | // 66 | this.panAbout.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(70)))), ((int)(((byte)(89)))), ((int)(((byte)(117))))); 67 | this.panAbout.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("panAbout.BackgroundImage"))); 68 | this.panAbout.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 69 | this.panAbout.Controls.Add(this.lnkWebLink); 70 | this.panAbout.Controls.Add(this.lblWebTitle); 71 | this.panAbout.Controls.Add(this.lblAuthor); 72 | this.panAbout.Controls.Add(this.picDescription); 73 | this.panAbout.Location = new System.Drawing.Point(12, 48); 74 | this.panAbout.Name = "panAbout"; 75 | this.panAbout.Size = new System.Drawing.Size(284, 160); 76 | this.panAbout.TabIndex = 2; 77 | // 78 | // lnkWebLink 79 | // 80 | this.lnkWebLink.ActiveLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(228)))), ((int)(((byte)(164))))); 81 | this.lnkWebLink.AutoSize = true; 82 | this.lnkWebLink.BackColor = System.Drawing.Color.Transparent; 83 | this.lnkWebLink.DisabledLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(136)))), ((int)(((byte)(136))))); 84 | this.lnkWebLink.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.484F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel, ((byte)(0))); 85 | this.lnkWebLink.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(154)))), ((int)(((byte)(175)))), ((int)(((byte)(162))))); 86 | this.lnkWebLink.LinkBehavior = System.Windows.Forms.LinkBehavior.AlwaysUnderline; 87 | this.lnkWebLink.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(154)))), ((int)(((byte)(175)))), ((int)(((byte)(162))))); 88 | this.lnkWebLink.Location = new System.Drawing.Point(184, 136); 89 | this.lnkWebLink.Name = "lnkWebLink"; 90 | this.lnkWebLink.Size = new System.Drawing.Size(95, 15); 91 | this.lnkWebLink.TabIndex = 3; 92 | this.lnkWebLink.TabStop = true; 93 | this.lnkWebLink.Text = "joeyespo.com"; 94 | this.lnkWebLink.VisitedLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(154)))), ((int)(((byte)(175)))), ((int)(((byte)(162))))); 95 | this.lnkWebLink.MouseLeave += new System.EventHandler(this.lnkWebLink_MouseLeave); 96 | this.lnkWebLink.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkWebLink_LinkClicked); 97 | this.lnkWebLink.MouseEnter += new System.EventHandler(this.lnkWebLink_MouseEnter); 98 | // 99 | // lblWebTitle 100 | // 101 | this.lblWebTitle.AutoSize = true; 102 | this.lblWebTitle.BackColor = System.Drawing.Color.Transparent; 103 | this.lblWebTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.484F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel, ((byte)(0))); 104 | this.lblWebTitle.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(154)))), ((int)(((byte)(175)))), ((int)(((byte)(162))))); 105 | this.lblWebTitle.Location = new System.Drawing.Point(136, 118); 106 | this.lblWebTitle.Name = "lblWebTitle"; 107 | this.lblWebTitle.Size = new System.Drawing.Size(145, 15); 108 | this.lblWebTitle.TabIndex = 2; 109 | this.lblWebTitle.Text = "Visit my site for more:"; 110 | // 111 | // lblAuthor 112 | // 113 | this.lblAuthor.BackColor = System.Drawing.Color.Transparent; 114 | this.lblAuthor.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(154)))), ((int)(((byte)(175)))), ((int)(((byte)(162))))); 115 | this.lblAuthor.Location = new System.Drawing.Point(12, 80); 116 | this.lblAuthor.Name = "lblAuthor"; 117 | this.lblAuthor.Size = new System.Drawing.Size(264, 15); 118 | this.lblAuthor.TabIndex = 1; 119 | this.lblAuthor.Text = "Designed and Coded by Joe Esposito"; 120 | this.lblAuthor.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 121 | // 122 | // picDescription 123 | // 124 | this.picDescription.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(35)))), ((int)(((byte)(44)))), ((int)(((byte)(58))))); 125 | this.picDescription.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("picDescription.BackgroundImage"))); 126 | this.picDescription.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 127 | this.picDescription.Controls.Add(this.lblDescription); 128 | this.picDescription.Location = new System.Drawing.Point(8, 8); 129 | this.picDescription.Name = "picDescription"; 130 | this.picDescription.Size = new System.Drawing.Size(268, 64); 131 | this.picDescription.TabIndex = 0; 132 | // 133 | // lblDescription 134 | // 135 | this.lblDescription.BackColor = System.Drawing.Color.Transparent; 136 | this.lblDescription.ForeColor = System.Drawing.SystemColors.ControlLight; 137 | this.lblDescription.Location = new System.Drawing.Point(4, 8); 138 | this.lblDescription.Name = "lblDescription"; 139 | this.lblDescription.Size = new System.Drawing.Size(256, 48); 140 | this.lblDescription.TabIndex = 0; 141 | this.lblDescription.Text = "[ Description ]"; 142 | this.lblDescription.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 143 | // 144 | // lblTitle 145 | // 146 | this.lblTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 147 | this.lblTitle.Location = new System.Drawing.Point(48, 20); 148 | this.lblTitle.Name = "lblTitle"; 149 | this.lblTitle.Size = new System.Drawing.Size(248, 16); 150 | this.lblTitle.TabIndex = 0; 151 | this.lblTitle.Text = "[ Title ]"; 152 | this.lblTitle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 153 | // 154 | // btnClose 155 | // 156 | this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; 157 | this.btnClose.Location = new System.Drawing.Point(208, 220); 158 | this.btnClose.Name = "btnClose"; 159 | this.btnClose.Size = new System.Drawing.Size(84, 32); 160 | this.btnClose.TabIndex = 1; 161 | this.btnClose.Text = "&Close"; 162 | // 163 | // lblRevision 164 | // 165 | this.lblRevision.AutoSize = true; 166 | this.lblRevision.ForeColor = System.Drawing.SystemColors.GrayText; 167 | this.lblRevision.Location = new System.Drawing.Point(68, 220); 168 | this.lblRevision.Name = "lblRevision"; 169 | this.lblRevision.Size = new System.Drawing.Size(51, 13); 170 | this.lblRevision.TabIndex = 4; 171 | this.lblRevision.Text = "Revision:"; 172 | // 173 | // frmAbout 174 | // 175 | this.AcceptButton = this.btnClose; 176 | this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); 177 | this.CancelButton = this.btnClose; 178 | this.ClientSize = new System.Drawing.Size(306, 264); 179 | this.Controls.Add(this.lblVersion); 180 | this.Controls.Add(this.lblRevision); 181 | this.Controls.Add(this.picLogo); 182 | this.Controls.Add(this.panAbout); 183 | this.Controls.Add(this.lblTitle); 184 | this.Controls.Add(this.btnClose); 185 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 186 | this.MaximizeBox = false; 187 | this.MinimizeBox = false; 188 | this.Name = "frmAbout"; 189 | this.ShowInTaskbar = false; 190 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 191 | this.Text = "About"; 192 | this.Load += new System.EventHandler(this.frmAbout_Load); 193 | ((System.ComponentModel.ISupportInitialize)(this.picLogo)).EndInit(); 194 | this.panAbout.ResumeLayout(false); 195 | this.panAbout.PerformLayout(); 196 | this.picDescription.ResumeLayout(false); 197 | this.ResumeLayout(false); 198 | this.PerformLayout(); 199 | 200 | } 201 | 202 | #endregion 203 | 204 | /// 205 | /// Required designer variable. 206 | /// 207 | private System.ComponentModel.Container components = null; 208 | 209 | private System.Windows.Forms.Label lblVersion; 210 | private System.Windows.Forms.PictureBox picLogo; 211 | private System.Windows.Forms.Panel panAbout; 212 | private System.Windows.Forms.LinkLabel lnkWebLink; 213 | private System.Windows.Forms.Label lblWebTitle; 214 | private System.Windows.Forms.Label lblAuthor; 215 | private System.Windows.Forms.Panel picDescription; 216 | private System.Windows.Forms.Label lblDescription; 217 | private System.Windows.Forms.Label lblTitle; 218 | private System.Windows.Forms.Button btnClose; 219 | private System.Windows.Forms.Label lblRevision; 220 | } 221 | } 222 | -------------------------------------------------------------------------------- /Checkers/PreferencesDialog.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Drawing; 4 | using System.Collections; 5 | using System.Reflection; 6 | using System.ComponentModel; 7 | using System.Runtime.InteropServices; 8 | using System.Windows.Forms; 9 | 10 | namespace Checkers 11 | { 12 | /// 13 | /// Represents the "Preferences" dialog. 14 | /// 15 | public sealed partial class PreferencesDialog : Form 16 | { 17 | /// 18 | /// Initializes a new instance of the class. 19 | /// 20 | public PreferencesDialog() 21 | { 22 | // 23 | // Required for Windows Form Designer support 24 | // 25 | InitializeComponent(); 26 | } 27 | 28 | #region Public Properties 29 | 30 | /// 31 | /// Gets or sets the settings to show and modify. 32 | /// 33 | public CheckersSettings Settings 34 | { 35 | get 36 | { 37 | return settings; 38 | } 39 | set 40 | { 41 | settings = value; 42 | } 43 | } 44 | 45 | #endregion 46 | 47 | #region Event Handler Methods 48 | 49 | /// 50 | /// Handles the SelectedIndexChanged event of the tabPreferences control. 51 | /// 52 | /// The source of the event. 53 | /// The instance containing the event data. 54 | private void tabPreferences_SelectedIndexChanged(object sender, System.EventArgs e) 55 | { 56 | if(tabPreferences.SelectedIndex == -1) 57 | return; 58 | lblTitle.Text = tabPreferences.SelectedTab.Text; 59 | } 60 | 61 | /// 62 | /// Handles the Click event of the btnDefault control. 63 | /// 64 | /// The source of the event. 65 | /// The instance containing the event data. 66 | private void btnDefault_Click(object sender, System.EventArgs e) 67 | { 68 | if(MessageBox.Show(this, "All settings will be lost. Reset to default settings?", "Checkers", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) 69 | return; 70 | settings = new CheckersSettings(); 71 | ShowSettings(); 72 | } 73 | 74 | /// 75 | /// Handles the MouseDown event of the picColor control. 76 | /// 77 | /// The source of the event. 78 | /// The instance containing the event data. 79 | private void picColor_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 80 | { 81 | if(e.Button != MouseButtons.Left) 82 | return; 83 | dlgColorDialog.Color = ((PictureBox)sender).BackColor; 84 | if(dlgColorDialog.ShowDialog(this) == DialogResult.Cancel) 85 | return; 86 | ((PictureBox)sender).BackColor = dlgColorDialog.Color; 87 | } 88 | 89 | /// 90 | /// Handles the Click event of the menuChangeColor control. 91 | /// 92 | /// The source of the event. 93 | /// The instance containing the event data. 94 | private void menuChangeColor_Click(object sender, System.EventArgs e) 95 | { 96 | PictureBox pic = (PictureBox)((MenuItem)sender).GetContextMenu().SourceControl; 97 | dlgColorDialog.Color = pic.BackColor; 98 | if(dlgColorDialog.ShowDialog(this) == DialogResult.Cancel) 99 | return; 100 | pic.BackColor = dlgColorDialog.Color; 101 | } 102 | 103 | /// 104 | /// Handles the Click event of the menuSetDefault control. 105 | /// 106 | /// The source of the event. 107 | /// The instance containing the event data. 108 | private void menuSetDefault_Click(object sender, System.EventArgs e) 109 | { 110 | PictureBox pic = (PictureBox)((MenuItem)sender).GetContextMenu().SourceControl; 111 | if(pic == picBackColor) 112 | pic.BackColor = (new CheckersSettings().BackColor); 113 | else if(pic == picBoardBackColor) 114 | pic.BackColor = (new CheckersSettings().BoardBackColor); 115 | else if(pic == picBoardForeColor) 116 | pic.BackColor = (new CheckersSettings().BoardForeColor); 117 | else if(pic == picBoardGridColor) 118 | pic.BackColor = (new CheckersSettings().BoardGridColor); 119 | } 120 | 121 | /// 122 | /// Handles the SelectedIndexChanged event of the lstSounds control. 123 | /// 124 | /// The source of the event. 125 | /// The instance containing the event data. 126 | private void lstSounds_SelectedIndexChanged(object sender, System.EventArgs e) 127 | { 128 | if(lstSounds.SelectedItem == null) 129 | return; 130 | txtSoundFile.Text = sounds[(int)typeof(CheckersSounds).GetField((string)lstSounds.SelectedItem).GetValue(null)]; 131 | //txtSoundFile.Text = (string)sounds.GetType().GetField((string)lstSounds.SelectedItem).GetValue(sounds); 132 | } 133 | 134 | /// 135 | /// Handles the TextChanged event of the txtSoundFile control. 136 | /// 137 | /// The source of the event. 138 | /// The instance containing the event data. 139 | private void txtSoundFile_TextChanged(object sender, System.EventArgs e) 140 | { 141 | if(lstSounds.SelectedIndex == -1) 142 | return; 143 | sounds[(int)typeof(CheckersSounds).GetField((string)lstSounds.SelectedItem).GetValue(null)] = txtSoundFile.Text; 144 | //sounds.GetType().GetField((string)lstSounds.SelectedItem).SetValue(sounds, txtSoundFile.Text); 145 | } 146 | 147 | /// 148 | /// Handles the Click event of the btnSoundPreview control. 149 | /// 150 | /// The source of the event. 151 | /// The instance containing the event data. 152 | private void btnSoundPreview_Click(object sender, System.EventArgs e) 153 | { 154 | if(lstSounds.SelectedIndex == -1) 155 | return; 156 | PlaySound(txtSoundFile.Text); 157 | } 158 | 159 | /// 160 | /// Handles the Click event of the btnSoundFile control. 161 | /// 162 | /// The source of the event. 163 | /// The instance containing the event data. 164 | private void btnSoundFile_Click(object sender, System.EventArgs e) 165 | { 166 | if(lstSounds.SelectedIndex == -1) 167 | return; 168 | string soundsPath = Path.GetDirectoryName(Application.ExecutablePath) + "\\Sounds"; 169 | string fileName = ((Path.IsPathRooted(txtSoundFile.Text)) ? (txtSoundFile.Text) : (soundsPath + "\\" + txtSoundFile.Text)); 170 | 171 | if(File.Exists(fileName)) 172 | dlgOpenSound.FileName = fileName; 173 | else 174 | dlgOpenSound.InitialDirectory = Path.GetDirectoryName(fileName); 175 | // Show the dialog 176 | if(dlgOpenSound.ShowDialog(this) == DialogResult.Cancel) 177 | return; 178 | // Get the sound file 179 | string newFileName = dlgOpenSound.FileName; 180 | string common = Path.GetDirectoryName(newFileName); 181 | if(common.ToLower() == soundsPath.ToLower()) 182 | newFileName = newFileName.Substring(common.Length + 1); 183 | txtSoundFile.Text = newFileName; 184 | } 185 | 186 | #endregion 187 | 188 | /// 189 | /// Shows the form as a modal dialog box with the specified owner. 190 | /// 191 | /// Any object that implements that represents the top-level window that will own the modal dialog box. 192 | /// One of the values. 193 | /// The form specified in the parameter is the same as the form being shown. 194 | /// The form being shown is already visible.-or-The form being shown is disabled.-or-The form being shown is not a top-level window.-or-The form being shown as a dialog box is already a modal form.-or-The current process is not running in user interactive mode (for more information, see ). 195 | public new DialogResult ShowDialog(IWin32Window owner) 196 | { 197 | return OnShowDialog(owner); 198 | } 199 | 200 | #region Helper Methods 201 | 202 | /// 203 | /// Called when the dialog is shown. 204 | /// 205 | public new DialogResult OnShowDialog(IWin32Window owner) 206 | { 207 | if(settings == null) 208 | settings = new CheckersSettings(); 209 | 210 | // Show settings 211 | ShowSettings(); 212 | 213 | // Show dialog 214 | DialogResult result = base.ShowDialog(owner); 215 | 216 | // Set properties 217 | if(result != DialogResult.Cancel) 218 | { 219 | settings = new CheckersSettings(); 220 | // General settings 221 | settings.HighlightSelection = chkHighlightSelection.Checked; 222 | settings.HighlightPossibleMoves = chkHighlightPossibleMoves.Checked; 223 | settings.ShowJumpMessage = chkShowJumpMessage.Checked; 224 | settings.ShowTextFeedback = chkShowTextFeedback.Checked; 225 | // Net settings 226 | settings.FlashWindowOnGameEvents = chkFlashWindowOnGameEvents.Checked; 227 | settings.FlashWindowOnTurn = chkFlashWindowOnTurn.Checked; 228 | settings.FlashWindowOnMessage = chkFlashWindowOnMessage.Checked; 229 | settings.ShowNetPanelOnMessage = chkShowNetPanelOnMessage.Checked; 230 | // Board appearance 231 | settings.BackColor = picBackColor.BackColor; 232 | settings.BoardBackColor = picBoardBackColor.BackColor; 233 | settings.BoardForeColor = picBoardForeColor.BackColor; 234 | settings.BoardGridColor = picBoardGridColor.BackColor; 235 | // Sounds 236 | settings.sounds = sounds; 237 | settings.MuteSounds = chkMuteSounds.Checked; 238 | // Save the settings 239 | settings.Save(); 240 | } 241 | return result; 242 | } 243 | 244 | /// 245 | /// Shows the settings. 246 | /// 247 | private void ShowSettings() 248 | { 249 | // General settings 250 | chkHighlightSelection.Checked = settings.HighlightSelection; 251 | chkHighlightPossibleMoves.Checked = settings.HighlightPossibleMoves; 252 | chkShowJumpMessage.Checked = settings.ShowJumpMessage; 253 | chkShowTextFeedback.Checked = settings.ShowTextFeedback; 254 | // Net settings 255 | chkFlashWindowOnGameEvents.Checked = settings.FlashWindowOnGameEvents; 256 | chkFlashWindowOnTurn.Checked = settings.FlashWindowOnTurn; 257 | chkFlashWindowOnMessage.Checked = settings.FlashWindowOnMessage; 258 | chkShowNetPanelOnMessage.Checked = settings.ShowNetPanelOnMessage; 259 | // Board appearance 260 | picBackColor.BackColor = settings.BackColor; 261 | picBoardBackColor.BackColor = settings.BoardBackColor; 262 | picBoardForeColor.BackColor = settings.BoardForeColor; 263 | picBoardGridColor.BackColor = settings.BoardGridColor; 264 | // Sounds 265 | sounds = (string[])settings.sounds.Clone(); 266 | lstSounds.Items.Clear(); 267 | foreach(FieldInfo field in typeof(CheckersSounds).GetFields()) 268 | { 269 | if((!field.IsPublic) || (field.IsSpecialName)) 270 | continue; 271 | lstSounds.Items.Add(field.Name); 272 | } 273 | chkMuteSounds.Checked = settings.MuteSounds; 274 | if(lstSounds.Items.Count > 0) 275 | lstSounds.SelectedIndex = 0; 276 | } 277 | 278 | /// 279 | /// Plays a sound from the specified file. 280 | /// 281 | private void PlaySound(string soundFileName) 282 | { 283 | string fileName = ((Path.IsPathRooted(soundFileName)) ? (soundFileName) : (Path.GetDirectoryName(Application.ExecutablePath) + "\\Sounds\\" + soundFileName)); 284 | // Play sound 285 | sndPlaySound(fileName, IntPtr.Zero, (SoundFlags.SND_FileName | SoundFlags.SND_ASYNC | SoundFlags.SND_NOWAIT)); 286 | } 287 | 288 | #endregion 289 | 290 | #region Win32 Members 291 | 292 | [DllImport("winmm.dll", EntryPoint = "PlaySound", SetLastError = true, CallingConvention = CallingConvention.Winapi)] 293 | static extern bool sndPlaySound(string pszSound, IntPtr hMod, SoundFlags sf); 294 | 295 | [Flags] 296 | public enum SoundFlags : int 297 | { 298 | SND_SYNC = 0x0000, /* play synchronously (default) */ 299 | SND_ASYNC = 0x0001, /* play asynchronously */ 300 | SND_NODEFAULT = 0x0002, /* silence (!default) if sound not found */ 301 | SND_MEMORY = 0x0004, /* pszSound points to a memory file */ 302 | SND_LOOP = 0x0008, /* loop the sound until next sndPlaySound */ 303 | SND_NOSTOP = 0x0010, /* don't stop any currently playing sound */ 304 | SND_NOWAIT = 0x00002000, /* don't wait if the driver is busy */ 305 | SND_ALIAS = 0x00010000, /* name is a registry alias */ 306 | SND_ALIAS_ID = 0x00110000, /* alias is a predefined ID */ 307 | SND_FileName = 0x00020000, /* name is file name */ 308 | SND_RESOURCE = 0x00040004 /* name is resource name or atom */ 309 | } 310 | 311 | #endregion 312 | 313 | private CheckersSettings settings; 314 | private string[] sounds; 315 | } 316 | } 317 | -------------------------------------------------------------------------------- /Checkers/Checkers.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Local 4 | 9.0.21022 5 | 2.0 6 | {B7585220-DD42-48B2-B68E-DBB2AC645642} 7 | Debug 8 | AnyCPU 9 | App.ico 10 | 11 | 12 | Checkers 13 | 14 | 15 | JScript 16 | Grid 17 | IE50 18 | false 19 | WinExe 20 | Checkers 21 | 22 | 23 | 24 | 25 | 26 | 27 | 0.0 28 | 29 | 30 | ..\Bin\ 31 | false 32 | 285212672 33 | false 34 | 35 | 36 | DEBUG;TRACE 37 | 38 | 39 | true 40 | 4096 41 | false 42 | false 43 | false 44 | false 45 | 4 46 | full 47 | prompt 48 | 49 | 50 | ..\Bin\ 51 | false 52 | 285212672 53 | false 54 | 55 | 56 | TRACE 57 | 58 | 59 | false 60 | 4096 61 | true 62 | false 63 | false 64 | false 65 | 4 66 | none 67 | prompt 68 | 69 | 70 | 71 | System 72 | 73 | 74 | System.Data 75 | 76 | 77 | System.Design 78 | 79 | 80 | System.Drawing 81 | 82 | 83 | System.Runtime.Serialization.Formatters.Soap 84 | 85 | 86 | System.Windows.Forms 87 | 88 | 89 | System.XML 90 | 91 | 92 | CheckersLib 93 | {EF66778A-5067-49AA-91AC-70D048F482F8} 94 | {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 95 | 96 | 97 | CheckersUI 98 | {66C6B81B-5C99-4A60-8F4A-A3E46FFB97D4} 99 | {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 100 | 101 | 102 | 103 | 104 | 105 | PreserveNewest 106 | 107 | 108 | PreserveNewest 109 | 110 | 111 | PreserveNewest 112 | 113 | 114 | PreserveNewest 115 | 116 | 117 | PreserveNewest 118 | 119 | 120 | PreserveNewest 121 | 122 | 123 | PreserveNewest 124 | 125 | 126 | PreserveNewest 127 | 128 | 129 | PreserveNewest 130 | 131 | 132 | PreserveNewest 133 | 134 | 135 | PreserveNewest 136 | 137 | 138 | PreserveNewest 139 | 140 | 141 | PreserveNewest 142 | 143 | 144 | PreserveNewest 145 | 146 | 147 | PreserveNewest 148 | 149 | 150 | PreserveNewest 151 | 152 | 153 | PreserveNewest 154 | 155 | 156 | PreserveNewest 157 | 158 | 159 | PreserveNewest 160 | 161 | 162 | PreserveNewest 163 | 164 | 165 | PreserveNewest 166 | 167 | 168 | PreserveNewest 169 | 170 | 171 | PreserveNewest 172 | 173 | 174 | PreserveNewest 175 | 176 | 177 | PreserveNewest 178 | 179 | 180 | PreserveNewest 181 | 182 | 183 | PreserveNewest 184 | 185 | 186 | PreserveNewest 187 | 188 | 189 | PreserveNewest 190 | 191 | 192 | PreserveNewest 193 | 194 | 195 | PreserveNewest 196 | 197 | 198 | PreserveNewest 199 | 200 | 201 | PreserveNewest 202 | 203 | 204 | PreserveNewest 205 | 206 | 207 | PreserveNewest 208 | 209 | 210 | PreserveNewest 211 | 212 | 213 | PreserveNewest 214 | 215 | 216 | PreserveNewest 217 | 218 | 219 | PreserveNewest 220 | 221 | 222 | PreserveNewest 223 | 224 | 225 | PreserveNewest 226 | 227 | 228 | PreserveNewest 229 | 230 | 231 | PreserveNewest 232 | 233 | 234 | PreserveNewest 235 | 236 | 237 | PreserveNewest 238 | 239 | 240 | PreserveNewest 241 | 242 | 243 | PreserveNewest 244 | 245 | 246 | PreserveNewest 247 | 248 | 249 | PreserveNewest 250 | 251 | 252 | PreserveNewest 253 | 254 | 255 | PreserveNewest 256 | 257 | 258 | PreserveNewest 259 | 260 | 261 | PreserveNewest 262 | 263 | 264 | PreserveNewest 265 | 266 | 267 | PreserveNewest 268 | 269 | 270 | PreserveNewest 271 | 272 | 273 | PreserveNewest 274 | 275 | 276 | PreserveNewest 277 | 278 | 279 | AboutDialog.cs 280 | 281 | 282 | MainForm.cs 283 | 284 | 285 | NewGameDialog.cs 286 | 287 | 288 | PreferencesDialog.cs 289 | 290 | 291 | 292 | Code 293 | 294 | 295 | Form 296 | 297 | 298 | Form 299 | 300 | 301 | Form 302 | 303 | 304 | Form 305 | 306 | 307 | Code 308 | 309 | 310 | Code 311 | 312 | 313 | Code 314 | 315 | 316 | AboutDialog.cs 317 | 318 | 319 | MainForm.cs 320 | 321 | 322 | NewGameDialog.cs 323 | 324 | 325 | PreferencesDialog.cs 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | -------------------------------------------------------------------------------- /Checkers.Framework/CheckersMove.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Collections; 4 | 5 | namespace Checkers 6 | { 7 | public class CheckersMove 8 | { 9 | private CheckersGame game; 10 | private CheckersGame initialGame; 11 | private CheckersPiece piece; 12 | private CheckersPiece initialPiece; 13 | private CheckersPiece[,] board; 14 | private Point currentLocation; 15 | private ArrayList jumped; 16 | private ArrayList path; 17 | private bool kinged; 18 | private bool cannotMove; 19 | 20 | // Will be create indirectly from a CheckersGame object via BeginMove 21 | internal CheckersMove(CheckersGame game, CheckersPiece piece, bool makeReadOnlyCopy) 22 | { 23 | this.game = game; 24 | this.piece = piece; 25 | initialGame = (((makeReadOnlyCopy) && (!game.IsReadOnly)) ? (CheckersGame.MakeReadOnly(game)) : (game)); 26 | initialPiece = initialGame.Pieces[Array.IndexOf(game.Pieces, piece)]; 27 | board = (CheckersPiece[,])game.Board.Clone(); 28 | currentLocation = piece.Location; 29 | jumped = new ArrayList(); 30 | path = new ArrayList(); 31 | cannotMove = false; 32 | kinged = false; 33 | } 34 | 35 | /// Creates a Checkers move object from a given path. 36 | /// The Checkers game to create the movement to. 37 | /// The Checkers piece which will be moving. 38 | /// The path to move along. 39 | /// The new Checkers move object. 40 | internal static CheckersMove FromPath(CheckersGame game, CheckersPiece piece, Point[] path) 41 | { 42 | CheckersMove move = new CheckersMove(game, piece, true); 43 | foreach(Point p in path) 44 | if(move.Move(p) == false) 45 | return null; 46 | return move; 47 | } 48 | 49 | #region Public Properties 50 | 51 | /// Gets the Checkers game to which the movement is taking place. 52 | public CheckersGame Game 53 | { 54 | get 55 | { 56 | return game; 57 | } 58 | } 59 | 60 | /// Gets the initial Checkers game to which the movement began. 61 | public CheckersGame InitialGame 62 | { 63 | get 64 | { 65 | return initialGame; 66 | } 67 | } 68 | 69 | /// Gets the Checkers piece to which is being moved. 70 | public CheckersPiece Piece 71 | { 72 | get 73 | { 74 | return piece; 75 | } 76 | } 77 | 78 | /// Gets the initial Checkers piece to which was moved. 79 | public CheckersPiece InitialPiece 80 | { 81 | get 82 | { 83 | return initialPiece; 84 | } 85 | } 86 | 87 | /// Gets the list of Checkers pieces that will be jumped if this path is taken. 88 | public CheckersPiece[] Jumped 89 | { 90 | get 91 | { 92 | return (CheckersPiece[])jumped.ToArray(typeof(CheckersPiece)); 93 | } 94 | } 95 | 96 | /// Gets whether or not the piece has been kinged as a result of the movement taken place. 97 | public bool Kinged 98 | { 99 | get 100 | { 101 | return kinged; 102 | } 103 | } 104 | 105 | /// Gets the current location of the movement. 106 | public Point CurrentLocation 107 | { 108 | get 109 | { 110 | return currentLocation; 111 | } 112 | } 113 | 114 | /// Gets the path of movement. 115 | public Point[] Path 116 | { 117 | get 118 | { 119 | return (Point[])path.ToArray(typeof(Point)); 120 | } 121 | } 122 | 123 | /// Gets whether or not a movement has taken place. 124 | public bool Moved 125 | { 126 | get 127 | { 128 | return (path.Count != 0); 129 | } 130 | } 131 | 132 | /// Gets whether or not a move is possible from this point. 133 | public bool CanMove 134 | { 135 | get 136 | { 137 | return (!cannotMove) && (EnumMoves().Length != 0); 138 | } 139 | } 140 | 141 | /// Gets whether or not a move is required from this point. 142 | public bool MustMove 143 | { 144 | get 145 | { 146 | return ((!Moved) || ((CanMove) && (!game.OptionalJumping))); 147 | } 148 | } 149 | 150 | #endregion 151 | 152 | #region Enumerations 153 | 154 | /// Enumerates all possible moves from this point. 155 | /// An array of points which represent valid moves. 156 | public Point[] EnumMoves() 157 | { 158 | if(cannotMove) 159 | return new Point[0]; 160 | CheckersPiece[] jumpArray; 161 | return EnumMovesCore(currentLocation, out jumpArray); 162 | } 163 | /// Enumerates all possible moves from this point. 164 | /// Overrides the game's OptionalJumping parameter for the enumeration. 165 | /// An array of points which represent valid moves. 166 | public Point[] EnumMoves(bool optionalJumping) 167 | { 168 | if(cannotMove) 169 | { 170 | return new Point[0]; 171 | } 172 | CheckersPiece[] jumpArray; 173 | return EnumMovesCore(currentLocation, out jumpArray, optionalJumping); 174 | } 175 | /// Enumerates all possible moves from this point. 176 | /// Returns the array of Checkers piecse that are jumped, with respect to the moves. 177 | /// An array of points which represent valid moves. 178 | public Point[] EnumMoves(out CheckersPiece[] jumped) 179 | { 180 | if(cannotMove) 181 | { 182 | jumped = new CheckersPiece[0]; 183 | return new Point[0]; 184 | } 185 | return EnumMovesCore(currentLocation, out jumped); 186 | } 187 | /// Enumerates all possible moves from this point. 188 | /// Overrides the game's OptionalJumping parameter for the enumeration. 189 | /// Returns the array of Checkers piecse that are jumped, with respect to the moves. 190 | /// An array of points which represent valid moves. 191 | public Point[] EnumMoves(bool optionalJumping, out CheckersPiece[] jumped) 192 | { 193 | if(cannotMove) 194 | { 195 | jumped = new CheckersPiece[0]; 196 | return new Point[0]; 197 | } 198 | return EnumMovesCore(currentLocation, out jumped, optionalJumping); 199 | } 200 | /// Enumerates all possible single moves from this point. 201 | /// An array of points which represent valid moves. 202 | public Point[] EnumSingleMoves() 203 | { 204 | if(cannotMove) 205 | return new Point[0]; 206 | return (Point[])EnumSingleMovesCore(currentLocation, game.OptionalJumping).ToArray(typeof(Point)); 207 | } 208 | /// Enumerates all possible single moves from this point. 209 | /// Overrides the game's OptionalJumping parameter for the enumeration. 210 | /// An array of points which represent valid moves. 211 | public Point[] EnumSingleMoves(bool optionalJumping) 212 | { 213 | if(cannotMove) 214 | return new Point[0]; 215 | return (Point[])EnumSingleMovesCore(currentLocation, optionalJumping).ToArray(typeof(Point)); 216 | } 217 | /// Enumerates all possible jump moves from this point. 218 | /// An array of points which represent valid moves. 219 | public Point[] EnumJumpMoves() 220 | { 221 | if(cannotMove) 222 | return new Point[0]; 223 | ArrayList jumpArray; 224 | return (Point[])EnumJumpMovesCore(currentLocation, out jumpArray).ToArray(typeof(Point)); 225 | } 226 | /// Enumerates all possible jump moves from this point. 227 | /// Returns the array of Checkers piecse that are jumped, with respect to the moves. 228 | /// An array of points which represent valid moves. 229 | public Point[] EnumJumpMoves(out CheckersPiece[] jumped) 230 | { 231 | if(cannotMove) 232 | { 233 | jumped = new CheckersPiece[0]; 234 | return new Point[0]; 235 | } 236 | ArrayList jumpedList; 237 | ArrayList moves = EnumJumpMovesCore(currentLocation, out jumpedList); 238 | jumped = (CheckersPiece[])jumpedList.ToArray(typeof(CheckersPiece)); 239 | return (Point[])moves.ToArray(typeof(Point)); 240 | } 241 | 242 | #endregion 243 | 244 | 245 | /// Creates a duplicate Checkers move object, so different paths may be tested from a particular point. 246 | /// The new Checkers move object. 247 | public CheckersMove Clone() 248 | { 249 | CheckersMove move = new CheckersMove(game, piece, false); 250 | move.initialGame = initialGame; 251 | move.initialPiece = initialPiece; 252 | move.board = (CheckersPiece[,])board.Clone(); 253 | move.currentLocation = currentLocation; 254 | move.jumped = (ArrayList)jumped.Clone(); 255 | move.kinged = kinged; 256 | move.path = (ArrayList)path.Clone(); 257 | move.cannotMove = cannotMove; 258 | return move; 259 | } 260 | 261 | /// Creates a duplicate Checkers move object from an identical (possibly cloned) game. 262 | /// The new Checkers move object. 263 | public CheckersMove Clone(CheckersGame game) 264 | { 265 | return FromPath(game, piece.Clone(game), Path); 266 | } 267 | 268 | /// Returns whether or not the move is valid. 269 | /// The location of the next move to take place. 270 | /// True if the specidied location is a valid move. 271 | public bool IsValidMove(Point location) 272 | { 273 | foreach(Point p in EnumMoves()) 274 | { 275 | if(p == location) 276 | return true; 277 | } 278 | return false; 279 | } 280 | /// Returns whether or not the move is valid. 281 | /// The location of the next move to take place. 282 | /// Overrides the game's OptionalJumping parameter for the enumeration. 283 | /// True if the specidied location is a valid move. 284 | public bool IsValidMove(Point location, bool optionalJumping) 285 | { 286 | foreach(Point p in EnumMoves(optionalJumping)) 287 | { 288 | if(p == location) 289 | return true; 290 | } 291 | return false; 292 | } 293 | 294 | /// Moves the piece to a new location. 295 | /// The new location to be moved to. 296 | /// True if the move was valid. 297 | public bool Move(Point location) 298 | { 299 | if(cannotMove) 300 | return false; 301 | CheckersPiece[] jumpedArray; 302 | Point[] points = EnumMovesCore(currentLocation, out jumpedArray); 303 | for(int i = 0; i < points.Length; i++) 304 | { 305 | if(points[i] == location) 306 | { 307 | // Move piece 308 | if(jumpedArray[i] != null) 309 | { 310 | jumped.Add(jumpedArray[i]); 311 | board[jumpedArray[i].Location.X, jumpedArray[i].Location.Y] = null; 312 | } 313 | if((Math.Abs(currentLocation.X - location.X) == 1) && (Math.Abs(currentLocation.Y - location.Y) == 1)) 314 | cannotMove = true; 315 | board[currentLocation.X, currentLocation.Y] = null; 316 | board[location.X, location.Y] = piece; 317 | currentLocation = location; 318 | path.Add(location); 319 | // King a pawn if reached other end of board 320 | if((!MustMove) && (piece.Rank == CheckersRank.Pawn)) 321 | kinged = (((piece.Direction == CheckersDirection.Up) && (currentLocation.Y == 0)) || ((piece.Direction == CheckersDirection.Down) && (currentLocation.Y == CheckersGame.BoardSize.Height - 1))); 322 | return true; 323 | } 324 | } 325 | return false; 326 | } 327 | 328 | /// Returns whether or not piece is in board bounds. 329 | /// The location to test. 330 | /// True if specified location is in bounds. 331 | public bool InBounds(Point location) 332 | { 333 | return game.InBounds(location); 334 | } 335 | /// Returns whether or not piece is in board bounds. 336 | /// The x location to test. 337 | /// The y location to test. 338 | /// True if specified location is in bounds. 339 | public bool InBounds(int x, int y) 340 | { 341 | return game.InBounds(x, y); 342 | } 343 | 344 | private Point[] EnumMovesCore(Point fromLocation, out CheckersPiece[] jumped) 345 | { 346 | return EnumMovesCore(fromLocation, out jumped, game.OptionalJumping); 347 | } 348 | // Returns a list of moves and their respective jumps 349 | private Point[] EnumMovesCore(Point fromLocation, out CheckersPiece[] jumped, bool optionalJumping) 350 | { 351 | ArrayList jumpedList; 352 | ArrayList jumpMoves = EnumJumpMovesCore(fromLocation, out jumpedList); 353 | ArrayList singleMoves = EnumSingleMovesCore(fromLocation, optionalJumping, jumpMoves); 354 | // Append 'nulls' to single jumps 355 | for(int i = 0; i < singleMoves.Count; i++) 356 | jumpedList.Add(null); 357 | // Return results 358 | jumped = (CheckersPiece[])jumpedList.ToArray(typeof(CheckersPiece)); 359 | singleMoves.AddRange(jumpMoves); 360 | return (Point[])singleMoves.ToArray(typeof(Point)); 361 | } 362 | 363 | private ArrayList EnumSingleMovesCore(Point fromLocation, bool optionalJumping) 364 | { 365 | if(optionalJumping) 366 | { 367 | ArrayList jumpedList; 368 | ArrayList jumpMoves = EnumJumpMovesCore(fromLocation, out jumpedList); 369 | return EnumSingleMovesCore(fromLocation, optionalJumping, jumpMoves); 370 | } 371 | return EnumSingleMovesCore(fromLocation, optionalJumping, null); 372 | } 373 | private ArrayList EnumSingleMovesCore(Point fromLocation, bool optionalJumping, ArrayList jumpMoves) 374 | { 375 | // Create resizable list of jumpable moves and their respective jumps 376 | ArrayList moves = new ArrayList(); 377 | // Check for single moves, if not jumping already took place 378 | if(path.Count > 0) 379 | return moves; 380 | 381 | bool canSingleMove = true; 382 | if(!optionalJumping) 383 | { 384 | // Determine whether or not a single jump can take place 385 | canSingleMove = (jumpMoves.Count == 0) || (game.OptionalJumping); 386 | if(canSingleMove) 387 | { 388 | // Further testing for single moves; test all other pieces on the board 389 | foreach(CheckersPiece testPiece in game.EnumPlayerPieces(game.Turn)) 390 | { 391 | ArrayList dummy; 392 | if(EnumJumpMovesCore(testPiece, testPiece.Location, out dummy).Count == 0) 393 | continue; 394 | canSingleMove = false; 395 | break; 396 | } 397 | } 398 | } 399 | 400 | // Check whether or not a single move can take place 401 | if(!canSingleMove) 402 | return moves; 403 | 404 | // Append single-move moves in the enumeration (if able to) 405 | if(piece.Location == fromLocation) 406 | { 407 | if((piece.Direction == CheckersDirection.Up) || (piece.Rank == CheckersRank.King)) 408 | { 409 | if(InBounds(fromLocation.X - 1, fromLocation.Y - 1) && (board[fromLocation.X - 1, fromLocation.Y - 1] == null)) 410 | { 411 | moves.Add(new Point(fromLocation.X - 1, fromLocation.Y - 1)); 412 | } 413 | if(InBounds(fromLocation.X + 1, fromLocation.Y - 1) && (board[fromLocation.X + 1, fromLocation.Y - 1] == null)) 414 | { 415 | moves.Add(new Point(fromLocation.X + 1, fromLocation.Y - 1)); 416 | } 417 | } 418 | if((piece.Direction == CheckersDirection.Down) || (piece.Rank == CheckersRank.King)) 419 | { 420 | if(InBounds(fromLocation.X - 1, fromLocation.Y + 1) && (board[fromLocation.X - 1, fromLocation.Y + 1] == null)) 421 | { 422 | moves.Add(new Point(fromLocation.X - 1, fromLocation.Y + 1)); 423 | } 424 | if(InBounds(fromLocation.X + 1, fromLocation.Y + 1) && (board[fromLocation.X + 1, fromLocation.Y + 1] == null)) 425 | { 426 | moves.Add(new Point(fromLocation.X + 1, fromLocation.Y + 1)); 427 | } 428 | } 429 | } 430 | return moves; 431 | } 432 | 433 | private ArrayList EnumJumpMovesCore(Point fromLocation, out ArrayList jumped) 434 | { 435 | return EnumJumpMovesCore(piece, fromLocation, out jumped); 436 | } 437 | private ArrayList EnumJumpMovesCore(CheckersPiece piece, Point fromLocation, out ArrayList jumped) 438 | { 439 | ArrayList moves = new ArrayList(); 440 | jumped = new ArrayList(); 441 | // Append jumps (not of same team) 442 | if((piece.Direction == CheckersDirection.Up) || (piece.Rank == CheckersRank.King)) 443 | { 444 | if(game.InBounds(fromLocation.X - 1, fromLocation.Y - 1) && (board[fromLocation.X - 1, fromLocation.Y - 1] != null) && (board[fromLocation.X - 1, fromLocation.Y - 1].Player != piece.Player)) 445 | if(InBounds(fromLocation.X - 2, fromLocation.Y - 2) && (board[fromLocation.X - 2, fromLocation.Y - 2] == null)) 446 | { 447 | moves.Add(new Point(fromLocation.X - 2, fromLocation.Y - 2)); 448 | jumped.Add(board[fromLocation.X - 1, fromLocation.Y - 1]); 449 | } 450 | if(InBounds(fromLocation.X + 1, fromLocation.Y - 1) && (board[fromLocation.X + 1, fromLocation.Y - 1] != null) && (board[fromLocation.X + 1, fromLocation.Y - 1].Player != piece.Player)) 451 | if(InBounds(fromLocation.X + 2, fromLocation.Y - 2) && (board[fromLocation.X + 2, fromLocation.Y - 2] == null)) 452 | { 453 | moves.Add(new Point(fromLocation.X + 2, fromLocation.Y - 2)); 454 | jumped.Add(board[fromLocation.X + 1, fromLocation.Y - 1]); 455 | } 456 | } 457 | if((piece.Direction == CheckersDirection.Down) || (piece.Rank == CheckersRank.King)) 458 | { 459 | if(InBounds(fromLocation.X - 1, fromLocation.Y + 1) && (board[fromLocation.X - 1, fromLocation.Y + 1] != null) && (board[fromLocation.X - 1, fromLocation.Y + 1].Player != piece.Player)) 460 | if(InBounds(fromLocation.X - 2, fromLocation.Y + 2) && (board[fromLocation.X - 2, fromLocation.Y + 2] == null)) 461 | { 462 | moves.Add(new Point(fromLocation.X - 2, fromLocation.Y + 2)); 463 | jumped.Add(board[fromLocation.X - 1, fromLocation.Y + 1]); 464 | } 465 | if(InBounds(fromLocation.X + 1, fromLocation.Y + 1) && (board[fromLocation.X + 1, fromLocation.Y + 1] != null) && (board[fromLocation.X + 1, fromLocation.Y + 1].Player != piece.Player)) 466 | if(InBounds(fromLocation.X + 2, fromLocation.Y + 2) && (board[fromLocation.X + 2, fromLocation.Y + 2] == null)) 467 | { 468 | moves.Add(new Point(fromLocation.X + 2, fromLocation.Y + 2)); 469 | jumped.Add(board[fromLocation.X + 1, fromLocation.Y + 1]); 470 | } 471 | } 472 | return moves; 473 | } 474 | } 475 | } 476 | -------------------------------------------------------------------------------- /Checkers/PreferencesDialog.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | text/microsoft-resx 89 | 90 | 91 | 1.3 92 | 93 | 94 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 95 | 96 | 97 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 98 | 99 | 100 | 17, 17 101 | 102 | 103 | 104 | AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuMzMw 105 | MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT 106 | eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA 107 | AACkKAAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABIAEAASABAAT/ASEBEAj/AUIBTQE2BwABNgMAASgD 108 | AAGAAwABIAMAAQEBAAEgBgABQP8AUwAD9wH/A+cB/wPnAf8D9wH//wDtAAP3Af8D3gH/A8YB/wO1Af8D 109 | xgH/A84B/wPnAf8D9wH//wDhAAPnAf8DtQH/A6UB/wOlAf8DnAH/A5wB/wOlAf8DxgH/A+cB/9QAAwgB 110 | /wMIAf8DCAH/AwgB/wMIAf8DCAH/QwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB 111 | /wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB 112 | /wMAAf9IAAH/AdYB5wL/AtYC/wLWAv8BtQHGAf8B9wHOAaUC/wKMAf8DlAH/A5QB/wOtAf8D3gH/A/cB 113 | /8AAAwgB/wMIAf8DCAH/AiEC/wIhAv8CIQL/AiEC/wIhAv8CIQL/AwgB/wMIAf8DCAH/NwAB/wFjAu8B 114 | /wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMB 115 | CAH/AQgBYwEIAf8BCAFjAQgB/wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB 116 | /wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wMAAf9EAAP3Af8D3gH/A8YB 117 | /wPGAf8DzgH/A94C/wLWAf8B9wHOAaUB/wOUAf8DlAH/A5wB/wPOAf8D9wH/tAADCAH/AwgB/wIhAv8C 118 | IQL/AiEC/wIhAv8CIQL/AiEC/wIhAv8CIQL/AiEC/wIhAv8CIQL/AiEC/wMIAf8DCAH/LwAB/wFjAu8B 119 | /wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMB 120 | CAH/AQgBYwEIAf8BCAFjAQgB/wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB 121 | /wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wMAAf84AAH3A/8D9wH/A+cB 122 | /wPeAf8DpQH/A6UB/wOcAf8DnAH/A6UB/wPGAv8C1gL/ArUC/wKMAf8DlAH/A5QB/wPOAf8D9wH/rAAD 123 | CAH/AiEC/wIhAv8CIQL/AiEC/wIhAv8CIQL/AmsC/wJrAv8CawL/AmsC/wIhAv8CIQL/AiEC/wIhAv8C 124 | IQL/AiEC/wMIAf8rAAH/AWMC7wH/AWMC7wH/AWMC7wH/AQgBYwEIAf8BCAFjAQgB/wEIAWMBCAH/AWMC 125 | 7wH/AWMC7wH/AWMC7wH/AQgBYwEIAf8BCAFjAQgB/wEIAWMBCAH/AWMC7wH/AWMC7wH/AWMC7wH/AQgB 126 | YwEIAf8BCAFjAQgB/wEIAWMBCAH/AWMC7wH/AWMC7wH/AWMC7wH/AQgBYwEIAf8BCAFjAQgB/wEIAWMB 127 | CAH/AwAB/zAAA/cB/wPeAf8DxgH/A7UB/wOlAf8DtQH/A8YB/wH3Ac4BpQH/AfcBzgGlAf8DpQH/A5QB 128 | /wOUAf8DpQH/A84C/wG1AcYC/wKMAf8DhAH/A5QB/wPOAf+oAAMIAf8CIQL/AiEC/wIhAv8CIQL/AmsC 129 | /wJrAv8CawL/AgABlAH/AgABlAH/AgABlAH/AgABlAH/AmsC/wJrAv8CawL/AiEC/wIhAv8CIQL/AiEC 130 | /wMIAf8nAAH/AQgBYwEIAf8BCAFjAQgB/wEIAWMBCAH/AWMC7wH/AWMC7wH/AWMC7wH/AQgBYwEIAf8B 131 | CAFjAQgB/wEIAWMBCAH/AWMC7wH/AWMC7wH/AWMC7wH/AQgBYwEIAf8BCAFjAQgB/wEIAWMBCAH/AWMC 132 | 7wH/AWMC7wH/AWMC7wH/AQgBYwEIAf8BCAFjAQgB/wEIAWMBCAH/AWMC7wH/AWMC7wH/AWMC7wH/AwAB 133 | /ywAA+cB/wO1Af8DhAH/A1IB/wNKAf8DSgH/A1IB/wNjAf8DewH/A6UB/wPGAv8CtQH/A5QB/wOUAf8D 134 | lAH/A84C/wG1AcYC/wKMAf8DhAH/A6UB/wPnAf+gAAMIAf8CIQL/AiEC/wIhAv8CIQL/AmsC/wIAAZQB 135 | /wIAAZQB/wIAAZQB/wIAAZQB/wIAAZQB/wIAAZQB/wIAAZQB/wIAAZQB/wIAAZQB/wIAAZQB/wJrAv8C 136 | IQL/AiEC/wIhAv8CIQL/AwgB/yMAAf8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8B 137 | YwLvAf8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8BYwLvAf8BCAFjAQgB/wEIAWMB 138 | CAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8BYwLvAf8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8B 139 | YwLvAf8BYwLvAf8DAAH/KAAD5wH/A5QB/wM5Af8DYwH/A4QB/wOtAf8DnAH/A4QB/wNSAf8DOQH/A0oB 140 | /wNrAf8DrQL/AbUBxgL/AowB/wOEAf8DnAH/A94C/wK1Af8DlAH/A5QB/wPGAf8D9wH/mAADCAH/AiEC 141 | /wIhAv8CIQL/AiEC/wJrAv8CAAGUAf8CAAGUAf8CAAGUAf8CAAG9Af8CAAG9Af8CAAG9Af8CAAG9Af8C 142 | AAG9Af8CAAGUAf8CAAGUAf8CAAGUAf8CAAGUAf8CawL/AiEC/wIhAv8CIQL/AiEC/wMIAf8fAAH/AQgB 143 | YwEIAf8BCAFjAQgB/wEIAWMBCAH/AWMC7wH/AWMC7wH/AWMC7wH/AQgBYwEIAf8BCAFjAQgB/wEIAWMB 144 | CAH/AWMC7wH/AWMC7wH/AWMC7wH/AQgBYwEIAf8BCAFjAQgB/wEIAWMBCAH/AWMC7wH/AWMC7wH/AWMC 145 | 7wH/AQgBYwEIAf8BCAFjAQgB/wEIAWMBCAH/AWMC7wH/AWMC7wH/AWMC7wH/AwAB/yQAA+cB/wOEAf8D 146 | SgH/A60B/wPOAf8DzgH/A84B/wPOAf8DzgH/A84B/wOtAf8DUgH/AzkB/wNjAf8DpQL/AbUBxgL/AowB 147 | /wOUAf8DrQL/AtYC/wGMAa0B/wOUAf8DnAH/A94B/5gAAwgB/wIhAv8CIQL/AiEC/wJrAv8CAAG9Af8C 148 | AAG9Af8CAAG9Af8CAAG9Af8CAAG9Af8CAAG9Af8CAAG9Af8CAAG9Af8CAAG9Af8CAAG9Af8CAAGUAf8C 149 | AAGUAf8CAAGUAf8CAAGUAf8CawL/AiEC/wIhAv8CIQL/AwgB/x8AAf8BYwLvAf8BYwLvAf8BYwLvAf8B 150 | CAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8BYwLvAf8BCAFjAQgB/wEIAWMBCAH/AQgB 151 | YwEIAf8BYwLvAf8BYwLvAf8BYwLvAf8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8B 152 | YwLvAf8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8DAAH/IAAD9wH/A5QB/wNSAf8DrQH/A7UB/wOlAf8D 153 | lAH/A5wB/wOtAf8DtQH/A84B/wPOAf8DzgH/A3sB/wM5Af8DUgH/A6UC/wG1AcYB/wOUAf8DlAH/A8YC 154 | /wLWAv8CjAH/A5QB/wO1Af8D9wH/kAADCAH/AiEC/wIhAv8CIQL/AmsC/wIAAb0B/wIAAb0B/wIAAb0B 155 | /wIAAb0B/wIAAb0B/wIAAVIB/wIAAVIB/wIAAVIB/wIAAVIB/wIAAVIB/wIAAb0B/wIAAb0B/wIAAb0B 156 | /wIAAZQB/wIAAZQB/wIAAZQB/wJrAv8CIQL/AiEC/wIhAv8DCAH/GwAB/wFjAu8B/wFjAu8B/wFjAu8B 157 | /wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8B 158 | CAFjAQgB/wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wFjAu8B/wFjAu8B 159 | /wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wMAAf8gAAPOAf8DSgH/A5QB/wOEAf8DhAH/A60B 160 | /wPGAf8DzgH/A8YB/wOtAf8DnAH/A7UB/wPOAf8DzgH/A5QB/wM5Af8DYwH/A7UB/wH3Ac4BpQH/A5QB 161 | /wOcAf8D3gH/AfcBzgGlAf8DlAH/A5wB/wPnAf+QAAMIAf8CIQL/AiEC/wJKAv8CawL/AgABvQH/AgAB 162 | vQH/AgABvQH/AgABcwH/AgABcwH/AgABcwH/AmsC/wJrAv8CawL/AmsC/wIAAVIB/wIAAVIB/wIAAb0B 163 | /wIAAb0B/wIAAZQB/wIAAZQB/wJrAv8CIQL/AiEC/wIhAv8DCAH/GwAB/wFjAu8B/wFjAu8B/wFjAu8B 164 | /wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8B 165 | CAFjAQgB/wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wFjAu8B/wFjAu8B 166 | /wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wMAAf8gAANrAf8DawH/A2sB/wOEAf8DpQH/A7UB 167 | /wPGAf8DzgH/A84B/wPOAf8DzgH/A60B/wOtAf8DzgH/A84B/wNrAf8DOQH/A2sB/wH3Ac4BpQL/AowB 168 | /wOUAf8DxgL/AtYC/wKMAf8DlAH/A84B/4wAAwgB/wIhAv8CIQL/AkoC/wJKAv8CAAGUAf8CAAHeAf8C 169 | AAHeAf8CAAFzAf8CawL/AmsC/wJrAv8CAAFzAf8CawL/AmsC/wJrAv8CAAFSAf8CAAFzAf8CAAFSAf8C 170 | AAG9Af8CAAG9Af8CAAGUAf8CAAGUAf8CawL/AiEC/wIhAv8CIQL/AwgB/xcAAf8BAAGEAQAB/wEAAYQB 171 | AAH/AQABhAEAAf8BhAP/AYQD/wGEA/8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8B 172 | YwLvAf8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8BYwLvAf8BCAFjAQgB/wEIAWMB 173 | CAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8BYwLvAf8DAAH/HAAD5wH/AzkB/wNrAf8DawH/A5QB/wOcAf8D 174 | hAH/A5QB/wOtAf8DzgH/A84B/wPOAf8DzgH/A60B/wOtAf8DzgH/A8YB/wNKAf8DUgH/A6UB/wH3Ac4B 175 | pQH/A5QB/wOtAf8D3gL/AowB/wOUAf8DtQH/A/cB/4gAAwgB/wIhAv8CIQL/AkoC/wJKAv8CAAGUAf8C 176 | AAHeAf8CAAHeAf8CAAFzAf8CawL/AmsC/wJrAv8CawL/AmsC/wJrAv8CAAFSAf8CAAFzAf8CAAFzAf8C 177 | AAFSAf8CAAG9Af8CAAG9Af8CAAGUAf8CAAGUAf8CawL/AiEC/wIhAv8CIQL/AwgB/xcAAf8BAAGEAQAB 178 | /wEAAYQBAAH/AQABhAEAAf8BhAP/AYQD/wGEA/8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8B 179 | YwLvAf8BYwLvAf8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8BYwLvAf8BCAFjAQgB 180 | /wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8BYwLvAf8DAAH/HAADtQH/A0oB/wNSAf8DewH/A2sB 181 | /wNKAf8DYwH/A2MB/wNKAf8DawH/A8YB/wPOAf8DzgH/A84B/wOtAf8DtQH/A84B/wOtAf8DOQH/A2sC 182 | /wG1AcYB/wOEAf8DnAH/A94C/wK1Af8DlAH/A60B/wPnAf+IAAMIAf8CIQL/AkoC/wJKAv8CSgL/AgAB 183 | lAH/AgAB3gH/AgABcwH/AmsC/wIAAXMB/wIAAXMB/wIAAXMB/wJrAv8CawL/AmsC/wIAAVIB/wIAAXMB 184 | /wIAAVIB/wIAAVIB/wIAAVIB/wIAAb0B/wIAAb0B/wIAAZQB/wJrAv8CIQL/AiEC/wIhAv8DCAH/FwAB 185 | /wEAAYQBAAH/AQABhAEAAf8BAAGEAQAB/wGEA/8BhAP/AYQD/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB 186 | /wFjAu8B/wFjAu8B/wFjAu8B/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wFjAu8B/wFjAu8B/wFjAu8B 187 | /wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wFjAu8B/wFjAu8B/wFjAu8B/wMAAf8YAAPnAf8DewH/A0oB 188 | /wNjAf8DYwH/A0oB/wOEAf8DhAH/A4QB/wOEAf8DawH/A0oB/wPGAf8DzgH/A84B/wPOAf8DnAH/A84B 189 | /wPOAf8DSgH/A1IB/wO1Av8CjAH/A60B/wPeAv8C1gH/A5QB/wPGAf8D9wH/iAADCAH/AiEC/wJKAv8C 190 | SgL/AkoC/wIAAZQB/wIAAd4B/wIAAXMB/wJrAv8CawL/AmsC/wJrAv8CawL/AmsC/wJrAv8CAAFSAf8C 191 | AAFzAf8CAAFSAf8CAAFSAf8CAAFSAf8CAAG9Af8CAAG9Af8CAAGUAf8CawL/AiEC/wIhAv8CIQL/AwgB 192 | /xcAAf8BhAP/AYQD/wGEA/8BAAGEAQAB/wEAAYQBAAH/AQABhAEAAf8BhAP/AYQD/wGEA/8BAAGEAQAB 193 | /wEAAYQBAAH/AQABhAEAAf8BhAP/AYQD/wGEA/8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8B 194 | YwLvAf8BYwLvAf8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8DAAH/FAAD3gH/A5wB/wNKAf8DSgH/A2MB 195 | /wNKAf8DawH/A3sB/wN7Af8DewH/A4QB/wOEAf8DawH/A1IB/wPOAf8DzgH/A84B/wO1Af8DtQH/A84B 196 | /wOEAf8DSgH/A6UC/wKMAf8D3gH/A/cC/wHWAecB/wPGAf8D9wH/jAADCAH/AiEC/wJKAv8CSgL/AkoC 197 | /wIAAZQB/wIAAd4B/wIAAXMB/wJrAv8CawL/AmsC/wJrAv8CawL/AmsC/wJrAv8CAAFSAf8CAAFzAf8C 198 | AAFSAf8CAAFSAf8CAAFSAf8CAAG9Af8CAAG9Af8CAAGUAf8CawL/AiEC/wIhAv8CIQL/AwgB/xcAAf8B 199 | hAP/AYQD/wGEA/8BAAGEAQAB/wEAAYQBAAH/AQABhAEAAf8BhAP/AYQD/wGEA/8BAAGEAQAB/wEAAYQB 200 | AAH/AQABhAEAAf8BhAP/AYQD/wGEA/8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8B 201 | YwLvAf8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8DAAH/EAAD5wH/A2sB/wM5Af8DOQH/AzkB/wNjAf8D 202 | OQH/A2sB/wNjAf8DYwH/A2sB/wNrAf8DewH/A4QB/wNSAf8DlAH/A84B/wPOAf8DzgH/A5wB/wPOAf8D 203 | tQH/AzkB/wOEAf8DzgH/AfcD/5wAAwgB/wIhAv8CSgL/AkoC/wJKAv8CAAGUAf8CAAHeAf8CAAFzAf8C 204 | awL/AmsC/wJrAv8CawL/AmsC/wJrAv8CawL/AgABUgH/AgABvQH/AgABUgH/AgABUgH/AgABUgH/AgAB 205 | vQH/AgABvQH/AgABvQH/AmsC/wIhAv8CIQL/AiEC/wMIAf8XAAH/AYQD/wGEA/8BhAP/AQABhAEAAf8B 206 | AAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8B 207 | hAP/AQgBYwEIAf8BCAFjAQgB/wEIAWMBCAH/AWMC7wH/AWMC7wH/AWMC7wH/AQgBYwEIAf8BCAFjAQgB 208 | /wEIAWMBCAH/AwAB/xAAA3sB/wNSAf8DewH/A2MB/wM5Af8DUgH/AzkB/wN7Af8DhAH/A4QB/wN7Af8D 209 | awH/A2sB/wN7Af8DewH/A2MB/wPGAf8DzgH/A84B/wOcAf8DxgH/A84B/wM5Af8DewH/A84B/6AAAwgB 210 | /wIhAv8CSgL/AkoC/wJKAv8CAAGUAf8CAAHeAf8CAAHeAf8CAAFzAf8CAAG9Af8CAAG9Af8CAAG9Af8C 211 | awL/AmsC/wJrAv8CAAFSAf8CAAG9Af8CAAG9Af8CAAFSAf8CAAG9Af8CAAG9Af8CAAG9Af8CAAFzAf8C 212 | SgL/AiEC/wIhAv8CIQL/AwgB/xcAAf8BAAGEAQAB/wEAAYQBAAH/AQABhAEAAf8BhAP/AYQD/wGEA/8B 213 | AAGEAQAB/wEAAYQBAAH/AQABhAEAAf8BhAP/AYQD/wGEA/8BAAGEAQAB/wEAAYQBAAH/AQABhAEAAf8B 214 | hAP/AYQD/wGEA/8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8BYwLvAf8DAAH/DAAD 215 | 9wH/AzkB/wOEAf8DhAH/A2MB/wM5Af8DUgH/A0oB/wOUAf8DnAH/A5wB/wOUAf8DhAH/A2sB/wNrAf8D 216 | ewH/A0oB/wO1Af8DtQH/A84B/wOtAf8DxgH/A84B/wNSAf8DawH/A84B/6QAAwgB/wJKAv8CSgL/AkoC 217 | /wJKAv8CAAGUAf8CAAHeAf8CAAFzAf8CawL/AmsC/wJrAv8CawL/AmsC/wJrAv8CawL/AgABUgH/AgAB 218 | vQH/AgABUgH/AgABvQH/AgABvQH/AgABcwH/AkoC/wJKAv8CIQL/AiEC/wMIAf8bAAH/AQABhAEAAf8B 219 | AAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8B 220 | hAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8BhAP/AQgBYwEIAf8BCAFjAQgB/wEIAWMB 221 | CAH/AWMC7wH/AWMC7wH/AWMC7wH/AwAB/wwAA84B/wNKAf8DlAH/A6UB/wOUAf8DMQH/A0oB/wM5Af8D 222 | pQH/A60B/wOtAf8DpQH/A5QB/wOEAf8DawH/A3sB/wNKAf8DpQH/A7UB/wO1Af8DpQH/A60B/wPOAf8D 223 | UgH/A2sB/wPOAf+kAAMIAf8CIQL/AkoC/wJKAv8CSgL/AgABlAH/AgAB3gH/AgAB3gH/AgABUgH/AgAB 224 | UgH/AmsC/wJrAv8CawL/AmsC/wJrAv8CAAFSAf8CAAFSAf8CAAHeAf8CAAG9Af8CAAG9Af8CAAFzAf8C 225 | SgL/AkoC/wIhAv8CIQL/AwgB/xsAAf8BAAGEAQAB/wEAAYQBAAH/AQABhAEAAf8BhAP/AYQD/wGEA/8B 226 | AAGEAQAB/wEAAYQBAAH/AQABhAEAAf8BhAP/AYQD/wGEA/8BAAGEAQAB/wEAAYQBAAH/AQABhAEAAf8B 227 | hAP/AYQD/wGEA/8BCAFjAQgB/wEIAWMBCAH/AQgBYwEIAf8BYwLvAf8BYwLvAf8BYwLvAf8DAAH/DAAD 228 | zgH/A2MB/wO1Af8DxgH/A8YB/wMxAf8DOQH/AzkB/wOEAf8DxgH/A8YB/wO1Af8DpQH/A4QB/wNrAf8D 229 | awH/AzkB/wOUAf8DpQH/A7UB/wOcAf8DtQH/A84B/wNSAf8DewH/A94B/6gAAwgB/wJKAv8CSgL/AkoC 230 | /wJKAv8CAAGUAf8CAAHeAf8CAAHeAf8CAAHeAf8CAAFSAf8CAAFSAf8CAAFSAf8CAAFSAf8CAAFSAf8C 231 | AAHeAf8CAAHeAf8CAAHeAf8CAAG9Af8CAAFzAf8CSgL/AkoC/wIhAv8CIQL/AwgB/x8AAf8BhAP/AYQD 232 | /wGEA/8BAAGEAQAB/wEAAYQBAAH/AQABhAEAAf8BhAP/AYQD/wGEA/8BAAGEAQAB/wEAAYQBAAH/AQAB 233 | hAEAAf8BhAP/AYQD/wGEA/8BAAGEAQAB/wEAAYQBAAH/AQABhAEAAf8BhAP/AYQD/wGEA/8BCAFjAQgB 234 | /wEIAWMBCAH/AQgBYwEIAf8DAAH/DAAD3gH/A2MB/wPeAf8D5wH/A/cB/wNrAf8DMQH/A0oB/wNKAf8D 235 | zgH/A84B/wO1Af8DpQH/A5QB/wN7Af8DYwH/A0oB/wOUAf8DlAH/A6UB/wOUAf8DrQH/A84B/wNKAf8D 236 | lAH/A94B/6gAAwgB/wJKAv8CSgL/AkoC/wJKAv8CSgL/AgABlAH/AgAB3gH/AgAB3gH/AgAB3gH/AgAB 237 | 3gH/AgAB3gH/AgAB3gH/AgAB3gH/AgAB3gH/AgABvQH/AgABvQH/AgABcwH/AkoC/wJKAv8CSgL/AiEC 238 | /wIhAv8DCAH/HwAB/wGEA/8BhAP/AYQD/wEAAYQBAAH/AQABhAEAAf8BAAGEAQAB/wGEA/8BhAP/AYQD 239 | /wEAAYQBAAH/AQABhAEAAf8BAAGEAQAB/wGEA/8BhAP/AYQD/wEAAYQBAAH/AQABhAEAAf8BAAGEAQAB 240 | /wGEA/8BhAP/AYQD/wEIAWMBCAH/AQgBYwEIAf8BCAFjAQgB/wMAAf8QAAM5Af8D9wn/A8YB/wMxAf8D 241 | OQH/AzkB/wNSAf8DtQH/A7UB/wOlAf8DhAH/A2sB/wM5Af8DYwH/A4QB/wOUAf8DlAH/A4QB/wOtAf8D 242 | rQH/AzkB/wOtAf8D9wH/rAADCAH/AkoC/wJKAv8CSgL/AkoC/wJKAv8CAAFzAf8CAAFzAf8CAAHeAf8C 243 | AAG9Af8CAAG9Af8CAAG9Af8CAAG9Af8CAAG9Af8CAAFzAf8CAAFzAf8CSgL/AkoC/wJKAv8CIQL/AiEC 244 | /wMIAf8jAAH/AYQD/wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8BhAP/AQAB 245 | hAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD 246 | /wGEA/8BhAP/AQgBYwEIAf8BCAFjAQgB/wEIAWMBCAH/AwAB/xAAA4QB/wOlAf8D5wH/A+cB/wPeAf8D 247 | YwH/AzEB/wM5Af8DOQH/A0oB/wN7Af8DewH/A2sB/wM5Af8DUgH/A2sB/wN7Af8DhAH/A4QB/wOEAf8D 248 | pQH/A4QB/wNSAf8DxgH/AfcD/7AAAwgB/wJKAv8CSgL/AkoC/wJKAv8CSgL/AkoC/wIAAXMB/wIAAXMB 249 | /wIAAXMB/wIAAXMB/wIAAXMB/wIAAXMB/wJKAv8CSgL/AkoC/wJKAv8CIQL/AiEC/wMIAf8nAAH/AQAB 250 | hAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD 251 | /wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB 252 | /wEAAYQBAAH/AWMC7wH/AWMC7wH/AWMC7wH/AwAB/xAAA+cB/wNKAf8DxgH/A84B/wPOAf8DpQH/AzkB 253 | /wMxAf8DOQH/A0oB/wM5Af8DOQH/A0oB/wNSAf8DYwH/A2MB/wNrAf8DewH/A2sB/wOEAf8DlAH/AzkB 254 | /wOUAf8D5wH/uAADCAH/AkoC/wJKAv8CSgL/AkoC/wJKAv8CSgL/AkoC/wJKAv8CSgL/AkoC/wJKAv8C 255 | SgL/AkoC/wJKAv8CIQL/AiEC/wMIAf8rAAH/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8B 256 | hAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB/wEAAYQB 257 | AAH/AYQD/wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AWMC7wH/AWMC7wH/AWMC7wH/AwAB 258 | /xQAA7UB/wNSAf8DpQH/A7UB/wOtAf8DawH/AzEB/wMxAf8DOQH/A0oB/wNKAf8DUgH/A1IB/wNjAf8D 259 | YwH/A2MB/wNjAf8DawH/A4QB/wNjAf8DUgH/A84B/wH3A/+8AAMIAf8DCAH/AkoC/wJKAv8CSgL/AkoC 260 | /wJKAv8CSgL/AkoC/wJKAv8CSgL/AkoC/wIhAv8CIQL/AwgB/wMIAf8vAAH/AQABhAEAAf8BAAGEAQAB 261 | /wEAAYQBAAH/AYQD/wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8BhAP/AQAB 262 | hAEAAf8BAAGEAQAB/wEAAYQBAAH/AYQD/wGEA/8BhAP/AQABhAEAAf8BAAGEAQAB/wEAAYQBAAH/AWMC 263 | 7wH/AWMC7wH/AWMC7wH/AwAB/xgAA8YB/wNKAf8DUgH/A1IB/wM5Af8DawH/AzEB/wMxAf8DOQH/A0oB 264 | /wNKAf8DUgH/A1IB/wNSAf8DUgH/A2MB/wNrAf8DYwH/A0oB/wPGAf8D9wH/yAADCAH/AwgB/wMIAf8C 265 | SgL/AkoC/wJKAv8CSgL/AkoC/wJKAv8DCAH/AwgB/wMIAf83AAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8D 266 | AAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8D 267 | AAH/AwAB/wMAAf8DAAH/AwAB/yAAA84B/wPOAf8D9wH/BAADxgH/AzkB/wMxAf8DOQH/AzkB/wNKAf8D 268 | SgH/A0oB/wNSAf8DYwH/A1IB/wNKAf8DxgH/A/cB/9gAAwgB/wMIAf8DCAH/AwgB/wMIAf8DCAH/4AAD 269 | hAH/AzkB/wM5Af8DOQH/A0oB/wNKAf8DSgH/AzkB/wN7Af8D3gH/AfcD//8A3QADxgH/A5QB/wOUAf8D 270 | lAH/A7UB/wPnAf//AP8AtgABQgFNAT4HAAE+AwABKAMAAYADAAEgAwABAQEAAQEGAAECFgAD/wEACv8B 271 | DwH/BAAJ/wH+AQEB/wQACf8B/gEAAf8EAAH/AfgBHwH/AeACAAEHAf8B/gEAAT8EAAH/AcABAwH/AeAC 272 | AAEHAf8B/AEAAR8EAAH/AgAB/wHgAgABBwH/AeABAAEPBAAB/gIAAX8B4AIAAQcB/wGAAQABDwQAAfwC 273 | AAE/AeACAAEHAf8CAAEHBAAB+AIAAR8B4AIAAQcB/gIAAQMEAAHwAgABDwHgAgABBwH8AgABAwQAAfAC 274 | AAEPAeACAAEHAfgCAAEBBAAB4AIAAQcB4AIAAQcB+AIAAQEEAAHgAgABBwHgAgABBwH4AgABAQQAAcAC 275 | AAEDAeACAAEHAfAHAAHAAgABAwHgAgABBwHwBwABwAIAAQMB4AIAAQcB4AcAAcACAAEDAeACAAEHAcAC 276 | AAEBBAABwAIAAQMB4AIAAQcBgAIAAR8EAAHAAgABAwHgAgABBwGAAgABPwQAAcACAAEDAeACAAEHAwAB 277 | PwQAAeACAAEHAeACAAEHAwABPwQAAeACAAEHAeACAAEHAwABPwQAAfACAAEPAeACAAEHAwABPwQAAfAC 278 | AAEPAeACAAEHAYACAAE/BAAB+AIAAR8B4AIAAQcBgAIAAT8EAAH8AgABPwHgAgABBwGAAgABfwQAAf4C 279 | AAF/AeACAAEHAcACAAF/BAAB/wIAAf8B4AIAAQcB4AIAAf8EAAH/AcABAwH/AeACAAEHAfgBgAEBAf8E 280 | AAH/AfgBHwb/AeABAwH/BAAJ/wH4AR8B/wQADP8aAAs= 281 | 282 | 283 | 284 | 354, 17 285 | 286 | 287 | 107, 17 288 | 289 | 290 | 230, 17 291 | 292 | 293 | frmPreferences 294 | 295 | -------------------------------------------------------------------------------- /Checkers/MainForm.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | text/microsoft-resx 89 | 90 | 91 | 1.3 92 | 93 | 94 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 95 | 96 | 97 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 98 | 99 | 100 | 17, 17 101 | 102 | 103 | 120, 17 104 | 105 | 106 | 222, 17 107 | 108 | 109 | 110 | AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuMzMw 111 | MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT 112 | eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA 113 | AACIIQAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABQAEAASABAAT/ASEBEAj/AUIBTQE2BwABNgMAASgE 114 | AAEBAgABIAMAAQEBAAEgBgABgP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/ 115 | AP8A/wD/ADYAATEBSgFSAf8BMQFKAVIB/xAAATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/ATEBSgFSAf8B 116 | MQFKAVIB/wQAATEBSgFSAf8BMQFKAVIB/wwAATEBSgFSAf8BMQFKAVIB/wgAATEBSgFSAf8BMQFKAVIB 117 | /6QAATEBSgFSAf8BMQFKAVIB/xAAATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/ATEBSgFSAf8BMQFKAVIB 118 | /wQAATEBSgFSAf8BMQFKAVIB/wwAATEBSgFSAf8BMQFKAVIB/wgAATEBSgFSAf8BMQFKAVIB//8A/wCi 119 | AAFjAe8C/wFjAe8C/wExAUoBUgH/DAABYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8BMQFKAVIB 120 | /wFjAe8C/wFjAe8C/wExAUoBUgH/CAABYwHvAv8BYwHvAv8BMQFKAVIB/wQAAWMB7wL/AWMB7wL/ATEB 121 | SgFSAf+gAAFjAe8C/wFjAe8C/wExAUoBUgH/DAABYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8B 122 | MQFKAVIB/wFjAe8C/wFjAe8C/wExAUoBUgH/CAABYwHvAv8BYwHvAv8BMQFKAVIB/wQAAWMB7wL/AWMB 123 | 7wL/ATEBSgFSAf//AP8AogABYwHvAv8BYwHvAv8BMQFKAVIB/wgAAWMB7wL/AWMB7wL/ATEBSgFSAf8E 124 | AAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8IAAFjAe8C/wFjAe8C/wExAUoB 125 | UgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB/6AAAWMB7wL/AWMB7wL/ATEBSgFSAf8IAAFjAe8C/wFjAe8C 126 | /wExAUoBUgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB/wFjAe8C/wFjAe8C/wExAUoBUgH/CAABYwHvAv8B 127 | YwHvAv8BMQFKAVIB/wQAAWMB7wL/AWMB7wL/ATEBSgFSAf//AP8AogABYwHvAv8BYwHvAv8BMQFKAVIB 128 | /wgAAWMB7wL/AWMB7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEB 129 | SgFSAf8IAAFjAe8C/wFjAe8C/wExAUoBUgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB/6AAAWMB7wL/AWMB 130 | 7wL/ATEBSgFSAf8IAAFjAe8C/wFjAe8C/wExAUoBUgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB/wFjAe8C 131 | /wFjAe8C/wExAUoBUgH/CAABYwHvAv8BYwHvAv8BMQFKAVIB/wQAAWMB7wL/AWMB7wL/ATEBSgFSAf// 132 | AP8AogABYwHvAv8BYwHvAv8BMQFKAVIB/wgAAWMB7wL/AWMB7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C 133 | /wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEB 134 | SgFSAf8EAAFjAe8C/wFjAe8C/wExAUoBUgH/oAABYwHvAv8BYwHvAv8BMQFKAVIB/wgAAWMB7wL/AWMB 135 | 7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB 136 | /wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C/wExAUoBUgH//wD/AKIAAWMB 137 | 7wL/AWMB7wL/ATEBSgFSAf8IAAFjAe8C/wFjAe8C/wExAUoBUgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB 138 | /wFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB 139 | /wFjAe8C/wFjAe8C/6QAAWMB7wL/AWMB7wL/ATEBSgFSAf8IAAFjAe8C/wFjAe8C/wExAUoBUgH/BAAB 140 | YwHvAv8BYwHvAv8BMQFKAVIB/wFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB 141 | 7wL/ATEBSgFSAf8BMQFKAVIB/wFjAe8C/wFjAe8C/7gAATEBSgFSAf8BMQFKAVIB/xAAATEBSgFSAf8B 142 | MQFKAVIB/wwAATEBSgFSAf8BMQFKAVIB/wQAATEBSgFSAf8BMQFKAVIB/wwAATEBSgFSAf8BMQFKAVIB 143 | /wQAATEBSgFSAf8BMQFKAVIB/wwAATEBSgFSAf8BMQFKAVIB/wgAATEBSgFSAf8BMQFKAVIB/wExAUoB 144 | UgH/ATEBSgFSAf8BMQFKAVIB/wgAATEBSgFSAf8BMQFKAVIB/xQAATEBSgFSAf8BMQFKAVIB/wwAATEB 145 | SgFSAf8BMQFKAVIB//8AHQABYwHvAv8BYwHvAv8BMQFKAVIB/wgAAWMB7wL/AWMB7wL/CAABYwHvAv8B 146 | YwHvAv8EAAFjAe8C/wFjAe8C/wQAAWMB7wL/BAABYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv+o 147 | AAFjAe8C/wFjAe8C/wExAUoBUgH/CAABYwHvAv8BYwHvAv8IAAFjAe8C/wFjAe8C/wQAAWMB7wL/AWMB 148 | 7wL/BAABYwHvAv8EAAFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/7gAAv8BxgP/AcYB/wExAUoB 149 | UgH/DAAC/wHGA/8BxgH/ATEBSgFSAf8IAAL/AcYD/wHGAf8BMQFKAVID/wHGA/8BxgH/ATEBSgFSAf8I 150 | AAL/AcYD/wHGAf8BMQFKAVID/wHGA/8BxgH/ATEBSgFSAf8IAAL/AcYD/wHGAf8BMQFKAVIB/wQAAv8B 151 | xgP/AcYD/wHGA/8BxgP/AcYB/wQAATEBSgFSA/8BxgP/AcYB/wExAUoBUgH/EAAC/wHGA/8BxgH/ATEB 152 | SgFSAf8IAAL/AcYD/wHGAf8BMQFKAVIB//8AGQABMQFKAVIB/wFjAe8C/wFjAe8C/wExAUoBUgH/ATEB 153 | SgFSAf8BMQFKAVIB/+gAATEBSgFSAf8BYwHvAv8BYwHvAv8BMQFKAVIB/wExAUoBUgH/ATEBSgFSAf/8 154 | AAL/AcYD/wHGAf8BMQFKAVIB/wExAUoBUgH/CAAC/wHGA/8BxgH/ATEBSgFSAf8BMQFKAVIB/wQAAv8B 155 | xgP/AcYB/wExAUoBUgP/AcYD/wHGAf8BMQFKAVIB/wgAAv8BxgP/AcYB/wExAUoBUgP/AcYD/wHGAf8B 156 | MQFKAVIB/wgAAv8BxgP/AcYB/wExAUoBUgP/AcYD/wHGAf8BMQFKAVIB/wwAAv8BxgH/BAAC/wHGA/8B 157 | xgH/ATEBSgFSAf8QAAL/AcYD/wHGAf8MAAL/AcYD/wHGAf//ABkAAWMB7wL/AWMB7wL/AWMB7wL/AWMB 158 | 7wL/AWMB7wL/AWMB7wL/6AABYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv/8AAL/AcYD 159 | /wHGA/8BxgP/AcYB/wExAUoBUgH/BAAC/wHGA/8BxgP/AcYD/wHGAf8BMQFKAVIB/wQAAv8BxgP/AcYB 160 | /wExAUoBUgP/AcYD/wHGAf8BMQFKAVIB/wgAAv8BxgP/AcYB/wExAUoBUgP/AcYD/wHGAf8BMQFKAVIB 161 | /wgAAv8BxgP/AcYB/wExAUoBUgP/AcYD/wHGAf8BMQFKAVIB/wExAUoBUgH/ATEBSgFSAf8BMQFKAVIB 162 | /wExAUoBUgH/ATEBSgFSA/8BxgP/AcYB/wExAUoBUgH/FAABMQFKAVIB/wExAUoBUgH/DAABMQFKAVIB 163 | /wExAUoBUgH//wD/AP8AKwAC/wHGA/8BxgP/AcYD/wHGAf8BMQFKAVIB/wExAUoBUgP/AcYD/wHGA/8B 164 | xgP/AcYB/wExAUoBUgH/BAAC/wHGA/8BxgH/ATEBSgFSA/8BxgP/AcYB/wExAUoBUgH/CAAC/wHGA/8B 165 | xgH/ATEBSgFSA/8BxgP/AcYB/wExAUoBUgH/CAAC/wHGA/8BxgH/ATEBSgFSA/8BxgP/AcYD/wHGA/8B 166 | xgP/AcYD/wHGA/8BxgH/ATEBSgFSA/8BxgP/AcYB/wExAUoBUgH/EAAC/wHGA/8BxgH/ATEBSgFSAf8I 167 | AAL/AcYD/wHGAf8BMQFKAVIB//8A/wD/ACsAAv8BxgP/AcYB/wQAAv8BxgP/AcYD/wHGA/8BxgH/ATEB 168 | SgFSA/8BxgP/AcYB/wExAUoBUgH/ATEBSgFSA/8BxgP/AcYB/wExAUoBUgP/AcYD/wHGAf8BMQFKAVIB 169 | /wExAUoBUgH/BAAC/wHGA/8BxgH/ATEBSgFSA/8BxgP/AcYB/wExAUoBUgH/ATEBSgFSAf8EAAL/AcYD 170 | /wHGAf8BMQFKAVID/wHGA/8BxgH/ATEBSgFSAf8IAAL/AcYD/wHGAf8BMQFKAVID/wHGA/8BxgH/ATEB 171 | SgFSAf8BMQFKAVIB/wExAUoBUgH/ATEBSgFSAf8EAAL/AcYD/wHGAf8BMQFKAVIB/wgAAv8BxgP/AcYB 172 | /wExAUoBUgH//wD/ADoAATEBSgFSAf8BMQFKAVIB/xQAATEBSgFSAf8BMQFKAVIB/8gAAv8BxgP/AcYB 173 | /wExAUoBUgH/BAAC/wHGA/8BxgP/AcYD/wHGAf8IAAL/AcYD/wHGAf8BMQFKAVID/wHGA/8BxgH/ATEB 174 | SgFSA/8BxgP/AcYD/wHGAf8EAAExAUoBUgP/AcYD/wHGAf8EAAL/AcYD/wHGA/8BxgH/BAABMQFKAVID 175 | /wHGA/8BxgH/BAAC/wHGA/8BxgH/ATEBSgFSAf8BMQFKAVIB/wExAUoBUgP/AcYD/wHGAf8EAAL/AcYD 176 | /wHGA/8BxgP/AcYD/wHGAf8BMQFKAVIB/wQAAv8BxgP/AcYB/wExAUoBUgH/CAAC/wHGA/8BxgH/ATEB 177 | SgFSAf//AP8ANgABYwHvAv8BYwHvAv8BMQFKAVIB/xAAAWMB7wL/AWMB7wL/ATEBSgFSAf/IAAL/AcYD 178 | /wHGAf8BMQFKAVIB/wgAAv8BxgP/AcYB/wExAUoBUgH/CAAC/wHGA/8BxgH/ATEBSgFSA/8BxgP/AcYB 179 | /wQAAv8BxgP/AcYB/wQAAv8BxgP/AcYD/wHGAf8IAAL/AcYD/wHGAf8EAAL/AcYD/wHGA/8BxgH/DAAC 180 | /wHGA/8BxgP/AcYD/wHGA/8BxgH/CAAC/wHGA/8BxgH/BAAC/wHGA/8BxgH/CAAC/wHGA/8BxgH/ATEB 181 | SgFSAf8IAAL/AcYD/wHGAf8BMQFKAVIB//8AIQABMQFKAVIB/wExAUoBUgH/EAABMQFKAVIB/wExAUoB 182 | UgH/ATEBSgFSAf8BMQFKAVIB/wwAATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/ATEBSgFSAf8BMQFKAVIB 183 | /wQAATEBSgFSAf8BMQFKAVIB/6gAATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/ATEBSgFSAf8BMQFKAVIB 184 | /wQAAWMB7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/ATEBSgFSAf8EAAFjAe8C/wFjAe8C 185 | /wExAUoBUgH/ATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/DAABMQFKAVIB/wExAUoBUgH/ATEBSgFSAf8B 186 | MQFKAVIB/wgAATEBSgFSAf8BMQFKAVIB/wgAATEBSgFSAf8BMQFKAVIB/wgAATEBSgFSAf8BMQFKAVIB 187 | /wExAUoBUgH/ATEBSgFSAf8BMQFKAVIB/wQAATEBSgFSAf8BMQFKAVIB/wgAATEBSgFSAf8BMQFKAVIB 188 | /wgAATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/EAABMQFKAVIB/wExAUoBUgH/ATEBSgFSAf8BMQFKAVIB 189 | /xQAAv8BxgP/AcYB/wExAUoBUgH/CAAC/wHGA/8BxgH/ATEBSgFSAf8IAAL/AcYD/wHGAf8BMQFKAVIB 190 | /wQAATEBSgFSAf8BMQFKAVIB/3wAAv8BxgP/AcYB/wExAUoBUgH/CAAC/wHGA/8BxgH/ATEBSgFSAf// 191 | AB0AAWMB7wL/AWMB7wL/ATEBSgFSAf8MAAFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wExAUoBUgH/ATEB 192 | SgFSAf8EAAFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEB 193 | SgFSAf+kAAFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wExAUoBUgH/ATEBSgFSAf8BYwHvAv8B 194 | YwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8BMQFKAVIB/wExAUoBUgH/AWMB7wL/AWMB7wL/AWMB7wL/AWMB 195 | 7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB/wQAAWMB7wL/AWMB7wL/AWMB7wL/AWMB7wL/ATEBSgFSAf8B 196 | MQFKAVIB/wFjAe8C/wFjAe8C/wExAUoBUgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB/wQAAWMB7wL/AWMB 197 | 7wL/AWMB7wL/AWMB7wL/AWMB7wL/BAABYwHvAv8BYwHvAv8BMQFKAVIB/wQAAWMB7wL/AWMB7wL/ATEB 198 | SgFSAf8EAAFjAe8C/wFjAe8C/wFjAe8C/xAAAWMB7wL/AWMB7wL/AWMB7wL/AWMB7wL/ATEBSgFSAf8B 199 | MQFKAVIB/xAAAv8BxgP/AcYB/wwAAv8BxgP/AcYB/wwAAv8BxgP/AcYB/wQAAv8BxgP/AcYB/wExAUoB 200 | UgH/fAAC/wHGA/8BxgH/DAAC/wHGA/8BxgH//wAhAAFjAe8C/wFjAe8C/wExAUoBUgH/CAABYwHvAv8B 201 | YwHvAv8BMQFKAVIB/wQAAWMB7wL/AWMB7wL/ATEBSgFSAf8BYwHvAv8BYwHvAv8BMQFKAVIB/wQAAWMB 202 | 7wL/AWMB7wL/ATEBSgFSAf8BYwHvAv8BYwHvAv8BMQFKAVIB/6AAAWMB7wL/AWMB7wL/ATEBSgFSAf8I 203 | AAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C/wExAUoB 204 | UgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEB 205 | SgFSAf8EAAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C 206 | /wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8QAAFjAe8C/wFjAe8C/wExAUoBUgH/BAABYwHvAv8B 207 | YwHvAv8BMQFKAVIB/wFjAe8C/wFjAe8C/wExAUoBUgH/HAABMQFKAVIB/wFjAe8C/wFjAe8C/wExAUoB 208 | UgH/RAAC/wHGA/8BxgH//wC9AAFjAe8C/wFjAe8C/wExAUoBUgH/CAABYwHvAv8BYwHvAv8BMQFKAVIB 209 | /wQAAWMB7wL/AWMB7wL/ATEBSgFSAf8BYwHvAv8BYwHvAv8BMQFKAVIB/wQAAWMB7wL/AWMB7wL/ATEB 210 | SgFSAf8BYwHvAv8BYwHvAv8BMQFKAVIB/6AAAWMB7wL/AWMB7wL/ATEBSgFSAf8IAAFjAe8C/wFjAe8C 211 | /wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB 212 | 7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8EAAFjAe8C 213 | /wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB 214 | 7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/ATEBSgFSAf8BMQFKAVIB/wFjAe8C/wFjAe8C 215 | /wExAUoBUgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB/wFjAe8C/wFjAe8C/wExAUoBUgH/GAABYwHvAv8B 216 | YwHvAv8BYwHvAv8BYwHvAv//AP8ADgABYwHvAv8BYwHvAv8BMQFKAVIB/wExAUoBUgH/BAABYwHvAv8B 217 | YwHvAv8BMQFKAVIB/wQAAWMB7wL/AWMB7wL/ATEBSgFSAf8BYwHvAv8BYwHvAv8BMQFKAVIB/wQAAWMB 218 | 7wL/AWMB7wL/ATEBSgFSAf8BYwHvAv8BYwHvAv8BMQFKAVIB/wExAUoBUgH/ATEBSgFSAf+YAAFjAe8C 219 | /wFjAe8C/wExAUoBUgH/CAABYwHvAv8BYwHvAv8BMQFKAVIB/wFjAe8C/wFjAe8C/wExAUoBUgH/BAAB 220 | YwHvAv8BYwHvAv8BMQFKAVIB/wFjAe8C/wFjAe8C/wExAUoBUgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB 221 | /wFjAe8C/wFjAe8C/wExAUoBUgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB/wFjAe8C/wFjAe8C/wExAUoB 222 | UgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB/wFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C 223 | /wExAUoBUgH/AWMB7wL/AWMB7wL/ATEBSgFSAf8EAAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB7wL/AWMB 224 | 7wL/ATEBSgFSAf8UAAFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C//8A/wAOAAFjAe8C/wFjAe8C/wFjAe8C 225 | /wFjAe8C/wExAUoBUgH/BAABYwHvAv8BYwHvAv8BMQFKAVIB/wExAUoBUgH/AWMB7wL/AWMB7wL/BAAB 226 | YwHvAv8BYwHvAv8BMQFKAVIB/wQAAWMB7wL/AWMB7wL/ATEBSgFSAf8BYwHvAv8BYwHvAv8BYwHvAv8B 227 | YwHvAv8BMQFKAVIB/5gAAWMB7wL/AWMB7wL/ATEBSgFSAf8IAAFjAe8C/wFjAe8C/wExAUoBUgH/AWMB 228 | 7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB/wFjAe8C/wFjAe8C/wQAAWMB7wL/AWMB7wL/ATEBSgFSAf8B 229 | MQFKAVIB/wFjAe8C/wFjAe8C/wQAAWMB7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB/wFjAe8C/wFjAe8C 230 | /wQAAWMB7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB/wFjAe8C/wFjAe8C/wQAAWMB7wL/AWMB7wL/ATEB 231 | SgFSAf8BMQFKAVIB/wFjAe8C/wFjAe8C/wQAAWMB7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB/wFjAe8C 232 | /wFjAe8C/wQAAWMB7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/DAABYwHvAv8BYwHvAv8B 233 | MQFKAVIB/wExAUoBUgH/ATEBSgFSAf8BMQFKAVIB//8A/wAGAAFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C 234 | /wExAUoBUgH/ATEBSgFSAf8EAAFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wgAAWMB7wL/AWMB7wL/CAAB 235 | YwHvAv8BYwHvAv8EAAFjAe8C/wFjAe8C/wQAAWMB7wL/nAABYwHvAv8BYwHvAv8BMQFKAVIB/wgAAWMB 236 | 7wL/AWMB7wL/ATEBSgFSAf8BYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8IAAFjAe8C/wFjAe8C 237 | /wFjAe8C/wFjAe8C/wFjAe8C/wwAAWMB7wL/AWMB7wL/AWMB7wL/AWMB7wL/CAABYwHvAv8BYwHvAv8B 238 | YwHvAv8BYwHvAv8BYwHvAv8MAAFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C/wgAAWMB7wL/AWMB7wL/AWMB 239 | 7wL/AWMB7wL/AWMB7wL/CAABYwHvAv8BYwHvAv8BYwHvAv8BYwHvAv8IAAExAUoBUgH/ATEBSgFSAf8E 240 | AAFjAe8C/wFjAe8C/wFjAe8C/wFjAe8C//8A/wAGAAFjAe8C/wFjAe8C/wExAUoBUgH/BAABYwHvAv8B 241 | YwHvAv8BMQFKAVIB/+QAAWMB7wL/AWMB7wL/ATEBSgFSAf8BMQFKAVIB/wExAUoBUgH/AWMB7wL/AWMB 242 | 7wL/rAABYwHvAv8BYwHvAv8BMQFKAVIB/wgAAWMB7wL/AWMB7wL/ATEBSgFSAf//AP8AGgABYwHvAv8B 243 | YwHvAv8IAAFjAe8C/wFjAe8C/+wAAWMB7wL/AWMB7wL/AWMB7wL/AWMB7wL/AWMB7wL/sAABYwHvAv8B 244 | YwHvAv8MAAFjAe8C/wFjAe8C/wExAUoBUgH//wD/AP8A9wABYwHvAv8BYwHvAv//AP8A/wD/AP8A/wD/ 245 | AP8A/wD/AP8A/wD/AP8AKgABQgFNAT4HAAE+AwABKAQAAQECAAEgAwABAQEAAQEGAAEEFgAD/wEAGP8I 246 | ABj/CAAY/wgAGP8IABj/CAAY/wgAAecBggFzAT8E/wHnAYIBcwE/DP8IAAHHAQABYgE/BP8BxwEAAWIB 247 | Pwz/CAABxgEgAWIBPwT/AcYBIAFiAT8M/wgAAcYBIAFiAT8E/wHGASABYgE/DP8IAAHGASABAgE/BP8B 248 | xgEgAQIBPwz/CAABxgEgAQABfwT/AcYBIAEAAX8E/wH+AXkCyQHMARkB8wGfCAABxgFkAaAF/wHGAWQB 249 | oAX/AfwBcQKBAYgBIQHjAR8IAAGBB/8BgQf/AfwBMAOBAdEB5wE/CAABAwf/AQMH/wH4ASACgQGAAQEB 250 | 8wGfCAAQ/wH4AQACgQGAAQEB4wEfCAAQ/wH5AgABgAGBAYABIwEfCAAJ/wGfAT8F/wHxAQwBAQERAhAB 251 | IwEfCAAJ/wEeAT8F/wHxAYwBEgEyATgBMgFjAR8IAAHnAYcBBAX/AcEBAgEHAQwBzAETATEB4QHxAYwB 252 | TwP/AeMBHwgAAccBAgEABf8BgAEAAQIBAAGIASIBIwHAAfMBnAGPA/8B5wE/CAABxgEgAUAF/wEYARAB 253 | IAFAAYEB4gEHAfAC/wGfBf8IAAHGASABQAX/ARgBEAEgAUABgAECAQcB4Qj/CAABwgEgAUABPwT/ARgB 254 | EAEgAUABgAECAQcBwwj/CAABggEEAUABPwT/ARgBAgEEAQgBEAEgAUEBwAj/CAABgQEMAckBfwT/ARgB 255 | BgEOARgBOAFgAcMBIQj/CAABEQf/AQEF/wHGAT8I/wgAATMH/wGDBf8BzgE/CP8IAA7/Af4Bfwj/CAAY 256 | /wgAGP8IABj/HgAL 257 | 258 | 259 | 260 | 311, 17 261 | 262 | 263 | 439, 17 264 | 265 | 266 | 573, 17 267 | 268 | 269 | 699, 17 270 | 271 | 272 | 17, 54 273 | 274 | 275 | frmMain 276 | 277 | 278 | 279 | AAABAAIAEBAAAAAAAABoBQAAJgAAACAgAAAAAAAAqAgAAI4FAAAoAAAAEAAAACAAAAABAAgAAAAAAEAB 280 | AAAAAAAAAAAAAAABAAAAAAAAAAAAAIAAgACAAAAAgIAAAACAAAAAgIAAAACAAMDAwADA3MAA8MqmAICA 281 | gAD/AP8A/wAAAP//AAAA/wAAAP//AAAA/wD///8A8Pv/AKSgoADU8P8AseL/AI7U/wBrxv8ASLj/ACWq 282 | /wAAqv8AAJLcAAB6uQAAYpYAAEpzAAAyUADU4/8Ascf/AI6r/wBrj/8ASHP/ACVX/wAAVf8AAEncAAA9 283 | uQAAMZYAACVzAAAZUADU1P8AsbH/AI6O/wBra/8ASEj/ACUl/wAAAP8AAADcAAAAuQAAAJYAAABzAAAA 284 | UADj1P8Ax7H/AKuO/wCPa/8Ac0j/AFcl/wBVAP8ASQDcAD0AuQAxAJYAJQBzABkAUADw1P8A4rH/ANSO 285 | /wDGa/8AuEj/AKol/wCqAP8AkgDcAHoAuQBiAJYASgBzADIAUAD/1P8A/7H/AP+O/wD/a/8A/0j/AP8l 286 | /wD/AP8A3ADcALkAuQCWAJYAcwBzAFAAUAD/1PAA/7HiAP+O1AD/a8YA/0i4AP8lqgD/AKoA3ACSALkA 287 | egCWAGIAcwBKAFAAMgD/1OMA/7HHAP+OqwD/a48A/0hzAP8lVwD/AFUA3ABJALkAPQCWADEAcwAlAFAA 288 | GQD/1NQA/7GxAP+OjgD/a2sA/0hIAP8lJQD/AAAA3AAAALkAAACWAAAAcwAAAFAAAAD/49QA/8exAP+r 289 | jgD/j2sA/3NIAP9XJQD/VQAA3EkAALk9AACWMQAAcyUAAFAZAAD/8NQA/+KxAP/UjgD/xmsA/7hIAP+q 290 | JQD/qgAA3JIAALl6AACWYgAAc0oAAFAyAAD//9QA//+xAP//jgD//2sA//9IAP//JQD//wAA3NwAALm5 291 | AACWlgAAc3MAAFBQAADw/9QA4v+xANT/jgDG/2sAuP9IAKr/JQCq/wAAktwAAHq5AABilgAASnMAADJQ 292 | AADj/9QAx/+xAKv/jgCP/2sAc/9IAFf/JQBV/wAASdwAAD25AAAxlgAAJXMAABlQAADU/9QAsf+xAI7/ 293 | jgBr/2sASP9IACX/JQAA/wAAANwAAAC5AAAAlgAAAHMAAABQAADU/+MAsf/HAI7/qwBr/48ASP9zACX/ 294 | VwAA/1UAANxJAAC5PQAAljEAAHMlAABQGQDU//AAsf/iAI7/1ABr/8YASP+4ACX/qgAA/6oAANySAAC5 295 | egAAlmIAAHNKAABQMgDU//8Asf//AI7//wBr//8ASP//ACX//wAA//8AANzcAAC5uQAAlpYAAHNzAABQ 296 | UADy8vIA5ubmANra2gDOzs4AwsLCALa2tgCqqqoAnp6eAJKSkgCGhoYAenp6AG5ubgBiYmIAVlZWAEpK 297 | SgA+Pj4AMjIyACYmJgAaGhoADg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 298 | 4eHh4QAAAAAAAAAAAADh4eDj4+Dh4QAAAAAAAADh4eTl5OQP5OHhAAAAAAAA4eLj5+fn4+Xk4QAAAAAA 299 | 4eLj5+fiEujj5eHiAAAAAOHk5+Tk4Ojn6OPj4gAAAADg5Ofg4eHo6Ojj4uIAAAAA4OTn4+Lh6OPo4+Pi 300 | AAAAAADg5efi4ODo4+fgAAAAAAAA4OLj4+fn4efi4QAAAAAAAADg4uTl5efi4AAAAAAAAAAAAADg4ODg 301 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////D////AP///gB///wAP//8AD 302 | //+AAf//gAH//4AB//+AAf//wAP//8AD///gB///8A////w/////////KAAAACAAAABAAAAAAQAIAAAA 303 | AACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgAAAAICAAAAAgAAAAICAAAAAgADAwMAAwNzAAPDK 304 | pgCAgIAA/wD/AP8AAAD//wAAAP8AAAD//wAAAP8A////APD7/wCkoKAA1PD/ALHi/wCO1P8Aa8b/AEi4 305 | /wAlqv8AAKr/AACS3AAAerkAAGKWAABKcwAAMlAA1OP/ALHH/wCOq/8Aa4//AEhz/wAlV/8AAFX/AABJ 306 | 3AAAPbkAADGWAAAlcwAAGVAA1NT/ALGx/wCOjv8Aa2v/AEhI/wAlJf8AAAD/AAAA3AAAALkAAACWAAAA 307 | cwAAAFAA49T/AMex/wCrjv8Aj2v/AHNI/wBXJf8AVQD/AEkA3AA9ALkAMQCWACUAcwAZAFAA8NT/AOKx 308 | /wDUjv8Axmv/ALhI/wCqJf8AqgD/AJIA3AB6ALkAYgCWAEoAcwAyAFAA/9T/AP+x/wD/jv8A/2v/AP9I 309 | /wD/Jf8A/wD/ANwA3AC5ALkAlgCWAHMAcwBQAFAA/9TwAP+x4gD/jtQA/2vGAP9IuAD/JaoA/wCqANwA 310 | kgC5AHoAlgBiAHMASgBQADIA/9TjAP+xxwD/jqsA/2uPAP9IcwD/JVcA/wBVANwASQC5AD0AlgAxAHMA 311 | JQBQABkA/9TUAP+xsQD/jo4A/2trAP9ISAD/JSUA/wAAANwAAAC5AAAAlgAAAHMAAABQAAAA/+PUAP/H 312 | sQD/q44A/49rAP9zSAD/VyUA/1UAANxJAAC5PQAAljEAAHMlAABQGQAA//DUAP/isQD/1I4A/8ZrAP+4 313 | SAD/qiUA/6oAANySAAC5egAAlmIAAHNKAABQMgAA///UAP//sQD//44A//9rAP//SAD//yUA//8AANzc 314 | AAC5uQAAlpYAAHNzAABQUAAA8P/UAOL/sQDU/44Axv9rALj/SACq/yUAqv8AAJLcAAB6uQAAYpYAAEpz 315 | AAAyUAAA4//UAMf/sQCr/44Aj/9rAHP/SABX/yUAVf8AAEncAAA9uQAAMZYAACVzAAAZUAAA1P/UALH/ 316 | sQCO/44Aa/9rAEj/SAAl/yUAAP8AAADcAAAAuQAAAJYAAABzAAAAUAAA1P/jALH/xwCO/6sAa/+PAEj/ 317 | cwAl/1cAAP9VAADcSQAAuT0AAJYxAABzJQAAUBkA1P/wALH/4gCO/9QAa//GAEj/uAAl/6oAAP+qAADc 318 | kgAAuXoAAJZiAABzSgAAUDIA1P//ALH//wCO//8Aa///AEj//wAl//8AAP//AADc3AAAubkAAJaWAABz 319 | cwAAUFAA8vLyAObm5gDa2toAzs7OAMLCwgC2trYAqqqqAJ6engCSkpIAhoaGAHp6egBubm4AYmJiAFZW 320 | VgBKSkoAPj4+ADIyMgAmJiYAGhoaAA4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 321 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 322 | AAAAAAAAAAAAAAAAAAAA////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////i4uLi4uL///8AAAAA 323 | AAAAAAAAAAAAAAAAAAD//+Li4uLi4uLi4uLi4v//AAAAAAAAAAAAAAAAAAAA/+Li4uLi4uDg4ODi4uLi 324 | 4uL/AAAAAAAAAAAAAAAAAP/i4uLi4ODg5eXl5eDg4OLi4uL/AAAAAAAAAAAAAAD/4uLi4uDl5eXl5eXl 325 | 5eXl4OLi4uL/AAAAAAAAAAAA/+Li4uLg5eXl4+Pj4+Pl5eXl4OLi4uL/AAAAAAAAAAD/4uLi4OPj4+Pj 326 | 4+Pj4+Pl5eXl4OLi4v8AAAAAAAAA/+Li4uDj4+Pj4+jo6Ojo4+Pj5eXl4OLi4v8AAAAAAAD/4uLh4OPj 327 | 4+fn5+Hh4eHo6OPj5eXg4uLi/wAAAAAA/+Li4eEP4+Ln4eHh5+Hh4ejn6OPj5eXg4uLi/wAAAAD/4uLh 328 | 4Q/j4ufh4eHh4eHo5+fo4+Pl5eDi4uL/AAAAAP/i4eHhD+Ln4efn5+Hh4ejn6Ojo4+Pl4OLi4v8AAAAA 329 | /+Lh4eEP4ufh4eHh4eHh6Ofo6Ojj4+Xg4uLi/wAAAAD/4uHh4Q/i5+Hh4eHh4eHo5+jo6OPj5eDi4uL/ 330 | AAAAAP/i4eHhD+Ln4eHh4eHh4ejj6Ojo4+Pj4OLi4v8AAAAA/+Lh4eEP4+Ln4+Pj4eHh6OPj6OPj4+fh 331 | 4uLi/wAAAAAA/+Hh4eEP4ufh4eHh4eHh6OPo4+Pn4eHi4v8AAAAAAAD/4uHh4Q/j4ujo4eHh4eHo6OLj 332 | 4+fh4eLi/wAAAAAAAAD/4eHh4Q/j4uLo6Ojo6OLi4uPn4eHi4v8AAAAAAAAAAP/h4eHh4efi4uLi4uLi 333 | 4uPj5+Hh4eLi/wAAAAAAAAAAAP/h4eHh4efn4uPj4+Pj5+fh4eHi4v8AAAAAAAAAAAAAAP/h4eHh4eHn 334 | 5+fn5+fh4eHh4uL/AAAAAAAAAAAAAAAAAP/h4eHh4eHh4eHh4eHh4eLi/wAAAAAAAAAAAAAAAAAAAP// 335 | 4eHh4eHh4eHh4eLi//8AAAAAAAAAAAAAAAAAAAAAAAD////h4eHh4eH///8AAAAAAAAAAAAAAAAAAAAA 336 | AAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 337 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////gf///AA///AAD//gAAf/wA 338 | AD/4AAAf8AAAD/AAAA/gAAAH4AAAB8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPgAAAH4AAAB/AA 339 | AA/wAAAP+AAAH/wAAD/+AAB//wAA///AA///+B////////////8= 340 | 341 | 342 | --------------------------------------------------------------------------------