Last active
April 2, 2023 00:57
-
-
Save atoko/8fb7072aa8950ea5202405cf8ef23cea to your computer and use it in GitHub Desktop.
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
//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