現在の学校教育ではプログラミング言語を使用するよになっているので、コンピューターを使用した処理とその処理を行うための方法を用いたカリキュラムが用意されています。高校の情報Iでは、

  ■ ネットリテラシー
  ■ 知的財産権
  ■ ハードウェアの仕組み
  ■ 暗号
  ■ 圧縮方式
  ■ デジタル変換 
  ■ エラー予測(パリティー)
  ■ Pythonでの処理
  ■ データサイエンス

のような物を扱います。この中でオフィースソフトを使用したり、マクロを扱う場合もありますが、大まかにコンピューターの動作の仕組みやハードウェアの知識を取得したり、コードの基本的な書き方などを学習します。

 高校のカリキュラムだと、Pythonで関数を扱うまでで終わっていそうですが、この仕組みだけだと値の固定を刷るようなコードの書き方で処理を実装していくと極当たり前のように処理を実装できるようになっています。

 これが、パフォーマンスの高い書き方なのか?と言うと処理の方法によって変わってきますが、考えたもんをお形にするための基本的な処理については学習することができるようになっています。
 

 

 

  情報IとPython

 


 情報Iのカリキュラムだと、

  ■ 演算子(比較、判定、計算)
  ■ 変数の利用
  ■ 配列の利用
  ■ 表示
  ■ 入力(バッファあり)
  ■ ループ(等差数列、条件付きループ)
  ■ 分岐(単一と複数の判定)
  ■ 外部ファイルの読み込み
  ■ 外部ライブラリの使用
  ■ 二次元配列の使用

辺りになっていると思います。処理を行うために用意する

  ■ 変数
  ■ 演算子
  ■ 分岐
  ■ 反復
  ■ 入出力

の部品が揃っているので、

  ■ 順次
  ■ 反復
  ■ 分岐

の3つを使って構造を作ることができる状態になっていますし、コンソール上になりますが、

  ■ キー入力(バッファあり)
  ■ 文字列の表示

も行えるようになっています。この仕組みをそのまま使用すると、

  【 ライブラリの読み込み 】
        ↓
     【 初期化 】  
        ↓
     【 処理1 】
        ↓
     【 処理2 】
        ↓
     【 処理3 】
        :
        :
        :

のような感じになりますが、そのまま処理を書き連ねると、この処理の塊はコードで分けてあるだけで、どこに何があるのかわかりにくくなります。BASICでGOTOで分岐を刷るようなコードを書くと同様の形になりますが、BASICでもサブルーチンを使っって 【 GOSUB〜 / RETURN 】 で処理の塊を作り処理を実行するようにすると、処理の塊をメインループの外に出して呼び出しで実行するようなコードの形に刷ることが出来ます。

 つまり、キー判定などのように

【 必要なときにしか使用しない処理 】 

などを外部に出すことでメインループも文字数を少なくして軽くする場合にそういった構造にしますが、C言語も含めて多くのプログラミング言語では 【 関数 】 が使用できるので、関数の中に処理を包含することで、通常の処理の流れと関数で包含した処理を分けることができるようになっています。

 

 

 

  クラス

 


 この関数の仕組みは 【 処理の包含 】 になりますが、関数で処理を行うと複雑になる物を簡素化する際に使用する 【 クラス 】 を用いる際にも 

  ■ インスタンス変数(メンバ変数)
  ■ メソッド(メンバ関数)

のようなものを用意して、一つの構造として使用することになりますが、この構造も

  ■ 使用する変数を格納した書式
  ■ 変数をもとにして動く機能

を一つにまとめたものなので、イニシャライザーを使って、インスタンス変数の設定を行い、その後、コード内で値を持った構造物である 【 インスタンス(実体) 】 を作ることで用意した値で動作する仕組みを作ることが出来ます。ゲームで考えると、MOBの管理がこの仕組みに向いているのですが、こうしたものは、 【 全て値が異なる 】 ので、【 個体ごとにデータが管理されている 】 わけですが、この時に名前をつけてデータを管理すると対象を管理しやすくなるので

  ■ 名称
  ■ 各種データ

を紐付けして管理しておくと作業がしやすくなります。例えば、

  ■ HP
  ■ MP
  ■ AT
  ■ DP
  ■ EXP

のような値をイニシャライズを行って、インスタンス変数の宣言した場合、インスタンスを作成すると迷走をつけてこのパラメーターの値を指定することが出来ます。例えば、

  ■ MOB1(20,0,5,6,3)
  ■ MOB2(30,5,10,8,12)

のようなデータが存在したとします。この2つのデータでは値が異なりますから、同じ数式を用いて処理をこなったとしても異なる結果になります。例えば、戦闘用の数式を使って処理をした場合、明らかにMOB2のほうが強いので、プレイヤーキャラの強さが同じだと、ダメージ数が違ってきますし、MOB2のほうが強く感じるはずです。このように 【 個性の違い 】 を名称をつけて管理することができるのがインスタンスになります。

 このように

  ■ 名称をつけて値を管理する
  ■ インスタンスの値でメソッドを実行する

と言う方法を用いることができるのがクラスの特徴になりますが、この基礎部分の

  ■ 変数
  ■ 関数

の部分を情報Iで学習することになります。インスタンスを作るとデータがメモリー内に格納されるので、そのデータ文だけ容量を消費しますが、戦闘シーンのように先頭で使用したMOBのインスタンスのデータをフィールドマップでの移動時に保持しておく必要はないので、ガーベージコレクターのようにメモリーの開放をする用に消去したほうがメモリー容量の節約になります。

 インスタンス関連だと

  ■ コンストラクター
  ■ デストラクター

と言う機能があり、初期化とメモリーの開放が行えるようになっているのでC言語やC++で行うように不要なデータを消去することができる使用になっています。
 

 

 

  処理を考える場合

 


 高校の学習では基礎を扱うことになるのですが、クラス図の練習として

  ┏━━━━━━━━━━━━━━━━┓
  ┃【 処理 : 名称 】     ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃ 概要             ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃【 変数 】          ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃ ■ 変数名1         ┃
  ┃ ■ 変数名2         ┃
  ┃ ■ 変数名3         ┃
  ┃ ■ 変数名4         ┃
  ┃ ■ 変数名5         ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃【 関数 】          ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃ ■ 関数名1         ┃
  ┃ ■ 関数名2         ┃
  ┃ ■ 関数名3         ┃
  ┃ ■ 関数名4         ┃
  ┃ ■ 関数名5         ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┗━━━━━━━━━━━━━━━━┛

のような形で、使用する変数と関数を書き出しておいて、それぞれの関数については、


  ┏━━━━━━━━━━━━━━━━┓
  ┃【 関数 : 名称 】     ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃ 概要             ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃【 引数 】          ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃ ■ 引数名1         ┃
  ┃ ■ 引数名2         ┃
  ┃ ■ 引数名3         ┃
  ┃ ■ 引数名4         ┃
  ┃ ■ 引数名5         ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃【 変数 】          ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃ ■ 変数名1         ┃
  ┃ ■ 変数名2         ┃
  ┃ ■ 変数名3         ┃
  ┃ ■ 変数名4         ┃
  ┃ ■ 変数名5         ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃【 処理 】          ┃
  ┣━━━━━━━━━━━━━━━━┫
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┃                ┃
  ┗━━━━━━━━━━━━━━━━┛

のような感じのもので作業を刷ると考えをまとめやすくなります。

 

 

 

  処理と考え方

 

 

 高校の数学だと 【 多変数の構造体 】 や 【 代入をして処理が完結する構造物 】 が登場するので、Σや∫の添字を関数の引数として考えるとプログラミング言語を称する際の仕組みとして考えやすいと思いますが、情報Iで扱っているプログラミング方法法は、

 
  f(x) + g(x) + h(x) + ....


のような構造になります。この時の関数が、

  f(x,y,z)
  
のような多変数化したものになっており、処理の内容が数式ではなく

  ■ 数式
  ■ 判定
  ■ 上記外の処理

で構成されているだけだったりします。その為、

  ■ 順次 : 項の足し算
  ■ 反復 : 乗算
  ■ 分岐 : 決定木やスイッチ

なので、基本的に処理の仕組みは数学の知識で全て対応できるようになっています。高校のカリキュラムでは、線形の解析の分野は登場しますが、決定木はたしかでてこなかった気がしますから、分岐については 【 閉回路内のトランジスタのようなもの 】 と考えるとイメージしやすいかもしれません。

 実際に判定が入らない場合だと、数式で示すことができるので、

while True:
   a+b
    
のような処理が存在した場合、

  ■ ループ : ∞
  ■ 処 理 : a+b

ですから、 【 ∞(a+b) 】 と同様の処理と考えることが出来ます。これが無限ループですが、

  ■ ループ : ∞
  ■ 処 理 : f(x)

のように関数を用意してその実行をループで行う場合だと、 【 ∞(f(x)) 】 のような構造と考えることができるわけです。その為、この無限ループの中を順次を実装した場合だと、

【 ∞( f(x) + g(x) + h(x).... ) 】 

のような構造だと考えることができるわけです。また、この関数を複数回繰り返す処理が存在する場合、

【 ∞( f(x) + n( g(x) ) + h(x).... ) 】 

のように係数が追加されたのと同じ状態になります。中学校の数学では、教育制度改革以降は中学校一年生で素数と素因数分解が登場しますが、この応用が二次関数の因数分解になります。

 この時に使用するのが(x+1)と言うモジュールを乗算処理用のパーツとして使用した数式になりますが、この簡素な方程式の形にすると(x+1)(x+1)のような計算も行いやすくなります。このモジュールの

  ■ 変数項
  ■ 定数項

の部分に 【 係数 】 を追加することで四季に変化を与えてあるわけですが、一次関数は、xと言う変数項に係数を追加して九九のような状態にした物を扱っていたわけですが、因数分解だと 【 一次関数の基本モジュール 】 である

  ■ 関数の式
  ■ 定数の式

を組み合わせたものになっていますが、この値を単位のような基準となるものとして組み合わせたものをモジュールとして使用するのが中学校や高校の数学になります。因数分解ではこのモジュールで二次式を因数分解することで簡素な構造にしていますが、因数分解の式のように変数項の値に対して別の値を用いた処理を追加することで変化を与えることが可能ですし、その構造物を項に付与する要素として使用することも出来ます。

 つまり、

  ■ ±f(x)という係数
  ■ ±f(x)を使用した冪乗
  ■ ±f(x)を加算した処理

を 【 一つの構造物 】 として扱うことが出来ます。この構造は、小学校一年生の算数で登場する等式の仕組みが全てを証明しているのですが、

  【 数式 】 = 【 解 】

と言う等式が成り立つ場合、

  【 関数 】 = 【 定数項 】

が成立するわけですから、定数項で指定できる場所については、

  ■ 変数
  ■ 関数

などに置き換えることができます。これが、 【 数式を自由に構築する際のルール 】 になります。

 学校で学習する内容は

 【 目的の挙動になることが証明された”仕組みを作るための部品” 】

ですから、 【 数式の構成要素 】 になりますが、高校では、組み込み関数や標準ライブラリの中に実装されているモジュールのような構造になっており、大学になると、 【 処理の内容のコードっぽさ  】 が色濃くなってきます。

 このように思考を行う際には

  ■ 工程表  : 加算
  ■ 繰り返し : 乗算

で対応できるので、処理の中の順序やその中で存在する内容をどのようにするのか?を明確にしておけば、ループと加算で状態を明確にすることが出来ます。

 確定した処理を行う場合には、 【 定数化したアルゴリズム 】 で処理が行える場合もあるので、この場合だと、必ずそこには 【 数値 】 が存在します。というのも確定した結果は変化しないので、これについては演算処理ではなく物理法則の係数のように定数化したものが存在しています。

 その為、構造物を考える際には

  ■ 寸法
  ■ 強度

などの定数が存在しているのですが、コードを改定処理を作る際にも

  ■ 確定したもの
  ■ 不確定なもの

を先に洗い出しておくと構造を作りやすくなります。この作業でできることは

  ■ 変数
  ■ 定数

の洗い出しになりますが、不確定なものや変化するものは変数で、確定したものは定数ですから、事前に理解しておくと構造を作りやすくなります。また、処理の中で定数部分を変更するような処理を実装することもなくなるので、構造の理解不足による間違った処理の実装を回避することが出来ます。
 

 

 

  分岐

 


 分岐については、決定木で考えたほうがわかりやすいので、


          True
         ┏━━━ 【 処理の実行 】
         ┃
 【 条件 】 ━┫
         ┃
         ┗━━━ 【 順次の流れ 】
          False


のようになります。この判定ですが、

  ■ 0 : False
  ■ 1 : True

になっており、

  ■ 0 : 実行しない
  ■ 1 : 実行する

と言う状態になっています。通常は、ifを使用した判定の場合だと、引数が1であることが条件で処理が行われているので、 【 if a==1: 】 のような処理だと、

 【 a==1はTrueである 】

という条件で動作していることになります。こうした処理は共通しているので、C言語のifの説明では最初に登場しますが、Pythonも同様の使用なので同じような処理をコードにすると同じ結界になります。実際に



のように順次と分岐を実装したコードを書いてTrueは



のような判定を行い、Falseは



のような判定を行うようにして実行すると、



のようになります。結果を見ると、やはりFalseの条件では処理がスキップされて次の処理が行われています。

 これが、先程の分岐の状態になります。

 この状態にすると、 【 スイッチのオンとオフの状態 】 と全く同じなので、判定で実装した処理を豆電球の点灯に置き換えるとスイッチのオンとオフの状態と全く同じ共同であることが確認できます。

 決定木のように判定をネストしていくと訳が分からないこうぞうになるので、リレーショナルデータベースのように

  ■ 主キー
  ■ 外部キー

でデータを管理するように判定を管理すると処理を行いやすくなります。先程の判定は1bitの処理ですが、この入力を行った場合には 【 論理演算 】 が使用できます。判定の場合、単独で処理を実装することも出来ます。



の中では、



でブール値で判定を行っていますが、この後の処理で



をしています。これが、andなので、論理積になりますから、数学的には、

【 A=1∧b=1 】

のような判定で条件を作っています。コレを実行すると



のようになりますが、ifを使用した場合には、

  ■ 一致
  ■ 不一致
  ■ 超過や未満の判定
  ■ 論理演算

が使用できるので、複数の変数を用意してその変数の値の変化を論理演算で判定を実装することが出来ます。

 これが、難しい条件での判定になりますが、一般的には

 【 難しい条件 】 → 【 簡単な条件 】

と言う流れでifの判定は実装していくことになるので、

  ■ if 〜 else 〜
  ■ if 〜 elif 〜 else 〜

のような判定の場合も難しい判定を用意してそれ以外で難易度の高い判定を実装して簡単な処理は後で行うようにします。これは、

  ■ A==1 ∧ B==1
  ■ A==1
  ■ B==1

の判定を入れる際に
 
  ■ A==1
  ■ B==1
  ■ A==1 ∧ B==1

のような順番にすると、 

  ■ A==1 ∈ A==1 ∧ B==1
  ■ B==1 ∈ A==1 ∧ B==1

の関係にあるので、最初に片方だけの処理を実装すると動作しなくなります。その為、判定の順番は

  ■ A==1 ∧ B==1
  ■ A==1
  ■ B==1

となるので、

  if A==1 and B==1:
     処理

  elif A==1:
    処理

  elif B==1:
    処理


のような形で判定を入れることになります。この場合のif(0)は上記の判定以外の状態になりますが、elseのばあいだと、


  if A==1
    処理

  else
    処理

となるので、

  ■ 判定の内容がTrue 
  ■ 判定の内容がFlase

の時にそれぞれに処理を実装することになります。つまり、2つの条件とそれ以外だと、

  if A==1
     処理

  elif B==1:
    処理

のようになります。

【 一つの判定のみ 】

   if 条件:
     処理


【 一つの判定とそれ以外の判定 】

   if 条件:
     処理

   else 条件:
     処理


【 複数の判定 】

   if 条件:
     処理

   elif 条件:
     処理


【 複数の判定とそれ以外 】

   if 条件:
     処理

   elif 条件:
     処理

   elif 条件:
     処理


のようになります。

 ループは 【 係数の位置と数値 】 ですが、分岐は、【 分岐の構造 】 が生じるのでどのように実装するのかで用途が変わってきます。

 また、

  ■ 対象の値
  ■ 複数の組み合わせ

などで書式も変わるので、処理の流れを考えて実装することになります。

(t)処理を実装する場合、

 処理を実装する場合には、

  ■ 内部処理
  ■ 操作
  ■ 表示

がありますが、コンソールで動作するものだとPythonを使用した倍だと

  ■ 表示 : ptint関数
  ■ 入力 : input関数

を用いることになります。情報Iでもこの辺りは使用することになりますが、input関数は変数を乱数以外で任意の数値として代入する選択肢になります。また、人が操作する手段ですから、変数の入力と言う選択肢で作れる物を考えると、 【 操作で動く物 】 を作ることが出来ます。

 コードを書く場合、他のサンプルを参照するのも良いのですが、この作業は情報Iだけだと知識が足りないと思うので、簡素なコードを基準に理解を深めていくことになります。Pythonの知識がある場合だと、コードを見ても理解できると思うのですが、殆どのコードがクラスを使用したコードになっているので、クラスの使い方を学んだ上で理解を深めていく方法として使用するものになっています。

 自作でコードを考える場合だと、

  ■ 自動処理と表示

のコードを考えて、その上で変数の推移を自動で行うものを考えることになります。

 コレが出来たら、【 複数の変数の推移 】 を作ることになります。これは、座標平面上で考えると、異なるグラフが存在している状態になりますが、これが発生するものを作ります。

 この作業はLOGOなどでも体験するものになりますが、複数のものを個別に制御するための方法になります。
 
 コレが出来たら

  ■ 数値の上限と下限
  ■ 2つの関数の座標の交点が生じた時の処理
  
を指定します。すると、上限と下限に達すると数値を止めることが出来ますし、交点が生じた時に何かを表示させる仕組みを作ると、 【 衝突の検知 】 を実装することが出来ます。

 コレはなにか?と言うと 【 MOBの挙動を簡素にしたもの 】 になりますが、自動処理を作ることで、特定の法則性に準じて動作する物体の制御を考えることが出来ます。

 小学校の算数では、Scratchのペンツールを使って図形を描くカリキュラム上がりますが、これが、座標制御なので、 【 オブジェクトの移動 】 の管理になります。また、この時にプログラムの実行によってペンは動いていますから、これも自動処理になります。

 この時の挙動を線ではなくスプライトに着目するとスプライトは自動で動いていますが、これがゲーム内で実装するMOBの動作の実装を簡素化したものになります。

 その為、中学校以降で登場する関数のグラフは 【 MOBの動きをトレースしたものと同じ物 】 と考えることができるので、同じ関数を実装して座標制御をループ処理で実装するとその関数のグラフと同じラインをトレースするようにMOBが動きます。この辺りは、ScratchのペンツールやPythonのTurtleでも同じですが、関数のグラフはスプライトやポリゴンの重心として考えることができるので、その重心の挙動をトレースしたものがグラフになります。

 この時に関数の座標同士の数値の関係性に着目して制御を実装すると、それぞれの関数の値を距離感だけで制御できるようになりますが、これがMOBの動きの特徴になります。

 当然、キャラクターオブジェクトも三角関数で動かすことができるので、座標と言う数値を持っていますから、MON同士の距離の判定と同じようにプレイヤーとMOBの座標の数値による判定を行うことも出来ます。

 表示を行わない内部処理の部分では、このような

  ■ 数値の変化
  ■ 数値の比較
 
などで判定を行うことができるので、基本的には数学で制御できる仕組みになっています。