-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: simplified Strategy API, GameConfig now serializable
BREAKING CHANGE: GameConfig.strategy is now the strategy name
- Loading branch information
Marvin Luchs
committed
Dec 30, 2017
1 parent
5b6b087
commit c5cad60
Showing
27 changed files
with
208 additions
and
208 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,11 @@ | ||
import { GameFn } from './game'; | ||
import { Player } from './state'; | ||
import { Strategy } from './strategy'; | ||
import { StrategyName } from './strategy'; | ||
export interface GameConfig { | ||
heapSize: number; | ||
minTokensToRemove: number; | ||
maxTokensToRemove: number; | ||
startingPlayer: Player; | ||
strategy: Strategy; | ||
strategy: StrategyName; | ||
} | ||
export declare function getStateFromConfig(): GameFn<GameConfig>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
import { StrategyFactory } from '../strategy'; | ||
export declare const alwaysMinStrategy: StrategyFactory; | ||
import { Strategy } from '../strategy'; | ||
export declare const alwaysMinStrategy: Strategy; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,5 @@ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.alwaysMinStrategy = () => ({ | ||
name: 'alwaysMinStrategy', | ||
getNextTurn({ minTokensAllowedToRemove }) { | ||
return minTokensAllowedToRemove; | ||
} | ||
}); | ||
exports.alwaysMinStrategy = ({ minTokensAllowedToRemove }) => { | ||
return minTokensAllowedToRemove; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
import { StrategyFactory } from '../strategy'; | ||
export declare const mimicHumanStrategy: StrategyFactory; | ||
import { Strategy } from '../strategy'; | ||
export declare const mimicHumanStrategy: Strategy; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,9 @@ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const lodash_1 = require("lodash"); | ||
exports.mimicHumanStrategy = () => ({ | ||
name: 'mimicHumanStrategy', | ||
getNextTurn({ turns, minTokensAllowedToRemove, maxTokensAllowedToRemove }) { | ||
if (lodash_1.isEmpty(turns)) { | ||
return minTokensAllowedToRemove; | ||
} | ||
return Math.min(lodash_1.last(turns).tokensRemoved, maxTokensAllowedToRemove); | ||
exports.mimicHumanStrategy = ({ turns, minTokensAllowedToRemove, maxTokensAllowedToRemove }) => { | ||
if (lodash_1.isEmpty(turns)) { | ||
return minTokensAllowedToRemove; | ||
} | ||
}); | ||
return Math.min(lodash_1.last(turns).tokensRemoved, maxTokensAllowedToRemove); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
import { StrategyFactory } from '../strategy'; | ||
export declare const randomStrategy: StrategyFactory; | ||
import { Strategy } from '../strategy'; | ||
export declare const randomStrategy: Strategy; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,6 @@ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const lodash_1 = require("lodash"); | ||
exports.randomStrategy = () => ({ | ||
name: 'randomStrategy', | ||
getNextTurn({ minTokensAllowedToRemove, maxTokensAllowedToRemove }) { | ||
return lodash_1.random(minTokensAllowedToRemove, maxTokensAllowedToRemove); | ||
} | ||
}); | ||
exports.randomStrategy = ({ minTokensAllowedToRemove, maxTokensAllowedToRemove }) => { | ||
return lodash_1.random(minTokensAllowedToRemove, maxTokensAllowedToRemove); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
import { StrategyFactory } from '../strategy'; | ||
export declare const remainderStrategy: StrategyFactory; | ||
import { Strategy } from '../strategy'; | ||
export declare const remainderStrategy: Strategy; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,22 @@ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.remainderStrategy = () => ({ | ||
name: 'remainderStrategy', | ||
getNextTurn({ heapSize, minTokensAllowedToRemove, maxTokensAllowedToRemove }) { | ||
let tokensToRemove = 0; | ||
// build groups of (min + maxTokensToRemove) and determine the number | ||
// of remaining tokens | ||
const remainder = heapSize % (minTokensAllowedToRemove + maxTokensAllowedToRemove); | ||
// to reduce the number of remaining tokens to one, remove all of the remaining | ||
// tokens but the minimum allowed number of tokens to remove | ||
if (remainder > 0) { | ||
tokensToRemove = remainder - minTokensAllowedToRemove; | ||
} | ||
// in case there are no remaining tokens, remove enough tokens to leave | ||
// one remaining token besides the groups of (min + maxTokensToRemove) | ||
if (remainder === 0) { | ||
tokensToRemove = maxTokensAllowedToRemove; | ||
} | ||
// when the current heap size already consists of groups of (min + maxTokensToRemove) | ||
// and minTokensToRemove additional remaining tokens, the amount of tokens to remove | ||
// would be 0; in this case remove the minimum allowed number of tokens | ||
return Math.max(tokensToRemove, minTokensAllowedToRemove); | ||
exports.remainderStrategy = ({ heapSize, minTokensAllowedToRemove, maxTokensAllowedToRemove }) => { | ||
let tokensToRemove = 0; | ||
// build groups of (min + maxTokensToRemove) and determine the number | ||
// of remaining tokens | ||
const remainder = heapSize % (minTokensAllowedToRemove + maxTokensAllowedToRemove); | ||
// to reduce the number of remaining tokens to one, remove all of the remaining | ||
// tokens but the minimum allowed number of tokens to remove | ||
if (remainder > 0) { | ||
tokensToRemove = remainder - minTokensAllowedToRemove; | ||
} | ||
}); | ||
// in case there are no remaining tokens, remove enough tokens to leave | ||
// one remaining token besides the groups of (min + maxTokensToRemove) | ||
if (remainder === 0) { | ||
tokensToRemove = maxTokensAllowedToRemove; | ||
} | ||
// when the current heap size already consists of groups of (min + maxTokensToRemove) | ||
// and minTokensToRemove additional remaining tokens, the amount of tokens to remove | ||
// would be 0; in this case remove the minimum allowed number of tokens | ||
return Math.max(tokensToRemove, minTokensAllowedToRemove); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,5 @@ | ||
import { StrategyFactory } from '../strategy'; | ||
import { Strategy } from '../strategy'; | ||
|
||
export const alwaysMinStrategy: StrategyFactory = () => ({ | ||
name: 'alwaysMinStrategy', | ||
getNextTurn({ minTokensAllowedToRemove }): number { | ||
return minTokensAllowedToRemove; | ||
} | ||
}); | ||
export const alwaysMinStrategy: Strategy = ({ minTokensAllowedToRemove }): number => { | ||
return minTokensAllowedToRemove; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,13 @@ | ||
import { isEmpty, last } from 'lodash'; | ||
import { StrategyFactory } from '../strategy'; | ||
import { Strategy } from '../strategy'; | ||
|
||
export const mimicHumanStrategy: StrategyFactory = () => ({ | ||
name: 'mimicHumanStrategy', | ||
getNextTurn({ turns, minTokensAllowedToRemove, maxTokensAllowedToRemove }): number { | ||
if (isEmpty(turns)) { | ||
return minTokensAllowedToRemove; | ||
} | ||
|
||
return Math.min( | ||
last(turns)!.tokensRemoved, | ||
maxTokensAllowedToRemove | ||
); | ||
export const mimicHumanStrategy: Strategy = ({ turns, minTokensAllowedToRemove, maxTokensAllowedToRemove }): number => { | ||
if (isEmpty(turns)) { | ||
return minTokensAllowedToRemove; | ||
} | ||
}); | ||
|
||
return Math.min( | ||
last(turns)!.tokensRemoved, | ||
maxTokensAllowedToRemove | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,9 @@ | ||
import { random } from 'lodash'; | ||
import { StrategyFactory } from '../strategy'; | ||
import { Strategy } from '../strategy'; | ||
|
||
export const randomStrategy: StrategyFactory = () => ({ | ||
name: 'randomStrategy', | ||
getNextTurn({ minTokensAllowedToRemove, maxTokensAllowedToRemove }): number { | ||
return random( | ||
minTokensAllowedToRemove, | ||
maxTokensAllowedToRemove | ||
); | ||
} | ||
}); | ||
export const randomStrategy: Strategy = ({ minTokensAllowedToRemove, maxTokensAllowedToRemove }): number => { | ||
return random( | ||
minTokensAllowedToRemove, | ||
maxTokensAllowedToRemove | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,26 @@ | ||
import { StrategyFactory } from '../strategy'; | ||
import { Strategy } from '../strategy'; | ||
|
||
export const remainderStrategy: StrategyFactory = () => ({ | ||
name: 'remainderStrategy', | ||
getNextTurn({ heapSize, minTokensAllowedToRemove, maxTokensAllowedToRemove }): number { | ||
let tokensToRemove = 0; | ||
export const remainderStrategy: Strategy = ({ heapSize, minTokensAllowedToRemove, maxTokensAllowedToRemove }): number => { | ||
let tokensToRemove = 0; | ||
|
||
// build groups of (min + maxTokensToRemove) and determine the number | ||
// of remaining tokens | ||
const remainder = heapSize % (minTokensAllowedToRemove + maxTokensAllowedToRemove); | ||
// build groups of (min + maxTokensToRemove) and determine the number | ||
// of remaining tokens | ||
const remainder = heapSize % (minTokensAllowedToRemove + maxTokensAllowedToRemove); | ||
|
||
// to reduce the number of remaining tokens to one, remove all of the remaining | ||
// tokens but the minimum allowed number of tokens to remove | ||
if (remainder > 0) { | ||
tokensToRemove = remainder - minTokensAllowedToRemove; | ||
} | ||
|
||
// in case there are no remaining tokens, remove enough tokens to leave | ||
// one remaining token besides the groups of (min + maxTokensToRemove) | ||
if (remainder === 0) { | ||
tokensToRemove = maxTokensAllowedToRemove; | ||
} | ||
// to reduce the number of remaining tokens to one, remove all of the remaining | ||
// tokens but the minimum allowed number of tokens to remove | ||
if (remainder > 0) { | ||
tokensToRemove = remainder - minTokensAllowedToRemove; | ||
} | ||
|
||
// when the current heap size already consists of groups of (min + maxTokensToRemove) | ||
// and minTokensToRemove additional remaining tokens, the amount of tokens to remove | ||
// would be 0; in this case remove the minimum allowed number of tokens | ||
return Math.max(tokensToRemove, minTokensAllowedToRemove); | ||
// in case there are no remaining tokens, remove enough tokens to leave | ||
// one remaining token besides the groups of (min + maxTokensToRemove) | ||
if (remainder === 0) { | ||
tokensToRemove = maxTokensAllowedToRemove; | ||
} | ||
}); | ||
|
||
// when the current heap size already consists of groups of (min + maxTokensToRemove) | ||
// and minTokensToRemove additional remaining tokens, the amount of tokens to remove | ||
// would be 0; in this case remove the minimum allowed number of tokens | ||
return Math.max(tokensToRemove, minTokensAllowedToRemove); | ||
}; |
Oops, something went wrong.