見出し画像

#2 【React.jsで、BlackJackを作る】:カードの見た目を変えてみる

これまで

前回は、BlackJack アプリを作っていく環境作りをしました。

BlackJack アプリの sandbox

BlackJack アプリの sandbox は以下です。

この sandbox は、連載が進むのと同時に更新されていきます
「私も作りたい!」という方は、フォークして一緒に作り始めることができます。

まずはなんとなく枠組みを作る

具体的な処理の実装は置いといて、まずはラフ画を書くように画面を BlackJack っぽくしてみようと思います。

src/BlackJack.js

BlackJack.js のコンポーネントを返却するreturn文は以下のようになっていました。

return (
   <Box>
     <PlayArea card={card} />
     <Box className={classes.messageArea}>
       {getMessage()}
       {!isGameFinished && getButtons()}
     </Box>
   </Box>
 );

画面にカードを表示するためには、PlayArea コンポーネントに card オブジェクトを渡します。

この仕組みは BlackJack も同じでよいと思います。
ただ、BlackJack にはディーラーとプレイヤーがいて、それぞれ「ハンド」という手札を持ちます
そして、ハンドのカードはだんだん増えていくので、配列で渡そうと思います。
ということは、自ずと state の定義も必要になります。

// 初期値はとりあえず決め打ち
const [dealersHand, setDealersHand] = useState([
   { suit: "♠", rank: "A" },
   null
 ]);
 const [playersHand, setPlayersHand] = useState([
   { suit: "♠", rank: "A" },
   { suit: "♣", rank: "5" }
 ]);
  return (
   <Box>
     <PlayArea dealersHand={dealersHand} playersHand={playersHand} />
     <Box className={classes.messageArea}>
       {/* getMessage() */}
       {/* !isGameFinished && getButtons() */}
     </Box>
   </Box>
 );

src/components/PlayArea.js

PlayArea は、トランプのカードを表示するためのコンポーネントです。
元は以下のコードです。

      <Grid container direction="row" spacing={2} alignItems="center" justify="center">
       <Grid item>
         <Card card={props.card} />
       </Grid>
     </Grid>

props で渡されてくる値が変わったので修正します。
上部にディーラーのハンド下部にプレイヤーのハンドを表示するようにします。

カードは Material-UI の Grid を使用します。
これは画面スペースや見栄えの都合で変更するかもしれません

      <Grid
       container
       direction="column"
       spacing={5}
       alignItems="center"
       justify="center"
     >
       <Grid item>
         <Grid container direction="row" spacing={1}>
           {props.dealersHand.map((card, index) => {
             return (
               <Grid item key={index}>
                 <Card card={card} />
               </Grid>
             );
           })}
         </Grid>
       </Grid>
       <Grid item>
         <Grid container direction="row" spacing={1}>
           {props.playersHand.map((card, index) => {
             return (
               <Grid item key={index}>
                 <Card card={card} />
               </Grid>
             );
           })}
         </Grid>
       </Grid>
     </Grid>

Grid はレスポンシブ対応をするにはとても便利なのですが、ご覧の通り少しコードが増えてしまいます。
そこらへんも変更を考える理由です。

現在の画面

この修正で画面は以下のようになりました。

画像1

詳しい変更はこちら

Codesandbox は GitHub連携ができます。
以下は今回のコミットによる差分です。

次回

次回は、メッセージやボタンを表示するために、カードを少し小さくしようと思います。

この記事があなたのお役に立ちましたら、よろしければサポートをお願いいたします! より良い記事をお届けできるよう、活動費に充てさせていただきます。