見出し画像

#4 【React.jsで、BlackJackを作る】:HITしてみる

これまで

前回は、カードの大きさを小さくして、HIT, STAND ボタンを表示しました。

BlackJack アプリの sandbox

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

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

HIT する

「HIT」は「もう一枚引く」ということです。
HIT ボタンが押されたとき、デッキからカードを一枚引いて、プレイヤーのハンドに加えるという処理を行います。

src/BlackJack.js

では、早速実装していきましょう!
元のコードはこちらです。

  function doHit() {
   const _card = getCard();
   setCard(_card);

   const isWin = getRankNum(_card.rank) > 7;
   setIsWin(isWin);

   isWin ? setWinCount(winCount + 1) : setLoseCount(loseCount + 1);
   setAnswered(true);
 }

state isWin, answered を更新しているところは、処理が大きく変わるので消してしまいます。
「デッキからカードを一枚引いて、プレイヤーのハンドに加える」全部やると、以下のようになります。

  function doHit() {
   const _card = getCard();
   const newPlayersHand = playersHand.slice()
   newPlayersHand.push(_card)
   setPlayersHand(newPlayersHand)
 }

HIT してみる

上記のコードでも HIT は可能です。
試しに HIT ボタンを押してみると、以下の画面になります。

画像1

でも、ちょっと考えみてください。

ディーラーも HIT する

プレイヤーが STAND すると、ディーラーも HIT してカードを引きます
関数 doHit() で、「デッキからカードを一枚引いて、プレイヤーのハンドに加える」ことを全部やろうとすると、ディーラーの処理を作るときに同じようなコードを作ることになってしまいます

「HIT する」を別の処理に抽出する

プレイヤーとディーラーで共通するのは、どちらも「HIT する」ということなので、その処理を抽出します。

function hit() {
   return getCard();
 }

 function doHit() {
   const newPlayersHand = playersHand.slice();
   newPlayersHand.push(hit());
   setPlayersHand(newPlayersHand);
 }

関数 getCard() があるからそれ使えばいいんじゃない?」と思う方がいるかもしれませんね。
もちろんそれでもよいかと思います。
ただ「カードを引く」のと「HIT する」という行為は、やっていることは同じでも少し意味合いが違うと思うので、私はこのようにしました。

現在の画面

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

画像2

このように、ポチポチしすぎると画面が少し崩れてしまいますが、追々直していきましょう。

詳しい変更はこちら

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

次回

ポチポチしすぎると画面が崩れてしまうので、次回はカードを重ねて表示するようにしてみましょう。

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