メインコンテンツへスキップ
見出し画像

【擬似言語②裏】ジャンケン | 結果のテーブル(基本情報技術者, 科目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。 学生時代にITパスポート試験・基本情報技術者試験・応用情報技術者試験を独学で高得点合格。情報処理安全確保支援士試験(セキスペ)・データベーススペシャリスト試験・ネットワークスペシャリスト試験・G検定なども取得。 2027年にPD-S受験予定。