見出し画像

【擬似言語②裏】ジャンケン | 結果のテーブル(基本情報技術者, 科目B, アルゴリズム)

>【擬似言語②】ジャンケンのNote では、ジャンケンの組合せ9パターンを、if文で組んで。面倒だから数式化するまで学びました。

このNoteでは、ジャンケンの勝敗を配列に格納するのを学びます。計算が複雑/面倒な時、結果を表にしておいて見つければ良いんです。

日常生活でも使ってますよ。荷物の送料(サイズ, 届ける地域)、ネットカフェの料金表(ブース種類, 利用時間)など。


テキストの基礎を生かして、プログラム的な考察/工夫を学んでいきます。基礎と実用にギャップを感じる方のために作りました。
>【FEB】擬似言語の教科書Note

ぜひ一緒に学習を進めていきましょう!


このNoteは、私がIT専門学校で授業したことを基に作成しています。IT専門学校でFEは第一目標として、カリキュラムが構築されています。何も知らずに入学しても、1年生10月にはFE合格していきますよ。実績ある教育ノウハウを詰め込んだので、少しでも信頼して頂けたら嬉しいです。

>全Noteへのリンク(FE節)
※科目Aのテーマ別/科目B/旧FE午後など沢山作りました!



ジャンケンの勝敗テーブル

>前回のNote では、ジャンケンの勝敗3×3=9通りのif文が面倒なので、数式化しました。運よく数式にできましたが、作るの大変でしたね(生成AIがあってもデバッグは必ずせんと💦)。

/ oppHand:相手の手 myHand:自分の手
/ グー:1, チョキ:2, パー:3 */ 
/ resultCode: -1:自分の負け 0:あいこ 1:勝ち
resultCode ← (oppHand - myHand + 4) mod 3 - 1


今回は、勝敗コードを「予め登録」しておく手法を学びます。

簡単ですよ。勝敗コードを「二次元配列」に書いといて、自分の手を「行番号」・相手の手を「列番号」にして、勝敗コードを読み込みます。

  整数型の二次元配列: matrix[3][3] ← {
    { 0,  1, -1},  / 自分がグー(1)の時 [相手グー, チョキ, パー] */
    {-1,  0,  1},  / 自分がチョキ(2)の時 */
    { 1, -1,  0}   / 自分がパー(3)の時 */
  }
    resultCode ← matrix[myHand][oppHand]

例えば、自分がグー(1)・相手もグー(1)ならmatrix[1][1]=0「あいこ」が読み出されます。自分がチョキ(2)・相手がパー(3)ならmatrix[2][3]=1「自分が勝ち」が読み出されます

引数検査も勝敗結果表示も同じ。勝敗数式を、配列からの読み出しに変更するだけです。

○整数型: judgeRPS(整数型: myHand, 整数型: oppHand)
  / グー:1, チョキ:2, パー:3 */
  / 行(自分)・列(相手)に対応する勝敗表 [1〜3][1〜3] を定義 */
  / -1: 負け, 0: あいこ, 1: 勝ち */
  整数型の二次元配列: matrix[3][3] ← {
    { 0,  1, -1},  / 自分がグー(1)の時 [相手グー, チョキ, パー] */
    {-1,  0,  1},  / 自分がチョキ(2)の時 */
    { 1, -1,  0}   / 自分がパー(3)の時 */
  }
  整数型: resultCode

  / 引数検査、OKならresultCode取得 */
  if (myHand < 1 または myHand > 3)
    resultCode ← 99
  elseif (oppHand < 1 または oppHand > 3)
    resultCode ← 99
  else
    / 配列から勝敗コードを取得 */
    resultCode ← matrix[myHand][oppHand]
  endif

  / 勝敗結果の表示 */
  if (resultCode = -1)
    「負け」と表示する
  elseif (resultCode = 0)
    「あいこ」と表示する
  elseif (resultCode = 1)
    「勝ち」と表示する
  elseif (resultCode = 99)
    「ジャンケンの手にエラー出ました」と表示する
  else
    「勝敗判定にエラー出ました」と表示する
  endif

  return resultCode




結果のテーブルが使える別例

他に、結果のテーブルが使えそうな例を挙げておきました。良かったら、処理全体の擬似言語を考えて見て下さいね。


会員ランクによる還元率の切り替え。

/ 会員ランク: [1]レギュラー: 1%, [2]シルバー: 3%,
             [3]ゴールド: 5% */
整数型の配列: returnRateTable ← {1, 3, 5}

還元率が変わっても、配列内の数値を変えるだけで対応できます。会員種別が増えたら追加するだけ。

/ 会員ランク: [1]レギュラー: 1%, [2]シルバー: 3%,
             [3]ゴールド: 5% [4]ダイアモンド: 10% */
整数型の配列: returnRateTable ← {2, 4, 7, 10}


ゲームの属性によるダメージ補正。

一回完璧にチェックしてれば、ずっと使えます。

/ 行(自分)・列(相手)に対応する倍率表 [1〜3][1〜3] */
/ 0.5: 0.5倍, 1.0: 1倍, 2.0: 2倍 */
実数型の二次元配列: damageMatrix[3][3] ← {
  {1.0, 0.5, 2.0},  / 自分が火(1)の時 [相手火, 水, 草] */
  {2.0, 1.0, 0.5},  / 自分が水(2)の時 */
  {0.5, 2.0, 1.0}   / 自分が草(3)の時 */
}

ポケモンの属性って18種類でしたっけ?

18種類を数式化するのは、作るのもデバッグも大変。追加や変更があるとその度ですからね。しかも2属性持つポケモンもいるんでしたかね💦


月毎の日数。

31や30が不規則気味だして、2月の28日が曲者ですね。

/ 1月〜12月の日数を登録(平年) */
整数型の配列: daysInMonth ← {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

「2月が28日で良いか」と思った方。鋭いですね! そういうの気づく人が私は好きです👍

次回。「閏年(うるうどし)」のテーマにします。>【擬似言語②裏2】閏年と通日のNote(企画中*)




まとめ

お疲れ様でした!

ジャンケンだけでも3~4種類の手法がありましたね。

  • if文で全パターン

  • if文で全パターン(論理演算)

  • 数式化して一行!

  • 配列化して一行! ←今回


こんな感じで、基礎を生かして実例で擬似言語を作って、さらにプログラム的な考察や工夫を深めていきたくて、理解シリーズを作ってます。>【FEB】擬似言語の教科書Note

最後に私のお薦めの演習順番。
❶学習前の”分からせ”
>【FEB】サンプル問題2のNote
❷テキスト
>【FEB】擬似言語の教科書Note
>【FEB】擬似言語の理解演習Note ←いまこの辺
↓※必要なら
うかる! 基本情報技術者 [科目B・セキュリティ編](amazon)
うかる! 基本情報技術者 [科目B・アルゴリズム編](amazon)
❸各年度の公開問題
>【FEB】令和07年科目BのNote
>【FEB】令和06年科目BのNote
>【FEB】令和05年科目BのNote
➍解法の総復習(➋や➌と併用可)
>【FEB】擬似言語の11の解法Note
➎模擬試験
>【FEB】サンプル問題1のNote(擬似言語)
>【FEB】サンプル問題1のNote(セキュリティ)


いいなと思ったら応援しよう!

せんないの過去問解説Note 学習方法・問題特集のNoteは全て無料提供を続けます▼ もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼ もちろんコメントでも結構です(・ω・▼)ノシ

この記事が参加している募集