Skip to content

Instantly share code, notes, and snippets.

@atoko
Last active April 2, 2023 00:57
Show Gist options
  • Save atoko/8fb7072aa8950ea5202405cf8ef23cea to your computer and use it in GitHub Desktop.
Save atoko/8fb7072aa8950ea5202405cf8ef23cea to your computer and use it in GitHub Desktop.
//Requires React, Redux installed
//Requires Pure Briscas, found at https://gist.github.com/atoko/39e5b0ceb2778a3b456c73e2ed082156
import { createStore, combineReducers } from 'redux';
import Brisca from './lib/brisca';
import React from 'react';
import ReactDOM from 'react-dom';
let newGame = (state, action) => {
let newGame = Brisca.tableFor(2).join("A").join("B").serialize();
return newGame;
}
let playCard = (state, action) => {
let game = Brisca.deserialize(state);
game.play(action.card);
return game.serialize();
}
let gameReducer = (state = {}, action) => {
const { type } = action;
switch (type) {
case "NEW_GAME":
return newGame(state, action);
case "PLAY_CARD":
return playCard(state, action);
}
return state;
}
let mainReducer = combineReducers({
game: gameReducer
});
let gameSelector = (store) => {
const { game } = store.getState();
return game;
}
let store = createStore(mainReducer);
let PlayerHand = ({
player,
onCardClick,
showCards
}) => {
return <div>
<h2>Player: {player.player_id}</h2>
<h3>Score: {player.points}</h3>
<ul>
{player.hand.map((card) => {
const imgSrc = showCards ? `/fournier/${card + 1}.gif` : `/fournier/respaldo.gif`;
return <div key={card}>
<img src={imgSrc} onClick={() => {onCardClick(card)}}/>
</div>;
})}
</ul>
</div>
}
let App = ({
game
}) => {
const gameState = Brisca.deserialize(game);
let playerHands = gameState.players.map((player, i) => {
return <PlayerHand
player={player}
key={player.player_id}
showCards={gameState.nextToPlay === i}
onCardClick={(card) => {
store.dispatch({
type: "PLAY_CARD",
card
});
}}
/>;
})
return <div>
<h1>Welcome to Redux Briscas!</h1>
<button onClick={() => {
store.dispatch({type:"NEW_GAME"});
}}> New game </button>
<p/>
<span> Deck cards remaining: {gameState.playDeck.length}</span>
<br/>
<span> Life card is: {gameState.lifeSuit()}</span>
{playerHands}
</div>
}
let render = () => {
ReactDOM.render(<App {...store.getState()}/>, document.getElementById("main"));
}
store.dispatch({type: "NEW_GAME"});
render();
store.subscribe(render);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment