Automate AI plays
This commit is contained in:
parent
ef4506b55e
commit
a014805cbf
4 changed files with 56 additions and 36 deletions
|
@ -151,4 +151,8 @@ impl GameWasm {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_current_player(&self) -> String {
|
||||||
|
self.0.current_player_name()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -37,6 +37,8 @@ export function Game(props: {
|
||||||
return props.wasm.get_board_cell_types();
|
return props.wasm.get_board_cell_types();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const [confirmedScorePoints, setConfirmedScorePoints] = useState<number>(-1);
|
const [confirmedScorePoints, setConfirmedScorePoints] = useState<number>(-1);
|
||||||
|
|
||||||
function movePlayableLetters(playerLetters: PlayableLetterData[], update: TileDispatchAction) {
|
function movePlayableLetters(playerLetters: PlayableLetterData[], update: TileDispatchAction) {
|
||||||
|
@ -85,36 +87,6 @@ export function Game(props: {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const [playerLetters, trayDispatch] = useReducer(movePlayableLetters, []);
|
|
||||||
const [logInfo, logDispatch] = useReducer(addLogInfo, []);
|
|
||||||
|
|
||||||
const [turnCount, setTurnCount] = useState<number>(1);
|
|
||||||
const playerAndScores: PlayerAndScore[] = useMemo(() => {
|
|
||||||
return props.wasm.get_scores();
|
|
||||||
}, [turnCount]);
|
|
||||||
const boardLetters: LetterData[] = useMemo(() => {
|
|
||||||
return props.wasm.get_board_letters();
|
|
||||||
}, [turnCount]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
logDispatch(<h4>Turn {turnCount}</h4>);
|
|
||||||
setConfirmedScorePoints(-1);
|
|
||||||
trayDispatch({action: TileDispatchActionType.RETRIEVE});
|
|
||||||
|
|
||||||
}, [turnCount]);
|
|
||||||
|
|
||||||
const logDivRef = useRef(null);
|
|
||||||
|
|
||||||
const [isTileExchangeOpen, setIsTileExchangeOpen] = useState<boolean>(false);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// Effect is to keep the log window scrolled down
|
|
||||||
if (logDivRef.current != null) {
|
|
||||||
logDivRef.current.scrollTo(0, logDivRef.current.scrollHeight); // scroll down
|
|
||||||
}
|
|
||||||
}, [logInfo])
|
|
||||||
|
|
||||||
function exchangeFunction(selectedArray: Array<boolean>) {
|
function exchangeFunction(selectedArray: Array<boolean>) {
|
||||||
|
|
||||||
const result: MyResult<TurnAction | string> = props.wasm.exchange_tiles(selectedArray);
|
const result: MyResult<TurnAction | string> = props.wasm.exchange_tiles(selectedArray);
|
||||||
|
@ -135,6 +107,50 @@ export function Game(props: {
|
||||||
logDispatch(<div><em>{word} was added to dictionary.</em></div>);
|
logDispatch(<div><em>{word} was added to dictionary.</em></div>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function runAI() {
|
||||||
|
const result: TurnAdvanceResult = props.wasm.advance_turn();
|
||||||
|
console.info({result});
|
||||||
|
setTurnCount(turnCount + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const [playerLetters, trayDispatch] = useReducer(movePlayableLetters, []);
|
||||||
|
const [logInfo, logDispatch] = useReducer(addLogInfo, []);
|
||||||
|
|
||||||
|
const [turnCount, setTurnCount] = useState<number>(1);
|
||||||
|
const playerAndScores: PlayerAndScore[] = useMemo(() => {
|
||||||
|
return props.wasm.get_scores();
|
||||||
|
}, [turnCount]);
|
||||||
|
const boardLetters: LetterData[] = useMemo(() => {
|
||||||
|
return props.wasm.get_board_letters();
|
||||||
|
}, [turnCount]);
|
||||||
|
const playerTurnName = useMemo(() => {
|
||||||
|
return props.wasm.get_current_player();
|
||||||
|
}, [turnCount]);
|
||||||
|
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
logDispatch(<h4>Turn {turnCount}</h4>);
|
||||||
|
logDispatch(<div>{playerTurnName}'s turn</div>)
|
||||||
|
setConfirmedScorePoints(-1);
|
||||||
|
trayDispatch({action: TileDispatchActionType.RETRIEVE});
|
||||||
|
if(playerTurnName != props.settings.playerName) {
|
||||||
|
runAI();
|
||||||
|
}
|
||||||
|
|
||||||
|
}, [turnCount]);
|
||||||
|
|
||||||
|
const logDivRef = useRef(null);
|
||||||
|
|
||||||
|
const [isTileExchangeOpen, setIsTileExchangeOpen] = useState<boolean>(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// Effect is to keep the log window scrolled down
|
||||||
|
if (logDivRef.current != null) {
|
||||||
|
logDivRef.current.scrollTo(0, logDivRef.current.scrollHeight); // scroll down
|
||||||
|
}
|
||||||
|
}, [logInfo])
|
||||||
|
|
||||||
|
|
||||||
return <>
|
return <>
|
||||||
<TileExchangeModal
|
<TileExchangeModal
|
||||||
|
@ -222,11 +238,6 @@ export function Game(props: {
|
||||||
logDispatch(<div><em>Player skipped their turn</em></div>);
|
logDispatch(<div><em>Player skipped their turn</em></div>);
|
||||||
setTurnCount(turnCount + 1);
|
setTurnCount(turnCount + 1);
|
||||||
}}>Skip Turn</button>
|
}}>Skip Turn</button>
|
||||||
<button onClick={() => {
|
|
||||||
const result: TurnAdvanceResult = props.wasm.advance_turn();
|
|
||||||
console.info({result});
|
|
||||||
setTurnCount(turnCount + 1);
|
|
||||||
}}>Run AI</button>
|
|
||||||
</>;
|
</>;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,11 @@ async function run() {
|
||||||
|
|
||||||
|
|
||||||
const root = createRoot(document.getElementById("root"));
|
const root = createRoot(document.getElementById("root"));
|
||||||
root.render(<Menu dictionary_text={dictionary_text} settings={{trayLength: 7}}/>);
|
root.render(<Menu dictionary_text={dictionary_text} settings={{
|
||||||
|
trayLength: 7,
|
||||||
|
playerName: 'Player',
|
||||||
|
|
||||||
|
}}/>);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ export enum CellType {
|
||||||
|
|
||||||
export interface Settings {
|
export interface Settings {
|
||||||
trayLength: number;
|
trayLength: number;
|
||||||
|
playerName: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum LocationType {
|
export enum LocationType {
|
||||||
|
|
Loading…
Reference in a new issue