29 Commits

Author SHA1 Message Date
Steve Barnegren 99c06fee3c Update travis.yml 2020-10-01 21:16:13 +01:00
Steve Barnegren fb922da99b Update travis.yml 2020-10-01 21:12:22 +01:00
Steve Barnegren 89d089d475 Update travis.yml 2020-10-01 20:59:54 +01:00
Steve Barnegren 8f1e5f07a9 Version to 1.1.1 2020-10-01 20:58:05 +01:00
Steve Barnegren 7865d0cee7 Added spm support 2020-10-01 20:40:16 +01:00
Steve Barnegren 34a70295f2 Removed unused variables, apply game state when constructed from dictionary 2020-10-01 20:31:29 +01:00
Steve Barnegren ed6444a784 Update to recommended project settings 2020-10-01 20:25:05 +01:00
Steve Barnegren fa3580d2ce Added build status and contact badges to readme 2019-05-31 20:57:19 +01:00
Steve Barnegren 77a9e7f9e4 Merge pull request #11 from SteveBarnegren/feature/setup-travis
Feature/setup travis
2019-05-31 20:48:46 +01:00
Steve Barnegren d9b8ebace4 Travis only build master 2019-05-31 20:43:26 +01:00
Steve Barnegren 2ce751ad69 Update Travis configuration 2019-05-31 20:36:27 +01:00
Steve Barnegren 9b21f36f94 Update Travis configuration 2019-05-31 20:33:05 +01:00
Steve Barnegren 52ee0ed99a Update Travis configuration 2019-05-31 20:30:22 +01:00
Steve Barnegren efb982c1a7 Moved tests from example project to library project 2019-05-31 20:15:58 +01:00
Steve Barnegren e6c44034aa Setup Travis 2019-05-30 21:27:16 +01:00
Steve Barnegren 921f5c6899 Merge pull request #10 from SteveBarnegren/feature/swift-5
Feature/swift 5
2019-05-30 21:17:12 +01:00
Steve Barnegren f315a27db1 Update version to 1.1 2019-05-30 21:14:55 +01:00
Steve Barnegren f700ac2ec9 Fixed readme showing wrong badge information 2019-05-30 21:13:00 +01:00
Steve Barnegren 632765e72e Updated to recommended project settings 2019-05-30 21:09:04 +01:00
Steve Barnegren 17325af502 Updated to Swift 5 2019-05-30 21:06:52 +01:00
Steve Barnegren 6373f189cc Fixed project warnings 2019-05-30 20:57:14 +01:00
Steve Barnegren 8e4e478ea3 Merge pull request #4 from yixiang/patch-1
Fixed Board.printBoardState.
2018-04-09 12:01:27 +01:00
Sean Lu 7ebf83e7f4 Fixed Board.printBoardState.
King should be printed as G/g not K/k, since K/k conflicts with knights.
2018-04-06 23:06:14 -07:00
Steve Barnegren 612b3c7938 Updated readme 2018-01-20 18:32:02 +00:00
Steve Barnegren faf65a02fb Updated podspec 2018-01-20 18:12:18 +00:00
Steve Barnegren 0f3cd549f6 Fixed some warnings 2018-01-20 18:11:05 +00:00
Steve Barnegren ce3df6cdce Better handling of piece tags 2018-01-20 18:06:26 +00:00
Steve Barnegren 9ffafa0ee1 Make Game DictionaryRepresentable methods public 2018-01-20 17:19:36 +00:00
Steve Barnegren 6f80d184de Game convertible to dictionary for persistence 2018-01-13 15:59:24 +00:00
49 changed files with 1097 additions and 250 deletions
-1
View File
@@ -1 +0,0 @@
4.0
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
+6 -14
View File
@@ -1,14 +1,6 @@
# references:
# * http://www.objc.io/issue-6/travis-ci.html
# * https://github.com/supermarin/xcpretty#usage
osx_image: xcode7.3
language: objective-c
# cache: cocoapods
# podfile: Example/Podfile
# before_install:
# - gem install cocoapods # Since Travis is not always on latest version
# - pod install --project-directory=Example
script:
- set -o pipefail && xcodebuild test -workspace Example/SwiftChess.xcworkspace -scheme SwiftChess-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty
- pod lib lint
language: swift
osx_image: xcode12
xcode_project: Example/Example.xcodeproj
xcode_scheme: SwiftChessExample
xcode_sdk: iphonesimulator14.0
xcode_destination: platform=iOS Simulator,OS=14.0,name=iPhone 11 Pro Max
+22 -104
View File
@@ -7,15 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
09AE32551E03D71D00A149FE /* BoardRaterPawnProgressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09AE32541E03D71D00A149FE /* BoardRaterPawnProgressionTests.swift */; };
671989891DFFE0410053EA3D /* BoardRaterCenterOwnershipTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 671989881DFFE0410053EA3D /* BoardRaterCenterOwnershipTests.swift */; };
6719898D1DFFE0F40053EA3D /* BoardRaterBoardDominanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6719898C1DFFE0F40053EA3D /* BoardRaterBoardDominanceTests.swift */; };
671989911DFFE8650053EA3D /* BoardRaterCenterDominanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 671989901DFFE8650053EA3D /* BoardRaterCenterDominanceTests.swift */; };
673B95191E4CE5880086CA97 /* BoardRaterThreatenedPiecesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09A4C0281E013ECB000CFBF4 /* BoardRaterThreatenedPiecesTests.swift */; };
676902581E432380007C76D7 /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 676902571E432380007C76D7 /* PerformanceTests.swift */; };
676C911C1E478A3A00985A4F /* SwiftChess.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 67A9CA0D1DE64D6500510FB8 /* SwiftChess.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
676EF7C51E15AC1700E275B4 /* BoardRaterKingSurroundingPossession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 676EF7C41E15AC1700E275B4 /* BoardRaterKingSurroundingPossession.swift */; };
67A3EB161E3A926C00F6F01B /* BoardScenarios.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67A3EB121E3A826800F6F01B /* BoardScenarios.swift */; };
67A9CA341DE64DD600510FB8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; };
67A9CA351DE64DD800510FB8 /* MenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* MenuViewController.swift */; };
67A9CA361DE64DDA00510FB8 /* GameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67AD33A61D7C67BF002730DF /* GameViewController.swift */; };
@@ -25,20 +17,8 @@
67A9CA3A1DE64E0E00510FB8 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; };
67A9CA3C1DE64E2B00510FB8 /* SwiftChess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 67A9CA0D1DE64D6500510FB8 /* SwiftChess.framework */; };
67B73A9B1E15351900C19176 /* PromotionSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67B73A9A1E15351900C19176 /* PromotionSelectionViewController.swift */; };
67B73A9F1E154C1E00C19176 /* AIPlayerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67B73A9E1E154C1E00C19176 /* AIPlayerTests.swift */; };
67D54A5D1DE7682D00C12258 /* BoardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67D54A511DE7680E00C12258 /* BoardTests.swift */; };
67D54A5E1DE7683000C12258 /* GameTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67D54A521DE7680E00C12258 /* GameTests.swift */; };
67D54A5F1DE7683300C12258 /* PieceMovementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67D54A531DE7680E00C12258 /* PieceMovementTests.swift */; };
67D54A601DE7683800C12258 /* PlayerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67D54A541DE7680E00C12258 /* PlayerTests.swift */; };
67D54A611DE7683A00C12258 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67D54A551DE7680E00C12258 /* Tests.swift */; };
67D54A641DE976A900C12258 /* BoardRaterCountPiecesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67D54A631DE976A900C12258 /* BoardRaterCountPiecesTests.swift */; };
67D54A661DE986F700C12258 /* PieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67D54A651DE986F700C12258 /* PieceTests.swift */; };
67D54A681DE9A2DD00C12258 /* PieceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67D54A671DE9A2DD00C12258 /* PieceView.swift */; };
67F779261E1C32A400885B89 /* BoardRaterCenterFourOccupationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67F779251E1C32A400885B89 /* BoardRaterCenterFourOccupationTests.swift */; };
67F9DB6E1E1AC8DC00C7EC5A /* BoardRaterCheckMateOpportunityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67F9DB6D1E1AC8DC00C7EC5A /* BoardRaterCheckMateOpportunityTests.swift */; };
67F9DB751E1AD3BB00C7EC5A /* AIBehaviourTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67F9DB741E1AD3BB00C7EC5A /* AIBehaviourTests.swift */; };
67FD868D1E41099B0023335C /* BoardLocationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67FD868C1E41099B0023335C /* BoardLocationTests.swift */; };
67FD86911E4128F00023335C /* OpeningsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67FD86901E4128F00023335C /* OpeningsTests.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -87,8 +67,6 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
09A4C0281E013ECB000CFBF4 /* BoardRaterThreatenedPiecesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterThreatenedPiecesTests.swift; sourceTree = "<group>"; };
09AE32541E03D71D00A149FE /* BoardRaterPawnProgressionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterPawnProgressionTests.swift; sourceTree = "<group>"; };
607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
607FACD71AFB9204008FA782 /* MenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuViewController.swift; sourceTree = "<group>"; };
@@ -96,33 +74,14 @@
607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
671989881DFFE0410053EA3D /* BoardRaterCenterOwnershipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCenterOwnershipTests.swift; sourceTree = "<group>"; };
6719898C1DFFE0F40053EA3D /* BoardRaterBoardDominanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterBoardDominanceTests.swift; sourceTree = "<group>"; };
671989901DFFE8650053EA3D /* BoardRaterCenterDominanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCenterDominanceTests.swift; sourceTree = "<group>"; };
676902571E432380007C76D7 /* PerformanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PerformanceTests.swift; sourceTree = "<group>"; };
676EF7C41E15AC1700E275B4 /* BoardRaterKingSurroundingPossession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterKingSurroundingPossession.swift; sourceTree = "<group>"; };
67A3EB121E3A826800F6F01B /* BoardScenarios.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardScenarios.swift; sourceTree = "<group>"; };
67A9CA071DE64D6500510FB8 /* SwiftChess.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SwiftChess.xcodeproj; path = ../SwiftChess/SwiftChess.xcodeproj; sourceTree = "<group>"; };
67A9CA141DE64DAA00510FB8 /* SwiftChessExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftChessExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
67A9CA271DE64DAA00510FB8 /* SwiftChessExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftChessExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
67AD33A61D7C67BF002730DF /* GameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameViewController.swift; sourceTree = "<group>"; };
67AD33A81D7C67DF002730DF /* BoardView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardView.swift; sourceTree = "<group>"; };
67B73A9A1E15351900C19176 /* PromotionSelectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromotionSelectionViewController.swift; sourceTree = "<group>"; };
67B73A9E1E154C1E00C19176 /* AIPlayerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AIPlayerTests.swift; sourceTree = "<group>"; };
67D54A511DE7680E00C12258 /* BoardTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardTests.swift; sourceTree = "<group>"; };
67D54A521DE7680E00C12258 /* GameTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameTests.swift; sourceTree = "<group>"; };
67D54A531DE7680E00C12258 /* PieceMovementTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PieceMovementTests.swift; sourceTree = "<group>"; };
67D54A541DE7680E00C12258 /* PlayerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayerTests.swift; sourceTree = "<group>"; };
67D54A551DE7680E00C12258 /* Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = "<group>"; };
67D54A631DE976A900C12258 /* BoardRaterCountPiecesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCountPiecesTests.swift; sourceTree = "<group>"; };
67D54A651DE986F700C12258 /* PieceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PieceTests.swift; sourceTree = "<group>"; };
67D54A671DE9A2DD00C12258 /* PieceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PieceView.swift; sourceTree = "<group>"; };
67F7791F1E1B923B00885B89 /* AIConfigurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AIConfigurationTests.swift; sourceTree = "<group>"; };
67F779251E1C32A400885B89 /* BoardRaterCenterFourOccupationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCenterFourOccupationTests.swift; sourceTree = "<group>"; };
67F9DB6D1E1AC8DC00C7EC5A /* BoardRaterCheckMateOpportunityTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCheckMateOpportunityTests.swift; sourceTree = "<group>"; };
67F9DB741E1AD3BB00C7EC5A /* AIBehaviourTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AIBehaviourTests.swift; sourceTree = "<group>"; };
67FD868C1E41099B0023335C /* BoardLocationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardLocationTests.swift; sourceTree = "<group>"; };
67FD86901E4128F00023335C /* OpeningsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpeningsTests.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -198,18 +157,6 @@
isa = PBXGroup;
children = (
607FACE91AFB9204008FA782 /* Supporting Files */,
67D54A651DE986F700C12258 /* PieceTests.swift */,
67FD868C1E41099B0023335C /* BoardLocationTests.swift */,
67D54A511DE7680E00C12258 /* BoardTests.swift */,
67D54A521DE7680E00C12258 /* GameTests.swift */,
67D54A531DE7680E00C12258 /* PieceMovementTests.swift */,
67D54A541DE7680E00C12258 /* PlayerTests.swift */,
67B73A9E1E154C1E00C19176 /* AIPlayerTests.swift */,
67F7791F1E1B923B00885B89 /* AIConfigurationTests.swift */,
67F9DB741E1AD3BB00C7EC5A /* AIBehaviourTests.swift */,
676902571E432380007C76D7 /* PerformanceTests.swift */,
67FD86901E4128F00023335C /* OpeningsTests.swift */,
67D54A621DE9768200C12258 /* BoardRaters */,
67D54A551DE7680E00C12258 /* Tests.swift */,
);
path = Tests;
@@ -219,7 +166,6 @@
isa = PBXGroup;
children = (
607FACEA1AFB9204008FA782 /* Info.plist */,
67A3EB121E3A826800F6F01B /* BoardScenarios.swift */,
);
name = "Supporting Files";
sourceTree = "<group>";
@@ -233,22 +179,6 @@
name = Products;
sourceTree = "<group>";
};
67D54A621DE9768200C12258 /* BoardRaters */ = {
isa = PBXGroup;
children = (
67D54A631DE976A900C12258 /* BoardRaterCountPiecesTests.swift */,
671989881DFFE0410053EA3D /* BoardRaterCenterOwnershipTests.swift */,
6719898C1DFFE0F40053EA3D /* BoardRaterBoardDominanceTests.swift */,
671989901DFFE8650053EA3D /* BoardRaterCenterDominanceTests.swift */,
09A4C0281E013ECB000CFBF4 /* BoardRaterThreatenedPiecesTests.swift */,
09AE32541E03D71D00A149FE /* BoardRaterPawnProgressionTests.swift */,
676EF7C41E15AC1700E275B4 /* BoardRaterKingSurroundingPossession.swift */,
67F9DB6D1E1AC8DC00C7EC5A /* BoardRaterCheckMateOpportunityTests.swift */,
67F779251E1C32A400885B89 /* BoardRaterCenterFourOccupationTests.swift */,
);
name = BoardRaters;
sourceTree = "<group>";
};
67D54A691DE9A3C500C12258 /* Game */ = {
isa = PBXGroup;
children = (
@@ -309,18 +239,18 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0800;
LastUpgradeCheck = 0900;
LastUpgradeCheck = 1200;
ORGANIZATIONNAME = CocoaPods;
TargetAttributes = {
67A9CA131DE64DAA00510FB8 = {
CreatedOnToolsVersion = 8.0;
DevelopmentTeam = VAA3W4LPY2;
LastSwiftMigration = 0900;
LastSwiftMigration = 1020;
ProvisioningStyle = Automatic;
};
67A9CA261DE64DAA00510FB8 = {
CreatedOnToolsVersion = 8.0;
LastSwiftMigration = 0900;
LastSwiftMigration = 1020;
ProvisioningStyle = Automatic;
TestTargetID = 67A9CA131DE64DAA00510FB8;
};
@@ -328,7 +258,7 @@
};
buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "Example" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
@@ -437,27 +367,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
67D54A601DE7683800C12258 /* PlayerTests.swift in Sources */,
67FD86911E4128F00023335C /* OpeningsTests.swift in Sources */,
67D54A611DE7683A00C12258 /* Tests.swift in Sources */,
676EF7C51E15AC1700E275B4 /* BoardRaterKingSurroundingPossession.swift in Sources */,
67FD868D1E41099B0023335C /* BoardLocationTests.swift in Sources */,
67D54A5D1DE7682D00C12258 /* BoardTests.swift in Sources */,
67F9DB751E1AD3BB00C7EC5A /* AIBehaviourTests.swift in Sources */,
671989911DFFE8650053EA3D /* BoardRaterCenterDominanceTests.swift in Sources */,
6719898D1DFFE0F40053EA3D /* BoardRaterBoardDominanceTests.swift in Sources */,
67D54A5E1DE7683000C12258 /* GameTests.swift in Sources */,
673B95191E4CE5880086CA97 /* BoardRaterThreatenedPiecesTests.swift in Sources */,
67D54A661DE986F700C12258 /* PieceTests.swift in Sources */,
671989891DFFE0410053EA3D /* BoardRaterCenterOwnershipTests.swift in Sources */,
67B73A9F1E154C1E00C19176 /* AIPlayerTests.swift in Sources */,
676902581E432380007C76D7 /* PerformanceTests.swift in Sources */,
67D54A641DE976A900C12258 /* BoardRaterCountPiecesTests.swift in Sources */,
67A3EB161E3A926C00F6F01B /* BoardScenarios.swift in Sources */,
09AE32551E03D71D00A149FE /* BoardRaterPawnProgressionTests.swift in Sources */,
67D54A5F1DE7683300C12258 /* PieceMovementTests.swift in Sources */,
67F779261E1C32A400885B89 /* BoardRaterCenterFourOccupationTests.swift in Sources */,
67F9DB6E1E1AC8DC00C7EC5A /* BoardRaterCheckMateOpportunityTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -500,6 +410,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
@@ -508,14 +419,17 @@
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -541,7 +455,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.3;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -553,6 +467,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
@@ -561,14 +476,17 @@
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -587,7 +505,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.3;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@@ -606,12 +524,12 @@
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = VAA3W4LPY2;
INFOPLIST_FILE = SwiftChess/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = SteveBarnegren.SwiftChessExample;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
@@ -626,11 +544,11 @@
CLANG_WARN_SUSPICIOUS_MOVES = YES;
DEVELOPMENT_TEAM = VAA3W4LPY2;
INFOPLIST_FILE = SwiftChess/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = SteveBarnegren.SwiftChessExample;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
@@ -645,12 +563,12 @@
CLANG_WARN_SUSPICIOUS_MOVES = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
INFOPLIST_FILE = Tests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = SteveBarnegren.SwiftChessExampleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftChessExample.app/SwiftChessExample";
};
name = Debug;
@@ -664,11 +582,11 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_SUSPICIOUS_MOVES = YES;
INFOPLIST_FILE = Tests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = SteveBarnegren.SwiftChessExampleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftChessExample.app/SwiftChessExample";
};
name = Release;
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0900"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -40,8 +40,16 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "607FACCF1AFB9204008FA782"
BuildableName = "SwiftChess_Example.app"
BlueprintName = "SwiftChess_Example"
ReferencedContainer = "container:SwiftChess.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO">
@@ -54,23 +62,11 @@
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "607FACCF1AFB9204008FA782"
BuildableName = "SwiftChess_Example.app"
BlueprintName = "SwiftChess_Example"
ReferencedContainer = "container:SwiftChess.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
@@ -87,8 +83,6 @@
ReferencedContainer = "container:SwiftChess.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "67A9CA131DE64DAA00510FB8"
BuildableName = "SwiftChessExample.app"
BlueprintName = "SwiftChessExample"
ReferencedContainer = "container:Example.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "67A9CA131DE64DAA00510FB8"
BuildableName = "SwiftChessExample.app"
BlueprintName = "SwiftChessExample"
ReferencedContainer = "container:Example.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "67A9CA261DE64DAA00510FB8"
BuildableName = "SwiftChessExampleTests.xctest"
BlueprintName = "SwiftChessExampleTests"
ReferencedContainer = "container:Example.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "67A9C9E61DE64CD300510FB8"
BuildableName = "SwiftChessTests.xctest"
BlueprintName = "SwiftChessTests"
ReferencedContainer = "container:../SwiftChess/SwiftChess.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "67A9CA131DE64DAA00510FB8"
BuildableName = "SwiftChessExample.app"
BlueprintName = "SwiftChessExample"
ReferencedContainer = "container:Example.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "67A9CA131DE64DAA00510FB8"
BuildableName = "SwiftChessExample.app"
BlueprintName = "SwiftChessExample"
ReferencedContainer = "container:Example.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
+1 -1
View File
@@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
+3 -3
View File
@@ -103,7 +103,7 @@ class GameViewController: UIViewController {
func removePieceView(pieceView: PieceView) {
if let index = pieceViews.index(of: pieceView) {
if let index = pieceViews.firstIndex(of: pieceView) {
pieceViews.remove(at: index)
}
@@ -405,13 +405,13 @@ extension GameViewController: GameDelegate {
possibleTypes: possiblePromotions) {
self.promotionSelectionViewController?.view.removeFromSuperview()
self.promotionSelectionViewController?.removeFromParentViewController()
self.promotionSelectionViewController?.removeFromParent()
self.boardView.isUserInteractionEnabled = true
callback($0)
}
view.addSubview(viewController.view)
addChildViewController(viewController)
addChild(viewController)
promotionSelectionViewController = viewController
}
@@ -72,7 +72,7 @@ class PromotionSelectionViewController: UIViewController {
@objc func buttonPressed(sender: UIButton) {
let index = buttons.index(of: sender)!
let index = buttons.firstIndex(of: sender)!
print("Button pressed at index: \(index)")
let chosenType = possibleTypes![index]
-1
View File
@@ -1,6 +1,5 @@
import UIKit
import XCTest
import SwiftChess
class Tests: XCTestCase {
+15
View File
@@ -0,0 +1,15 @@
// swift-tools-version:5.1
import PackageDescription
let package = Package(name: "SwiftChess",
platforms: [.macOS(.v10_14),
.iOS(.v10),
.tvOS(.v10)],
products: [.library(name: "SwiftChess",
targets: ["SwiftChess"])],
targets: [.target(name: "SwiftChess",
path: "SwiftChess/Source"),
.testTarget(name: "SwiftChessTests",
dependencies: ["SwiftChess"],
path: "SwiftChess/SwiftChessTests")],
swiftLanguageVersions: [.v5])
+31 -7
View File
@@ -1,8 +1,10 @@
# SwiftChess
[![Version](https://img.shields.io/cocoapods/v/SBAutoLayout.svg?style=flat)](http://cocoapods.org/pods/SwiftChess)
[![License](https://img.shields.io/cocoapods/l/SBAutoLayout.svg?style=flat)](http://cocoapods.org/pods/SwiftChess)
[![Platform](https://img.shields.io/cocoapods/p/SBAutoLayout.svg?style=flat)](http://cocoapods.org/pods/SwiftChess)
[![Version](https://img.shields.io/cocoapods/v/SwiftChess.svg?style=flat)](http://cocoapods.org/pods/SwiftChess)
[![License](https://img.shields.io/cocoapods/l/SwiftChess.svg?style=flat)](http://cocoapods.org/pods/SwiftChess)
[![Platform](https://img.shields.io/cocoapods/p/SwiftChess.svg?style=flat)](http://cocoapods.org/pods/SwiftChess)
[![CI Status](https://api.travis-ci.org/SteveBarnegren/SwiftChess.svg?branch=master)](https://travis-ci.org/SteveBarnegren/SwiftChess)
[![Twitter](https://img.shields.io/badge/contact-@stevebarnegren-blue.svg?style=flat)](https://twitter.com/stevebarnegren)
SwiftChess is a chess engine written in Swift.
@@ -23,7 +25,7 @@ SwiftChess doesn't provide any UI, just all of the logic required to create a ch
## Example
The example application contains a complete implementation of swift chess.
The example application contains a complete implementation of **SwiftChess**.
Run `Example/Example.xcodeproj`
@@ -93,6 +95,27 @@ extension GameViewController: GameDelegate {
}
```
## Persistence
The entire state of a **SwiftChess** game can be converted to and initialised from a `Dictionary`.
Get a snapshot of the current state:
```
let dictionary: [String: Any] = game.dictionaryRepresentation
```
Initialise a game with a previous snapshot:
```
let game = Game(dictionary: dictionary)
```
The returned dictionary stores all the information required to create a 'save game' feature. The player colors, AI difficulty, piece positions etc.
You can serialize this to JSON, save it to disk, send it over the network etc.
## Other stuff
##### Make a castling move
@@ -107,15 +130,16 @@ if game.board.canColorCastle(color: .white, side: .kingSide) {
```
func promotedTypeForPawn(location: BoardLocation,
player: Human,
possiblePromotions: [Piece.PieceType],
callback: @escaping (Piece.PieceType) -> Void) {
player: Human,
possiblePromotions: [Piece.PieceType],
callback: @escaping (Piece.PieceType) -> Void) {
// Show UI for the user to select one of the possible promotion types
// then call the handler
// ...or some games just promote to a queen
callback(.queen)
}
```
## Author
+2 -1
View File
@@ -8,7 +8,7 @@
Pod::Spec.new do |s|
s.name = 'SwiftChess'
s.version = '0.3.0'
s.version = '1.1.1'
s.summary = 'Chess engine written in Swift'
# This description is used to generate tags and improve search results.
@@ -26,6 +26,7 @@ Chess engine written in Swift, support player vs player, and player vs AI games.
s.author = { 'Steve Barnegren' => 'steve.barnegren@gmail.com' }
s.source = { :git => 'https://github.com/SteveBarnegren/SwiftChess.git', :tag => s.version.to_s }
s.social_media_url = 'https://twitter.com/stevebarnegren'
s.swift_version = '5.0'
s.ios.deployment_target = '8.0'
+55 -10
View File
@@ -27,16 +27,16 @@ public struct AIConfiguration {
}
public let difficulty: Difficulty!
var suicideMultipler: ConfigurationValue!
var boardRaterCountPiecesWeighting: ConfigurationValue!
var boardRaterBoardDominanceWeighting: ConfigurationValue!
var boardRaterCenterOwnershipWeighting: ConfigurationValue!
var boardRaterCenterDominanceWeighting: ConfigurationValue!
var boardRaterThreatenedPiecesWeighting: ConfigurationValue!
var boardRaterPawnProgressionWeighting: ConfigurationValue!
var boardRaterKingSurroundingPossessionWeighting: ConfigurationValue!
var boardRaterCheckMateOpportunityWeighting: ConfigurationValue!
var boardRaterCenterFourOccupationWeighting: ConfigurationValue!
internal var suicideMultipler: ConfigurationValue
internal var boardRaterCountPiecesWeighting: ConfigurationValue
internal var boardRaterBoardDominanceWeighting: ConfigurationValue
internal var boardRaterCenterOwnershipWeighting: ConfigurationValue
internal var boardRaterCenterDominanceWeighting: ConfigurationValue
internal var boardRaterThreatenedPiecesWeighting: ConfigurationValue
internal var boardRaterPawnProgressionWeighting: ConfigurationValue
internal var boardRaterKingSurroundingPossessionWeighting: ConfigurationValue
internal var boardRaterCheckMateOpportunityWeighting: ConfigurationValue
internal var boardRaterCenterFourOccupationWeighting: ConfigurationValue
public init(difficulty: Difficulty) {
@@ -66,4 +66,49 @@ public struct AIConfiguration {
boardRaterCenterFourOccupationWeighting = makeValue(0.1, 0.3)
}
internal init() {
let zeroValue = ConfigurationValue(easyValue: 0, difficultValue: 0, multiplier: 0)
difficulty = .easy
suicideMultipler = zeroValue
boardRaterCountPiecesWeighting = zeroValue
boardRaterBoardDominanceWeighting = zeroValue
boardRaterCenterOwnershipWeighting = zeroValue
boardRaterCenterDominanceWeighting = zeroValue
boardRaterThreatenedPiecesWeighting = zeroValue
boardRaterPawnProgressionWeighting = zeroValue
boardRaterKingSurroundingPossessionWeighting = zeroValue
boardRaterCheckMateOpportunityWeighting = zeroValue
boardRaterCenterFourOccupationWeighting = zeroValue
}
}
extension AIConfiguration: DictionaryRepresentable {
struct Keys {
static let difficulty = "difficulty"
}
init?(dictionary: [String: Any]) {
if let raw = dictionary[Keys.difficulty] as? Int, let difficulty = Difficulty(rawValue: raw) {
self.init(difficulty: difficulty)
} else {
return nil
}
}
var dictionaryRepresentation: [String: Any] {
var dictionary = [String: Any]()
dictionary[Keys.difficulty] = difficulty.rawValue
return dictionary
}
}
extension AIConfiguration: Equatable {
public static func == (lhs: AIConfiguration, rhs: AIConfiguration) -> Bool {
return lhs.difficulty == rhs.difficulty
}
}
+36 -1
View File
@@ -9,7 +9,7 @@
// swiftlint:disable for_where
import Foundation
open class AIPlayer: Player {
public final class AIPlayer: Player {
let boardRaters: [BoardRater]!
public let configuration: AIConfiguration!
@@ -278,6 +278,41 @@ open class AIPlayer: Player {
}
}
extension AIPlayer: Equatable {
public static func == (lhs: AIPlayer, rhs: AIPlayer) -> Bool {
return lhs.color == rhs.color && lhs.configuration == rhs.configuration
}
}
extension AIPlayer: DictionaryRepresentable {
struct Keys {
static let color = "color"
static let configuration = "configuration"
}
convenience init?(dictionary: [String: Any]) {
guard
let colorRaw = dictionary[Keys.color] as? String,
let color = Color(rawValue: colorRaw),
let configurationDict = dictionary[Keys.configuration] as? [String: Any],
let configuration = AIConfiguration(dictionary: configurationDict) else {
return nil
}
self.init(color: color, configuration: configuration)
}
var dictionaryRepresentation: [String: Any] {
var dictionary = [String: Any]()
dictionary[Keys.color] = color.rawValue
dictionary[Keys.configuration] = configuration.dictionaryRepresentation
return dictionary
}
}
struct Move {
enum MoveType {
+1 -1
View File
@@ -129,7 +129,7 @@ public struct ASCIIBoard {
var index: Int?
#if swift(>=3.2)
if let idx = artString.index(of: character) {
if let idx = artString.firstIndex(of: character) {
index = artString.distance(from: artString.startIndex, to: idx)
}
#else
+70 -8
View File
@@ -30,12 +30,37 @@ public func == (lhs: Square, rhs: Square) -> Bool {
case (.none, .none):
return true
case (.some(let rp), .some(let lp)):
return rp == lp
return rp.isSameTypeAndColor(asPiece: lp)
default:
return false
}
}
extension Square: DictionaryRepresentable {
struct Keys {
static let piece = "piece"
}
init?(dictionary: [String: Any]) {
if let dict = dictionary[Keys.piece] as? [String: Any], let piece = Piece(dictionary: dict) {
self.piece = piece
}
}
var dictionaryRepresentation: [String: Any] {
var dictionary = [String: Any]()
if let piece = self.piece {
dictionary[Keys.piece] = piece.dictionaryRepresentation
}
return dictionary
}
}
// MARK: - ****** Board ******
public struct Board: Equatable {
@@ -46,6 +71,7 @@ public struct Board: Equatable {
}
public private(set) var squares = [Square]()
private var lastAssignedPieceTag = 0
// MARK: - Init
public init(state: InitialState) {
@@ -59,31 +85,35 @@ public struct Board: Equatable {
if state == .newGame {
setupForNewGame()
}
}
mutating func setupForNewGame() {
let pieces: [Piece.PieceType] = [.rook, .knight, .bishop, .queen, .king, .bishop, .knight, .rook]
func makePiece(type: Piece.PieceType, color: Color) -> Piece {
lastAssignedPieceTag += 1
return Piece(type: type, color: color, tag: lastAssignedPieceTag)
}
// Setup white bottom row
for i in 0...7 {
setPiece(Piece(type: pieces[i], color: .white), at: BoardLocation(index: i))
setPiece(makePiece(type: pieces[i], color: .white), at: BoardLocation(index: i))
}
// Setup white pawn row
for i in 8...15 {
setPiece(Piece(type: .pawn, color: .white), at: BoardLocation(index: i))
setPiece(makePiece(type: .pawn, color: .white), at: BoardLocation(index: i))
}
// Setup black bottom row
for i in 56...63 {
setPiece(Piece(type: pieces[i-56], color: .black), at: BoardLocation(index: i))
setPiece(makePiece(type: pieces[i-56], color: .black), at: BoardLocation(index: i))
}
// Setup black pawn row
for i in 48...55 {
setPiece(Piece(type: .pawn, color: .black), at: BoardLocation(index: i))
setPiece(makePiece(type: .pawn, color: .black), at: BoardLocation(index: i))
}
}
@@ -182,7 +212,7 @@ public struct Board: Equatable {
continue
}
if piece == Piece(type: .king, color: color) {
if piece.isSameTypeAndColor(asPiece: Piece(type: .king, color: color)) {
king = piece
break
}
@@ -622,7 +652,7 @@ public struct Board: Equatable {
case .queen:
character = piece.color == .white ? "Q" : "q"
case .king:
character = piece.color == .white ? "K" : "k"
character = piece.color == .white ? "G" : "g"
case .pawn:
character = piece.color == .white ? "P" : "p"
}
@@ -654,3 +684,35 @@ public struct Board: Equatable {
public func == (lhs: Board, rhs: Board) -> Bool {
return lhs.squares == rhs.squares
}
extension Board: DictionaryRepresentable {
struct Keys {
static let squares = "squares"
}
init?(dictionary: [String: Any]) {
guard let squaresDicts = dictionary[Keys.squares] as? [[String: Any]] else {
return nil
}
let squares = squaresDicts.compactMap { Square(dictionary: $0) }
if squares.count == 64 {
self.squares = squares
} else {
return nil
}
lastAssignedPieceTag = squares.compactMap { $0.piece }.map { $0.tag }.max() ?? 0
}
var dictionaryRepresentation: [String: Any] {
var dictionary = [String: Any]()
let squares = self.squares.map { $0.dictionaryRepresentation }
dictionary[Keys.squares] = squares
return dictionary
}
}
+27 -6
View File
@@ -82,12 +82,10 @@ public struct BoardLocation: Equatable {
func incremented(by stride: BoardStride) -> BoardLocation {
// TODO: Only call this in debug mode to increace performance!
if !canIncrement(by: stride) {
// swiftlint:disable line_length
print("WARNING! BoardLocation is being incremented by a stride that will result in wrapping! call canIncrementBy(stride: BoardStride) first")
// swiftlint:enable line_length
}
// swiftlint:disable line_length
assert(canIncrement(by: stride),
"BoardLocation is being incremented by a stride that will result in wrapping! call canIncrementBy(stride: BoardStride) first")
// swiftlint:enable line_length
return BoardLocation(x: x + stride.x,
y: y + stride.y)
@@ -138,3 +136,26 @@ public func == (lhs: BoardLocation, rhs: BoardLocation) -> Bool {
public func + (left: BoardLocation, right: BoardLocation) -> BoardLocation {
return BoardLocation(index: left.index + right.index)
}
extension BoardLocation: DictionaryRepresentable {
struct Keys {
static let index = "index"
}
init?(dictionary: [String: Any]) {
guard let index = dictionary[Keys.index] as? Int else {
return nil
}
self.index = index
}
var dictionaryRepresentation: [String: Any] {
var dictionary = [String: Any]()
dictionary[Keys.index] = index
return dictionary
}
}
@@ -0,0 +1,15 @@
//
// DictionaryRepresentable.swift
// SwiftChess
//
// Created by Steve Barnegren on 13/01/2018.
// Copyright © 2018 Steve Barnegren. All rights reserved.
//
import Foundation
protocol DictionaryRepresentable {
init?(dictionary: [String: Any])
var dictionaryRepresentation: [String: Any] {get}
}
+183 -8
View File
@@ -8,7 +8,7 @@
import Foundation
open class Game {
public final class Game {
// MARK: Types
public enum State: Equatable {
@@ -30,19 +30,19 @@ open class Game {
}
}
public enum GameType {
public enum GameType: Int {
case humanVsHuman
case humanVsComputer
case computerVsComputer
}
// MARK: Properties
open internal(set) var board: Board
open let whitePlayer: Player!
open let blackPlayer: Player!
open internal(set) var currentPlayer: Player!
open internal(set) var state = Game.State.inProgress
open weak var delegate: GameDelegate?
public internal(set) var board: Board
public let whitePlayer: Player!
public let blackPlayer: Player!
public internal(set) var currentPlayer: Player!
public internal(set) var state = Game.State.inProgress
public weak var delegate: GameDelegate?
public var gameType: GameType {
@@ -151,6 +151,181 @@ extension Game: PlayerDelegate {
}
// MARK: - DictionaryRepresentable
extension Game.State: DictionaryRepresentable {
struct Keys {
static let type = "type"
static let type_inProgress = "inProgress"
static let type_stalemate = "stalemate"
static let type_won = "won"
static let color = "color"
}
init?(dictionary: [String: Any]) {
guard let type = dictionary[Keys.type] as? String else {
return nil
}
switch type {
case Keys.type_inProgress:
self = .inProgress
case Keys.type_stalemate:
guard let raw = dictionary[Keys.color] as? String, let color = Color(rawValue: raw) else {
return nil
}
self = .staleMate(color: color)
case Keys.type_won:
guard let raw = dictionary[Keys.color] as? String, let color = Color(rawValue: raw) else {
return nil
}
self = .won(color: color)
default:
return nil
}
}
var dictionaryRepresentation: [String: Any] {
var dictionary = [String: Any]()
switch self {
case .inProgress:
dictionary[Keys.type] = Keys.type_inProgress
case .staleMate(let color):
dictionary[Keys.type] = Keys.type_stalemate
dictionary[Keys.color] = color.rawValue
case .won(let color):
dictionary[Keys.type] = Keys.type_won
dictionary[Keys.color] = color.rawValue
}
return dictionary
}
}
extension Game: DictionaryRepresentable {
struct Keys {
static let state = "state"
static let board = "board"
static let whitePlayerType = "whitePlayerType"
static let blackPlayerType = "blackPlayerType"
static let playerType_human = "playerType_human"
static let playerType_ai = "playerType_ai"
static let whitePlayer = "PlayerOne"
static let blackPlayer = "PlayerTwo"
static let currentPlayerColor = "currentPlayerColor"
}
public convenience init?(dictionary: [String: Any]) {
// State
guard let stateDict = dictionary[Keys.state] as? [String: Any],
let state = State(dictionary: stateDict),
let boardDict = dictionary[Keys.board] as? [String: Any],
let board = Board(dictionary: boardDict),
let currentPlayerColorRaw = dictionary[Keys.currentPlayerColor] as? String,
let currentPlayerColor = Color(rawValue: currentPlayerColorRaw)
else {
print("Unable to recreate game, missing values")
return nil
}
func makePlayer(type: String, dictionary: [String: Any]) -> Player? {
switch type {
case Keys.playerType_human:
return Human(dictionary: dictionary)
case Keys.playerType_ai:
return AIPlayer(dictionary: dictionary)
default:
return nil
}
}
// White Player
guard let whitePlayerType = dictionary[Keys.whitePlayerType] as? String,
let whitePlayerDict = dictionary[Keys.whitePlayer] as? [String: Any],
let whitePlayer = makePlayer(type: whitePlayerType, dictionary: whitePlayerDict) else {
return nil
}
// Black Player
guard let blackPlayerType = dictionary[Keys.blackPlayerType] as? String,
let blackPlayerDict = dictionary[Keys.blackPlayer] as? [String: Any],
let blackPlayer = makePlayer(type: blackPlayerType, dictionary: blackPlayerDict) else {
return nil
}
self.init(firstPlayer: whitePlayer,
secondPlayer: blackPlayer,
board: board,
colorToMove: currentPlayerColor)
self.state = state
}
public var dictionaryRepresentation: [String: Any] {
var dictionary = [String: Any]()
dictionary[Keys.state] = state.dictionaryRepresentation
dictionary[Keys.board] = board.dictionaryRepresentation
// White Player
if let whiteHuman = self.whitePlayer as? Human {
dictionary[Keys.whitePlayerType] = Keys.playerType_human
dictionary[Keys.whitePlayer] = whiteHuman.dictionaryRepresentation
} else if let whiteAI = self.whitePlayer as? AIPlayer {
dictionary[Keys.whitePlayerType] = Keys.playerType_ai
dictionary[Keys.whitePlayer] = whiteAI.dictionaryRepresentation
} else {
fatalError("Cannot determine white player type")
}
// Black Player
if let blackHuman = self.blackPlayer as? Human {
dictionary[Keys.blackPlayerType] = Keys.playerType_human
dictionary[Keys.blackPlayer] = blackHuman.dictionaryRepresentation
} else if let blackAI = self.blackPlayer as? AIPlayer {
dictionary[Keys.blackPlayerType] = Keys.playerType_ai
dictionary[Keys.blackPlayer] = blackAI.dictionaryRepresentation
} else {
fatalError("Cannot determine black player type")
}
dictionary[Keys.currentPlayerColor] = currentPlayer.color.rawValue
return dictionary
}
}
extension Game: Equatable {
public static func == (lhs: Game, rhs: Game) -> Bool {
func arePlayersEqual(p1: Player, p2: Player) -> Bool {
if let h1 = p1 as? Human, let h2 = p2 as? Human {
return h1 == h2
} else if let ai1 = p1 as? AIPlayer, let ai2 = p2 as? AIPlayer {
return ai1 == ai2
} else {
return false
}
}
if arePlayersEqual(p1: lhs.whitePlayer, p2: rhs.whitePlayer)
&& arePlayersEqual(p1: lhs.blackPlayer, p2: rhs.blackPlayer)
&& arePlayersEqual(p1: lhs.currentPlayer, p2: rhs.currentPlayer)
&& lhs.board == rhs.board
&& lhs.state == rhs.state {
return true
} else {
return false
}
}
}
// MARK: - GameDelegate
public protocol GameDelegate: class {
+30 -1
View File
@@ -10,7 +10,7 @@
import Foundation
open class Human: Player {
public final class Human: Player {
public init(color: Color) {
super.init()
@@ -94,3 +94,32 @@ open class Human: Player {
}
}
extension Human: Equatable {
public static func == (lhs: Human, rhs: Human) -> Bool {
return lhs.color == rhs.color
}
}
extension Human: DictionaryRepresentable {
struct Keys {
static let color = "color"
}
convenience init?(dictionary: [String: Any]) {
if let raw = dictionary[Keys.color] as? String, let color = Color(rawValue: raw) {
self.init(color: color)
} else {
return nil
}
}
var dictionaryRepresentation: [String: Any] {
var dictionary = [String: Any]()
dictionary[Keys.color] = color.rawValue
return dictionary
}
}
+2 -9
View File
@@ -62,18 +62,11 @@ class Opening {
}
// Filter for color
return moves.enumerated().flatMap { (index, value) in
return moves.enumerated().compactMap { (index, value) in
index % 2 == (color == .white ? 0 : 1) ? value : nil
}
}
/*
public func moveLocations(for color: Color) -> [(from fromLocation: BoardLocation, to toLocation: BoardLocation)] {
return moveLocations().enumerated().flatMap{ (index, value) in
index % 2 == (color == .white ? 0 : 1) ? value : nil
}
}
*/
func moveLocations() -> [(fromLocation: BoardLocation, toLocation: BoardLocation)] {
return moveGridPositions().map {
+83 -13
View File
@@ -27,8 +27,6 @@ public enum Color: String {
public struct Piece: Equatable {
static private var lastAssignedTag = 0
public enum PieceType: Int {
case pawn
case rook
@@ -71,17 +69,8 @@ public struct Piece: Equatable {
var value: Double {
return type.value
}
public init(type: PieceType, color: Color) {
self.type = type
self.color = color
// assign the next tag
Piece.lastAssignedTag += 1
self.tag = Piece.lastAssignedTag
}
public init(type: PieceType, color: Color, tag: Int) {
public init(type: PieceType, color: Color, tag: Int = 0) {
self.type = type
self.color = color
self.tag = tag
@@ -92,13 +81,94 @@ public struct Piece: Equatable {
let piece = Piece(type: newType, color: color, tag: tag)
return piece
}
func isSameTypeAndColor(asPiece other: Piece) -> Bool {
if self.type == other.type && self.color == other.color {
return true
} else {
return false
}
}
}
public func == (left: Piece, right: Piece) -> Bool {
if left.type == right.type && left.color == right.color {
if left.type == right.type
&& left.color == right.color
&& left.tag == right.tag
&& left .hasMoved == right.hasMoved
&& left.canBeTakenByEnPassant == right.canBeTakenByEnPassant
&& left.location == right.location {
return true
} else {
return false
}
}
extension Piece: DictionaryRepresentable {
private struct Keys {
static let type = "type"
static let color = "color"
static let tag = "tag"
static let hasMoved = "hasMoved"
static let canBeTakenByEnPassant = "canBeTakenByEnPassant"
static let location = "location"
}
init?(dictionary: [String: Any]) {
// Type
if let raw = dictionary[Keys.type] as? Int, let type = PieceType(rawValue: raw) {
self.type = type
} else {
return nil
}
// Color
if let raw = dictionary[Keys.color] as? String, let color = Color(rawValue: raw) {
self.color = color
} else {
return nil
}
// Tag
if let tag = dictionary[Keys.tag] as? Int {
self.tag = tag
}
// Has Moved
if let hasMoved = dictionary[Keys.hasMoved] as? Bool {
self.hasMoved = hasMoved
} else {
return nil
}
// Can be taken by en passent
if let canBeTakenByEnPassent = dictionary[Keys.canBeTakenByEnPassant] as? Bool {
self.canBeTakenByEnPassant = canBeTakenByEnPassent
} else {
return nil
}
// Location
if let dict = dictionary[Keys.location] as? [String: Any], let location = BoardLocation(dictionary: dict) {
self.location = location
} else {
return nil
}
}
var dictionaryRepresentation: [String: Any] {
var dictionary = [String: Any]()
dictionary[Keys.type] = type.rawValue
dictionary[Keys.color] = color.rawValue
if let tag = self.tag { dictionary[Keys.tag] = tag }
dictionary[Keys.hasMoved] = hasMoved
dictionary[Keys.canBeTakenByEnPassant] = canBeTakenByEnPassant
dictionary[Keys.location] = location.dictionaryRepresentation
return dictionary
}
}
+146 -14
View File
@@ -12,7 +12,31 @@
671989831DEB11900053EA3D /* BoardRaterCenterOwnership.swift in Sources */ = {isa = PBXBuildFile; fileRef = 671989821DEB11900053EA3D /* BoardRaterCenterOwnership.swift */; };
6719898B1DFFE0D80053EA3D /* BoardRaterBoardDominance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6719898A1DFFE0D80053EA3D /* BoardRaterBoardDominance.swift */; };
6719898F1DFFE7550053EA3D /* BoardRaterCenterDominance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6719898E1DFFE7550053EA3D /* BoardRaterCenterDominance.swift */; };
673596B922A1B43A003086FF /* AIPlayerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596AD22A1B43A003086FF /* AIPlayerTests.swift */; };
673596BA22A1B43A003086FF /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596AE22A1B43A003086FF /* PerformanceTests.swift */; };
673596BB22A1B43A003086FF /* AIBehaviourTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596AF22A1B43A003086FF /* AIBehaviourTests.swift */; };
673596BC22A1B43A003086FF /* GameTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596B022A1B43A003086FF /* GameTests.swift */; };
673596BD22A1B43A003086FF /* BoardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596B122A1B43A003086FF /* BoardTests.swift */; };
673596BE22A1B43A003086FF /* OpeningsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596B222A1B43A003086FF /* OpeningsTests.swift */; };
673596BF22A1B43A003086FF /* PieceMovementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596B322A1B43A003086FF /* PieceMovementTests.swift */; };
673596C022A1B43A003086FF /* BoardLocationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596B422A1B43A003086FF /* BoardLocationTests.swift */; };
673596C122A1B43A003086FF /* PlayerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596B522A1B43A003086FF /* PlayerTests.swift */; };
673596C222A1B43A003086FF /* PieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596B622A1B43A003086FF /* PieceTests.swift */; };
673596C322A1B43A003086FF /* AIConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596B722A1B43A003086FF /* AIConfigurationTests.swift */; };
673596C422A1B43A003086FF /* SquareTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596B822A1B43A003086FF /* SquareTests.swift */; };
673596C822A1B448003086FF /* DictionaryRepresentableExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596C622A1B448003086FF /* DictionaryRepresentableExtensions.swift */; };
673596C922A1B448003086FF /* BoardScenarios.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596C722A1B448003086FF /* BoardScenarios.swift */; };
673596D422A1B45A003086FF /* BoardRaterCountPiecesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596CB22A1B459003086FF /* BoardRaterCountPiecesTests.swift */; };
673596D522A1B45A003086FF /* BoardRaterCheckMateOpportunityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596CC22A1B459003086FF /* BoardRaterCheckMateOpportunityTests.swift */; };
673596D622A1B45A003086FF /* BoardRaterCenterDominanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596CD22A1B459003086FF /* BoardRaterCenterDominanceTests.swift */; };
673596D722A1B45A003086FF /* BoardRaterCenterOwnershipTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596CE22A1B459003086FF /* BoardRaterCenterOwnershipTests.swift */; };
673596D822A1B45A003086FF /* BoardRaterKingSurroundingPossession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596CF22A1B459003086FF /* BoardRaterKingSurroundingPossession.swift */; };
673596D922A1B45A003086FF /* BoardRaterCenterFourOccupationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596D022A1B459003086FF /* BoardRaterCenterFourOccupationTests.swift */; };
673596DA22A1B45A003086FF /* BoardRaterBoardDominanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596D122A1B45A003086FF /* BoardRaterBoardDominanceTests.swift */; };
673596DB22A1B45A003086FF /* BoardRaterThreatenedPiecesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596D222A1B45A003086FF /* BoardRaterThreatenedPiecesTests.swift */; };
673596DC22A1B45A003086FF /* BoardRaterPawnProgressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 673596D322A1B45A003086FF /* BoardRaterPawnProgressionTests.swift */; };
676EF7C31E15A8A500E275B4 /* BoardRaterKingSurroundingPossession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 676EF7C21E15A8A500E275B4 /* BoardRaterKingSurroundingPossession.swift */; };
677BE817200A2D78004B27DB /* DictionaryRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 677BE816200A2D78004B27DB /* DictionaryRepresentable.swift */; };
67A9C9E81DE64CD300510FB8 /* SwiftChess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 67A9C9DE1DE64CD200510FB8 /* SwiftChess.framework */; };
67A9C9EF1DE64CD300510FB8 /* SwiftChess.h in Headers */ = {isa = PBXBuildFile; fileRef = 67A9C9E11DE64CD200510FB8 /* SwiftChess.h */; settings = {ATTRIBUTES = (Public, ); }; };
67A9CA011DE64D2500510FB8 /* AIPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67A9C9FA1DE64D2500510FB8 /* AIPlayer.swift */; };
@@ -49,7 +73,31 @@
671989821DEB11900053EA3D /* BoardRaterCenterOwnership.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCenterOwnership.swift; sourceTree = "<group>"; };
6719898A1DFFE0D80053EA3D /* BoardRaterBoardDominance.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterBoardDominance.swift; sourceTree = "<group>"; };
6719898E1DFFE7550053EA3D /* BoardRaterCenterDominance.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCenterDominance.swift; sourceTree = "<group>"; };
673596AD22A1B43A003086FF /* AIPlayerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AIPlayerTests.swift; sourceTree = "<group>"; };
673596AE22A1B43A003086FF /* PerformanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PerformanceTests.swift; sourceTree = "<group>"; };
673596AF22A1B43A003086FF /* AIBehaviourTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AIBehaviourTests.swift; sourceTree = "<group>"; };
673596B022A1B43A003086FF /* GameTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameTests.swift; sourceTree = "<group>"; };
673596B122A1B43A003086FF /* BoardTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardTests.swift; sourceTree = "<group>"; };
673596B222A1B43A003086FF /* OpeningsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpeningsTests.swift; sourceTree = "<group>"; };
673596B322A1B43A003086FF /* PieceMovementTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PieceMovementTests.swift; sourceTree = "<group>"; };
673596B422A1B43A003086FF /* BoardLocationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardLocationTests.swift; sourceTree = "<group>"; };
673596B522A1B43A003086FF /* PlayerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayerTests.swift; sourceTree = "<group>"; };
673596B622A1B43A003086FF /* PieceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PieceTests.swift; sourceTree = "<group>"; };
673596B722A1B43A003086FF /* AIConfigurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AIConfigurationTests.swift; sourceTree = "<group>"; };
673596B822A1B43A003086FF /* SquareTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SquareTests.swift; sourceTree = "<group>"; };
673596C622A1B448003086FF /* DictionaryRepresentableExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DictionaryRepresentableExtensions.swift; sourceTree = "<group>"; };
673596C722A1B448003086FF /* BoardScenarios.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardScenarios.swift; sourceTree = "<group>"; };
673596CB22A1B459003086FF /* BoardRaterCountPiecesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCountPiecesTests.swift; sourceTree = "<group>"; };
673596CC22A1B459003086FF /* BoardRaterCheckMateOpportunityTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCheckMateOpportunityTests.swift; sourceTree = "<group>"; };
673596CD22A1B459003086FF /* BoardRaterCenterDominanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCenterDominanceTests.swift; sourceTree = "<group>"; };
673596CE22A1B459003086FF /* BoardRaterCenterOwnershipTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCenterOwnershipTests.swift; sourceTree = "<group>"; };
673596CF22A1B459003086FF /* BoardRaterKingSurroundingPossession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterKingSurroundingPossession.swift; sourceTree = "<group>"; };
673596D022A1B459003086FF /* BoardRaterCenterFourOccupationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterCenterFourOccupationTests.swift; sourceTree = "<group>"; };
673596D122A1B45A003086FF /* BoardRaterBoardDominanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterBoardDominanceTests.swift; sourceTree = "<group>"; };
673596D222A1B45A003086FF /* BoardRaterThreatenedPiecesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterThreatenedPiecesTests.swift; sourceTree = "<group>"; };
673596D322A1B45A003086FF /* BoardRaterPawnProgressionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterPawnProgressionTests.swift; sourceTree = "<group>"; };
676EF7C21E15A8A500E275B4 /* BoardRaterKingSurroundingPossession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardRaterKingSurroundingPossession.swift; sourceTree = "<group>"; };
677BE816200A2D78004B27DB /* DictionaryRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DictionaryRepresentable.swift; sourceTree = "<group>"; };
67A9C9DE1DE64CD200510FB8 /* SwiftChess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftChess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
67A9C9E11DE64CD200510FB8 /* SwiftChess.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftChess.h; sourceTree = "<group>"; };
67A9C9E21DE64CD200510FB8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -92,6 +140,39 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
673596C522A1B43E003086FF /* Supporting */ = {
isa = PBXGroup;
children = (
673596C722A1B448003086FF /* BoardScenarios.swift */,
673596C622A1B448003086FF /* DictionaryRepresentableExtensions.swift */,
);
path = Supporting;
sourceTree = "<group>";
};
673596CA22A1B44B003086FF /* Board Raters */ = {
isa = PBXGroup;
children = (
673596D122A1B45A003086FF /* BoardRaterBoardDominanceTests.swift */,
673596CD22A1B459003086FF /* BoardRaterCenterDominanceTests.swift */,
673596D022A1B459003086FF /* BoardRaterCenterFourOccupationTests.swift */,
673596CE22A1B459003086FF /* BoardRaterCenterOwnershipTests.swift */,
673596CC22A1B459003086FF /* BoardRaterCheckMateOpportunityTests.swift */,
673596CB22A1B459003086FF /* BoardRaterCountPiecesTests.swift */,
673596CF22A1B459003086FF /* BoardRaterKingSurroundingPossession.swift */,
673596D322A1B45A003086FF /* BoardRaterPawnProgressionTests.swift */,
673596D222A1B45A003086FF /* BoardRaterThreatenedPiecesTests.swift */,
);
path = "Board Raters";
sourceTree = "<group>";
};
677BE815200A2D54004B27DB /* Extensions */ = {
isa = PBXGroup;
children = (
677BE816200A2D78004B27DB /* DictionaryRepresentable.swift */,
);
path = Extensions;
sourceTree = "<group>";
};
67A9C9D41DE64CD200510FB8 = {
isa = PBXGroup;
children = (
@@ -123,6 +204,20 @@
67A9C9EB1DE64CD300510FB8 /* SwiftChessTests */ = {
isa = PBXGroup;
children = (
673596C522A1B43E003086FF /* Supporting */,
673596CA22A1B44B003086FF /* Board Raters */,
673596AF22A1B43A003086FF /* AIBehaviourTests.swift */,
673596B722A1B43A003086FF /* AIConfigurationTests.swift */,
673596AD22A1B43A003086FF /* AIPlayerTests.swift */,
673596B422A1B43A003086FF /* BoardLocationTests.swift */,
673596B122A1B43A003086FF /* BoardTests.swift */,
673596B022A1B43A003086FF /* GameTests.swift */,
673596B222A1B43A003086FF /* OpeningsTests.swift */,
673596AE22A1B43A003086FF /* PerformanceTests.swift */,
673596B322A1B43A003086FF /* PieceMovementTests.swift */,
673596B622A1B43A003086FF /* PieceTests.swift */,
673596B522A1B43A003086FF /* PlayerTests.swift */,
673596B822A1B43A003086FF /* SquareTests.swift */,
67A9C9EE1DE64CD300510FB8 /* Info.plist */,
);
path = SwiftChessTests;
@@ -131,6 +226,7 @@
67A9C9F81DE64D2500510FB8 /* Source */ = {
isa = PBXGroup;
children = (
677BE815200A2D54004B27DB /* Extensions */,
67F9DB791E2438EC00C7EC5A /* ASCIIBoard.swift */,
67FD86881E4105B80023335C /* BoardStride.swift */,
67FD868A1E4105D40023335C /* BoardLocation.swift */,
@@ -247,27 +343,28 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0800;
LastUpgradeCheck = 0900;
LastUpgradeCheck = 1200;
ORGANIZATIONNAME = "Steve Barnegren";
TargetAttributes = {
67A9C9DD1DE64CD200510FB8 = {
CreatedOnToolsVersion = 8.0;
LastSwiftMigration = 0900;
LastSwiftMigration = 1020;
ProvisioningStyle = Automatic;
};
67A9C9E61DE64CD300510FB8 = {
CreatedOnToolsVersion = 8.0;
LastSwiftMigration = 0900;
LastSwiftMigration = 1020;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = 67A9C9D81DE64CD200510FB8 /* Build configuration list for PBXProject "SwiftChess" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 67A9C9D41DE64CD200510FB8;
productRefGroup = 67A9C9DF1DE64CD200510FB8 /* Products */;
@@ -341,6 +438,7 @@
67F779241E1C326D00885B89 /* BoardRaterCenterFourOccupation.swift in Sources */,
67A9CA011DE64D2500510FB8 /* AIPlayer.swift in Sources */,
6719898F1DFFE7550053EA3D /* BoardRaterCenterDominance.swift in Sources */,
677BE817200A2D78004B27DB /* DictionaryRepresentable.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -348,6 +446,29 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
673596D622A1B45A003086FF /* BoardRaterCenterDominanceTests.swift in Sources */,
673596C422A1B43A003086FF /* SquareTests.swift in Sources */,
673596DB22A1B45A003086FF /* BoardRaterThreatenedPiecesTests.swift in Sources */,
673596C222A1B43A003086FF /* PieceTests.swift in Sources */,
673596BA22A1B43A003086FF /* PerformanceTests.swift in Sources */,
673596BF22A1B43A003086FF /* PieceMovementTests.swift in Sources */,
673596D822A1B45A003086FF /* BoardRaterKingSurroundingPossession.swift in Sources */,
673596BD22A1B43A003086FF /* BoardTests.swift in Sources */,
673596D922A1B45A003086FF /* BoardRaterCenterFourOccupationTests.swift in Sources */,
673596DC22A1B45A003086FF /* BoardRaterPawnProgressionTests.swift in Sources */,
673596BB22A1B43A003086FF /* AIBehaviourTests.swift in Sources */,
673596C822A1B448003086FF /* DictionaryRepresentableExtensions.swift in Sources */,
673596C122A1B43A003086FF /* PlayerTests.swift in Sources */,
673596B922A1B43A003086FF /* AIPlayerTests.swift in Sources */,
673596C322A1B43A003086FF /* AIConfigurationTests.swift in Sources */,
673596BE22A1B43A003086FF /* OpeningsTests.swift in Sources */,
673596D422A1B45A003086FF /* BoardRaterCountPiecesTests.swift in Sources */,
673596BC22A1B43A003086FF /* GameTests.swift in Sources */,
673596C922A1B448003086FF /* BoardScenarios.swift in Sources */,
673596C022A1B43A003086FF /* BoardLocationTests.swift in Sources */,
673596DA22A1B45A003086FF /* BoardRaterBoardDominanceTests.swift in Sources */,
673596D722A1B45A003086FF /* BoardRaterCenterOwnershipTests.swift in Sources */,
673596D522A1B45A003086FF /* BoardRaterCheckMateOpportunityTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -366,6 +487,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -375,6 +497,7 @@
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
@@ -382,8 +505,10 @@
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -410,7 +535,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -426,6 +551,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -435,6 +561,7 @@
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
@@ -442,8 +569,10 @@
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -464,7 +593,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@@ -485,12 +614,13 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = SwiftChess/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MARKETING_VERSION = 1.1.1;
PRODUCT_BUNDLE_IDENTIFIER = SteveBarnegren.SwiftChess;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
@@ -504,12 +634,13 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = SwiftChess/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MARKETING_VERSION = 1.1.1;
PRODUCT_BUNDLE_IDENTIFIER = SteveBarnegren.SwiftChess;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
};
name = Release;
};
@@ -517,12 +648,13 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_ENABLE_MODULES = YES;
INFOPLIST_FILE = SwiftChessTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = SteveBarnegren.SwiftChessTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_SWIFT3_OBJC_INFERENCE = On;
SWIFT_VERSION = 4.0;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
@@ -530,12 +662,12 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_ENABLE_MODULES = YES;
INFOPLIST_FILE = SwiftChessTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = SteveBarnegren.SwiftChessTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_SWIFT3_OBJC_INFERENCE = On;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
};
name = Release;
};
+1 -1
View File
@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
@@ -6,6 +6,8 @@
// Copyright © 2017 CocoaPods. All rights reserved.
//
//swiftlint:disable type_body_length
import XCTest
@testable import SwiftChess
@@ -35,12 +37,16 @@ class AIConfigurationTests: XCTestCase {
"R K B Q G B K R" )
var lowValueConfig = AIConfiguration()
lowValueConfig.boardRaterCountPiecesWeighting = 1
lowValueConfig.boardRaterCountPiecesWeighting = AIConfiguration.ConfigurationValue(easyValue: 1,
difficultValue: 1,
multiplier: 10)
let lowValueRater = BoardRaterCountPieces(configuration: lowValueConfig)
let lowValueRating = lowValueRater.ratingFor(board: board.board, color: .white)
var highValueConfig = AIConfiguration()
highValueConfig.boardRaterCountPiecesWeighting = 2
highValueConfig.boardRaterCountPiecesWeighting = AIConfiguration.ConfigurationValue(easyValue: 2,
difficultValue: 2,
multiplier: 10)
let highValueRater = BoardRaterCountPieces(configuration: highValueConfig)
let highValueRating = highValueRater.ratingFor(board: board.board, color: .white)
@@ -61,12 +67,16 @@ class AIConfigurationTests: XCTestCase {
"R K B Q G B K R" )
var lowValueConfig = AIConfiguration()
lowValueConfig.boardRaterBoardDominanceWeighting = 1
lowValueConfig.boardRaterBoardDominanceWeighting = AIConfiguration.ConfigurationValue(easyValue: 1,
difficultValue: 1,
multiplier: 10)
let lowValueRater = BoardRaterBoardDominance(configuration: lowValueConfig)
let lowValueRating = lowValueRater.ratingFor(board: board.board, color: .white)
var highValueConfig = AIConfiguration()
highValueConfig.boardRaterBoardDominanceWeighting = 2
highValueConfig.boardRaterBoardDominanceWeighting = AIConfiguration.ConfigurationValue(easyValue: 2,
difficultValue: 2,
multiplier: 10)
let highValueRater = BoardRaterBoardDominance(configuration: highValueConfig)
let highValueRating = highValueRater.ratingFor(board: board.board, color: .white)
@@ -87,12 +97,16 @@ class AIConfigurationTests: XCTestCase {
"R K B Q G B K R" )
var lowValueConfig = AIConfiguration()
lowValueConfig.boardRaterCenterOwnershipWeighting = 1
lowValueConfig.boardRaterCenterOwnershipWeighting = AIConfiguration.ConfigurationValue(easyValue: 1,
difficultValue: 1,
multiplier: 10)
let lowValueRater = BoardRaterCenterOwnership(configuration: lowValueConfig)
let lowValueRating = lowValueRater.ratingFor(board: board.board, color: .white)
var highValueConfig = AIConfiguration()
highValueConfig.boardRaterCenterOwnershipWeighting = 2
highValueConfig.boardRaterCenterOwnershipWeighting = AIConfiguration.ConfigurationValue(easyValue: 2,
difficultValue: 2,
multiplier: 10)
let highValueRater = BoardRaterCenterOwnership(configuration: highValueConfig)
let highValueRating = highValueRater.ratingFor(board: board.board, color: .white)
@@ -113,12 +127,16 @@ class AIConfigurationTests: XCTestCase {
"R K B Q G B K R" )
var lowValueConfig = AIConfiguration()
lowValueConfig.boardRaterCenterDominanceWeighting = 1
lowValueConfig.boardRaterCenterDominanceWeighting = AIConfiguration.ConfigurationValue(easyValue: 1,
difficultValue: 1,
multiplier: 10)
let lowValueRater = BoardRaterCenterDominance(configuration: lowValueConfig)
let lowValueRating = lowValueRater.ratingFor(board: board.board, color: .white)
var highValueConfig = AIConfiguration()
highValueConfig.boardRaterCenterDominanceWeighting = 2
highValueConfig.boardRaterCenterDominanceWeighting = AIConfiguration.ConfigurationValue(easyValue: 2,
difficultValue: 2,
multiplier: 10)
let highValueRater = BoardRaterCenterDominance(configuration: highValueConfig)
let highValueRating = highValueRater.ratingFor(board: board.board, color: .white)
@@ -140,19 +158,23 @@ class AIConfigurationTests: XCTestCase {
"- - - - G - - B" )
var lowValueConfig = AIConfiguration()
lowValueConfig.boardRaterThreatenedPiecesWeighting = 1
lowValueConfig.boardRaterThreatenedPiecesWeighting = AIConfiguration.ConfigurationValue(easyValue: 1,
difficultValue: 1,
multiplier: 10)
let lowValueRater = BoardRaterThreatenedPieces(configuration: lowValueConfig)
let lowValueRating = lowValueRater.ratingFor(board: board.board, color: .white)
var highValueConfig = AIConfiguration()
highValueConfig.boardRaterThreatenedPiecesWeighting = 2
highValueConfig.boardRaterThreatenedPiecesWeighting = AIConfiguration.ConfigurationValue(easyValue: 2,
difficultValue: 2,
multiplier: 10)
let highValueRater = BoardRaterThreatenedPieces(configuration: highValueConfig)
let highValueRating = highValueRater.ratingFor(board: board.board, color: .white)
XCTAssertGreaterThan(highValueRating, lowValueRating)
}
func testBoardRaterThreatenedPiecesOwnPiecesMultiplierAffectsRating() {
func testBoardRaterThreatenedPiecesOwnPiecesWeightingAffectsRating() {
// White and black rook are threatening each other, so advantage is neutral
let board = ASCIIBoard(pieces: "- - - - g - - -" +
@@ -165,12 +187,16 @@ class AIConfigurationTests: XCTestCase {
"- - - - G - - -" )
var lowValueConfig = AIConfiguration()
lowValueConfig.boardRaterThreatenedPiecesOwnPiecesMultiplier = 1
lowValueConfig.boardRaterThreatenedPiecesWeighting = AIConfiguration.ConfigurationValue(easyValue: 1,
difficultValue: 1,
multiplier: 10)
let lowValueRater = BoardRaterThreatenedPieces(configuration: lowValueConfig)
let lowValueRating = lowValueRater.ratingFor(board: board.board, color: .white)
var highValueConfig = AIConfiguration()
highValueConfig.boardRaterThreatenedPiecesOwnPiecesMultiplier = 2
highValueConfig.boardRaterThreatenedPiecesWeighting = AIConfiguration.ConfigurationValue(easyValue: 2,
difficultValue: 2,
multiplier: 10)
let highValueRater = BoardRaterThreatenedPieces(configuration: highValueConfig)
let highValueRating = highValueRater.ratingFor(board: board.board, color: .white)
@@ -192,12 +218,16 @@ class AIConfigurationTests: XCTestCase {
"- - - - G - - -" )
var lowValueConfig = AIConfiguration()
lowValueConfig.boardRaterPawnProgressionWeighting = 1
lowValueConfig.boardRaterPawnProgressionWeighting = AIConfiguration.ConfigurationValue(easyValue: 1,
difficultValue: 1,
multiplier: 10)
let lowValueRater = BoardRaterPawnProgression(configuration: lowValueConfig)
let lowValueRating = lowValueRater.ratingFor(board: board.board, color: .white)
var highValueConfig = AIConfiguration()
highValueConfig.boardRaterPawnProgressionWeighting = 2
highValueConfig.boardRaterPawnProgressionWeighting = AIConfiguration.ConfigurationValue(easyValue: 2,
difficultValue: 2,
multiplier: 10)
let highValueRater = BoardRaterPawnProgression(configuration: highValueConfig)
let highValueRating = highValueRater.ratingFor(board: board.board, color: .white)
@@ -218,12 +248,18 @@ class AIConfigurationTests: XCTestCase {
"- - - P G P - -" )
var lowValueConfig = AIConfiguration()
lowValueConfig.boardRaterKingSurroundingPossessionWeighting = 1
lowValueConfig.boardRaterKingSurroundingPossessionWeighting =
AIConfiguration.ConfigurationValue(easyValue: 1,
difficultValue: 1,
multiplier: 10)
let lowValueRater = BoardRaterKingSurroundingPossession(configuration: lowValueConfig)
let lowValueRating = lowValueRater.ratingFor(board: board.board, color: .white)
var highValueConfig = AIConfiguration()
highValueConfig.boardRaterKingSurroundingPossessionWeighting = 2
highValueConfig.boardRaterKingSurroundingPossessionWeighting =
AIConfiguration.ConfigurationValue(easyValue: 2,
difficultValue: 2,
multiplier: 10)
let highValueRater = BoardRaterKingSurroundingPossession(configuration: highValueConfig)
let highValueRating = highValueRater.ratingFor(board: board.board, color: .white)
@@ -245,12 +281,16 @@ class AIConfigurationTests: XCTestCase {
"R - - P G P - -" )
var lowValueConfig = AIConfiguration()
lowValueConfig.boardRaterCheckMateOpportunityWeighting = 1
lowValueConfig.boardRaterCheckMateOpportunityWeighting = AIConfiguration.ConfigurationValue(easyValue: 1,
difficultValue: 1,
multiplier: 1)
let lowValueRater = BoardRaterCheckMateOpportunity(configuration: lowValueConfig)
let lowValueRating = lowValueRater.ratingFor(board: board.board, color: .white)
var highValueConfig = AIConfiguration()
highValueConfig.boardRaterCheckMateOpportunityWeighting = 2
highValueConfig.boardRaterCheckMateOpportunityWeighting = AIConfiguration.ConfigurationValue(easyValue: 2,
difficultValue: 2,
multiplier: 1)
let highValueRater = BoardRaterCheckMateOpportunity(configuration: highValueConfig)
let highValueRating = highValueRater.ratingFor(board: board.board, color: .white)
@@ -272,15 +312,33 @@ class AIConfigurationTests: XCTestCase {
"- - - P G P - -" )
var lowValueConfig = AIConfiguration()
lowValueConfig.boardRaterCenterFourOccupationWeighting = 1
lowValueConfig.boardRaterCenterFourOccupationWeighting = AIConfiguration.ConfigurationValue(easyValue: 1,
difficultValue: 1,
multiplier: 1)
let lowValueRater = BoardRaterCenterFourOccupation(configuration: lowValueConfig)
let lowValueRating = lowValueRater.ratingFor(board: board.board, color: .white)
var highValueConfig = AIConfiguration()
highValueConfig.boardRaterCenterFourOccupationWeighting = 2
highValueConfig.boardRaterCenterFourOccupationWeighting = AIConfiguration.ConfigurationValue(easyValue: 2,
difficultValue: 2,
multiplier: 1)
let highValueRater = BoardRaterCenterFourOccupation(configuration: highValueConfig)
let highValueRating = highValueRater.ratingFor(board: board.board, color: .white)
XCTAssertGreaterThan(highValueRating, lowValueRating)
}
// MARK: - AIConfiguration Dictionary Representable
func testDictionaryRepresentable() {
let easy = AIConfiguration(difficulty: .easy)
XCTAssertEqual(easy, easy.toDictionaryAndBack)
let medium = AIConfiguration(difficulty: .medium)
XCTAssertEqual(medium, medium.toDictionaryAndBack)
let hard = AIConfiguration(difficulty: .hard)
XCTAssertEqual(hard, hard.toDictionaryAndBack)
}
}
@@ -183,4 +183,17 @@ class AIPlayerTests: XCTestCase {
XCTAssertFalse(player.canAIMovePiece(from: bishopLocation, to: testLocation))
}
// MARK: - Dictionary Representable
func testDictionaryRepresentable() {
let whiteEasy = AIPlayer(color: .white,
configuration: AIConfiguration(difficulty: .easy))
XCTAssertEqual(whiteEasy, whiteEasy.toDictionaryAndBack)
let blackHard = AIPlayer(color: .black,
configuration: AIConfiguration(difficulty: .hard))
XCTAssertEqual(blackHard, blackHard.toDictionaryAndBack)
}
}
@@ -182,5 +182,12 @@ class BoardLocationTests: XCTestCase {
XCTAssertFalse($0.isDarkSquare, "Expected \($0) to be light")
}
}
// MARK: - Dictionary Representable
func testDictionaryRepresentable() {
let location = BoardLocation(index: 14)
XCTAssertEqual(location, location.toDictionaryAndBack)
}
}
@@ -139,7 +139,7 @@ class BoardTests: XCTestCase {
return
}
XCTAssert(returnedPiece == piece, "Expected pieces to be the same")
XCTAssert(returnedPiece.isSameTypeAndColor(asPiece: piece), "Expected pieces to be the same")
}
@@ -171,7 +171,7 @@ class BoardTests: XCTestCase {
return
}
XCTAssert(returnedPiece == piece, "Expected pieces to be the same")
XCTAssert(returnedPiece.isSameTypeAndColor(asPiece: piece), "Expected pieces to be the same")
}
@@ -233,7 +233,7 @@ class BoardTests: XCTestCase {
func verifyPieceExistance(piece: Piece) {
let matchingPieces = pieces.filter {
return $0 == piece
return $0.isSameTypeAndColor(asPiece: piece)
}
XCTAssert(matchingPieces.count != 0,
@@ -277,8 +277,8 @@ class BoardTests: XCTestCase {
board.setPiece(whiteKing, at: BoardLocation(index: 0))
board.setPiece(blackKing, at: BoardLocation(index: 1))
XCTAssert(board.getKing(color: .white) == whiteKing, "Unable to find white king")
XCTAssert(board.getKing(color: .black) == blackKing, "Unable to find black king")
XCTAssert(board.getKing(color: .white).isSameTypeAndColor(asPiece: whiteKing), "Unable to find white king")
XCTAssert(board.getKing(color: .black).isSameTypeAndColor(asPiece: blackKing), "Unable to find black king")
}
@@ -1104,5 +1104,22 @@ class BoardTests: XCTestCase {
XCTAssertEqual(piece.location, location)
}
}
// MARK: - Dictionary Representable
func testDictionaryRepresentable() {
let asciiBoard = ASCIIBoard(pieces: "r - - - g - - r" +
"p p p p p p p p" +
"- - - - - - - -" +
"- K - - - b - -" +
"- - B - - - k -" +
"- - - - - - - -" +
"P P P P P P P P" +
"R - - - G - - R" )
let board = asciiBoard.board
XCTAssertEqual(board, board.toDictionaryAndBack)
}
}
@@ -107,4 +107,45 @@ class GameTests: XCTestCase {
XCTAssertTrue(game.state == Game.State.won(color: .black))
}
// MARK: - Game State Dictionary Representable
func testGameStateDictionaryRepresentable() {
let inProgress = Game.State.inProgress
XCTAssertEqual(inProgress, inProgress.toDictionaryAndBack)
let whiteStalemate = Game.State.staleMate(color: .white)
XCTAssertEqual(whiteStalemate, whiteStalemate.toDictionaryAndBack)
let blackStalemate = Game.State.staleMate(color: .black)
XCTAssertEqual(blackStalemate, blackStalemate.toDictionaryAndBack)
let whiteWon = Game.State.won(color: .white)
XCTAssertEqual(whiteWon, whiteWon.toDictionaryAndBack)
let blackWon = Game.State.won(color: .black)
XCTAssertEqual(blackWon, blackWon.toDictionaryAndBack)
}
// MARK: - Game Dictionary Representable
func testGameDictionaryRepresentable() {
do {
let whitePlayer = Human(color: .white)
let blackPlayer = Human(color: .black)
let board = Board(state: .newGame)
let game = Game(firstPlayer: whitePlayer, secondPlayer: blackPlayer, board: board, colorToMove: .white)
XCTAssertEqual(game, game.toDictionaryAndBack)
}
do {
let whitePlayer = Human(color: .white)
let blackPlayer = AIPlayer(color: .black, configuration: AIConfiguration(difficulty: .hard))
let board = Board(state: .newGame)
let game = Game(firstPlayer: whitePlayer, secondPlayer: blackPlayer, board: board, colorToMove: .black)
XCTAssertEqual(game, game.toDictionaryAndBack)
}
}
}
@@ -7,7 +7,7 @@
//
import XCTest
import SwiftChess
@testable import SwiftChess
class PieceTests: XCTestCase {
@@ -38,4 +38,23 @@ class PieceTests: XCTestCase {
}
}
// MARK: - DictionaryRepresentable
func testPieceDictionaryRepresentable() {
var piece1 = Piece(type: .pawn, color: .white)
piece1.tag = 0
piece1.hasMoved = false
piece1.canBeTakenByEnPassant = false
piece1.location = BoardLocation(index: 0)
XCTAssertEqual(piece1, piece1.toDictionaryAndBack)
var piece2 = Piece(type: .bishop, color: .black)
piece2.tag = 15
piece2.hasMoved = true
piece2.canBeTakenByEnPassant = true
piece2.location = BoardLocation(index: 15)
XCTAssertEqual(piece2, piece2.toDictionaryAndBack)
}
}
@@ -248,6 +248,14 @@ class PlayerTests: XCTestCase {
} catch let error {
XCTAssert(error as! Player.MoveError == .cannotMoveInToCheck)
}
}
}
// MARK: - Human dictionary Representable
func testHumanDictionaryRepresentable() {
let whiteHuman = Human(color: .white)
XCTAssertEqual(whiteHuman, whiteHuman.toDictionaryAndBack)
}
}
@@ -0,0 +1,24 @@
//
// SquareTests.swift
// SwiftChessExampleTests
//
// Created by Steve Barnegren on 13/01/2018.
// Copyright © 2018 CocoaPods. All rights reserved.
//
import XCTest
@testable import SwiftChess
class SquareTests: XCTestCase {
func testDictionaryRepresentable() {
let piece = Piece(type: .bishop, color: .black)
let squareWithPiece = Square(piece: piece)
XCTAssertEqual(squareWithPiece, squareWithPiece.toDictionaryAndBack)
let squareWithoutPiece = Square(piece: nil)
XCTAssertEqual(squareWithoutPiece, squareWithoutPiece.toDictionaryAndBack)
}
}
@@ -0,0 +1,19 @@
//
// DictionaryRepresentableExtensions.swift
// SwiftChessExampleTests
//
// Created by Steve Barnegren on 13/01/2018.
// Copyright © 2018 CocoaPods. All rights reserved.
//
import Foundation
@testable import SwiftChess
extension DictionaryRepresentable {
var toDictionaryAndBack: Self? {
let dictionary = self.dictionaryRepresentation
return Self(dictionary: dictionary)
}
}