![見出し画像](https://assets.st-note.com/production/uploads/images/71539845/rectangle_large_type_2_ead50b4d1ec10cb7b24650001ae2b734.jpg?width=800)
MatlabでWordleを実装する
Wordleは、SNSで急に流行りだした5文字の英単語当てゲームです。
今回、これをMatlabで実装してみました。
コピペできるコードは末尾にあります。
完成品
![スクリーンショット 2022-02-05 191743](https://assets.st-note.com/production/uploads/images/71534470/picture_pc_0069c0383b7326448cd1d36bff5907df.jpg)
実装
・環境:MATLAB R2018a
Matlab GUIを使います。GUIの扱い方は公式ヘルプがとても充実しているのでここで言うほどでもないですが、とりあえず
![](https://assets.st-note.com/img/1704087086700-vn9IDFFD58.png)
でGUIを開きます。
![スクリーンショット 2022-02-05 164831](https://assets.st-note.com/production/uploads/images/71523018/picture_pc_781b8b9c226c657cd469ea8c1032c3f1.jpg)
以下のようにコンポーネント設置しました。
・プッシュボタン (startbutton): ゲーム開始/リセットするボタン
・プッシュボタン (enterbutton): エディットテキストの回答を送信する
・エディットテキスト (answer): 回答を入力するエリア
・座標軸: ゲーム進捗が表示されるエリア
![画像2](https://assets.st-note.com/production/uploads/images/71523950/picture_pc_7bae7b809917c3d7cf33893662e9c6ac.png?width=800)
GUIの.figファイルを保存すると自動的にコード (.mファイル) ができます。2つあるプッシュボタンの部分に処理を入力します。
プッシュボタン1 (startbutton)
これを押したら行う処理は次の3つです。
1. リファレンスの単語リストを読み込む
2. 単語リストからランダムに答えを設定する
3. 座標軸をゲーム開始状態にスタートアップする
1. リファレンスの単語リストを読み込む
単語リストはこちらより拝借しました。自分で好きな単語だけ選んだ単語リストを使えば、オリジナルのものもできます。
単語を1列に並べ、.xlsファイルで保存しておきます。
![スクリーンショット 2022-02-05 163338](https://assets.st-note.com/production/uploads/images/71524779/picture_pc_8438bf46faf22e60ac30515530308148.jpg?width=800)
これを uigetfile と xlsread で読み込みます。変数listに文字列で単語リストの内容を格納します。
![](https://assets.st-note.com/img/1704087491757-YMwooQS4Kr.png)
2. 単語リストからランダムに答えを設定する
rand関数 (0から1の乱数を1つ生成する) を使って単語をランダムに1つ選びます。単語リストの数 (今回12971個あります) とrandを掛けることで0~12971の乱数を作り、それをceilで切り上げることで1~12971の自然数をランダムに1つ作ります。そして、変数word5に答えとなる単語を格納します。String型に変換しておきます。
![](https://assets.st-note.com/img/1704087521302-MzRnGBPpQI.png)
あとのforループでは、答えの単語を1文字ずつword変数に取り出しています。
3. 座標軸をゲーム開始状態にスタートアップする
![](https://assets.st-note.com/img/1704087542095-MOjAJj8X1q.png)
count 回答した回数をカウントする変数。ここで0にセットしておくことで、startbuttonを押したときにゲームリセットできるようになります。
axes ゲーム進捗を記述する変数。Wordleの グレー=0、黄=1、緑=2 を入れていきます。7行・6列は6トライアル・5文字に対応していて、行数を増やすとトライアル数を増やせたり、列数を増やすと文字数を増やしたりできます。
set Y軸を反転する (上から下に進むようにする)
pcolor axes変数を疑似カラー表示することでゲーム進捗をプロットする。
colormap, caxis グレー=0、黄=1、緑=2 となるように疑似カラーの色を設定する。
axis off 座標のメモリをオフにする。
これでゲームスタート画面になります。
![スクリーンショット 2022-02-05 180151](https://assets.st-note.com/production/uploads/images/71528420/picture_pc_8343be251a224d237ffd2f763026f116.jpg)
また、ここで定義した変数のうち word word5 count axes はglobal宣言しておきましょう。
プッシュボタン2 (enterbutton)
これを押したら行う処理は次の3つです。
1. エディットテキストに記入された回答を読み取る
2. 回答の各文字が正解に含まれているか、位置も一致しているか判定する
3. ゲーム進捗をプロットする
1. エディットテキストに記入された回答を読み取る
![](https://assets.st-note.com/img/1704087562597-M29FTSv2Xx.png)
まず回答した回数 (count) を1個増やします。
次に answer5 変数に回答を格納します。get(findobj('tag', 'answer'), 'String'); は「TagがanswerのエディットテキストをStringとして読み取る」となります。
そして、またforループで answer 変数に1文字ずつ入れていきます。
2. 回答の各文字が正解に含まれているか、位置も一致しているか判定する
forループで1文字ずつ判定し、結果を axes に反映していきます。
![](https://assets.st-note.com/img/1704087577594-o6BCF5Z0g9.png)
文字の位置が一致していた場合:2
文字が回答に含まれていた場合:1
それ以外:0 (アップデートしない)
3. ゲーム進捗をプロットする
![](https://assets.st-note.com/img/1704087592881-uxmra6OVgp.png)
forループでhistory 変数に回答の履歴を格納していきます。
次のpcolorで axes を疑似カラー表示し、ゲーム進捗を色のタイルで示します。文字が合っていたり含まれていた場合に緑や黄色、それ以外は灰色で表示されます。次のforループで、文字を重ねていきます。
![スクリーンショット 2022-02-05 191743](https://assets.st-note.com/production/uploads/images/71534315/picture_pc_f926299f2560c0c963d2187badf29060.jpg)
これでとりあえず完成です。スコア表示とか、トライアル回数オーバーしたときの処理とか書いてないので、必要なら追加しましょう。
「続きをみるには」でコピペできるコードのフルバージョンが読めます。
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?