【Python】僕と僕たちの青春劇。Part. 2

前回までの青春劇。

前回の記事では、若者たちの壮大な青春ドラマ。もとい、ある目的のためのデータ構造を作りました。

もし、前回の記事を見られていない方は以下からぜひご参照ください。

前回記事のキャラクターの性格のところで”公明正大”の部分を”公正明大”と書いていたのでこっそり直しました。(恥ずかしい///

ちゃんと見直しもしないとダメですね。
もし、プログラムが動かない!などあればコメントにて教えてください。

動作環境については、前々回の記事に書いてありますので
気になった方は、以下からぜひご参照ください。


///

0. 前回のおさらい

ということで、ジュースを掛けて勝負することになったK,M,Rの三人。

テストの点数を生み出す構造は以下のように作りました。

import random
class Character:
 def __init__(self):
   self.score = Score()


class Score:
 def __init__(self):
   self.reset_japanese()
   self.reset_math()
   self.reset_english()
   self.reset_social()
   self.reset_science()

 def reset_japanese(self, min=0, max=100):
   self.japanese = random.randint(min, max)

 def reset_math(self, min=0, max=100):
   self.math = random.randint(min, max)

 def reset_english(self, min=0, max=100):
   self.english = random.randint(min, max)

 def reset_social(self, min=0, max=100):
   self.social = random.randint(min, max)

 def reset_science(self, min=0, max=100):
   self.science = random.randint(min, max)

 def print_score(self):
   print("国語:{}".format(self.japanese))
   print("数学:{}".format(self.math))
   print("英語:{}".format(self.english))
   print("社会:{}".format(self.social))
   print("理科:{}".format(self.science))

K = Character()
K.score.print_score()

これを各キャラクターの特徴をよく表現するように補正をかけるような作りに変えていきます。


1. 各キャラクターのルールを作る

大前提として、軸となる値が必要です。
となると、やはりKが適役でしょう。主人公ですし。

上記、プログラムを動かした結果の例を以下に示します。

国語:68
数学:60
英語:47
社会:80
理科:62

さて、中々いい値がたまたますぐ出てくれました。
今後は、一旦簡単に考えるために上の値を固定値として利用します。

ここで
MとRの点数の特徴を前回から引用します。

また、KはMより社会が得意で、RはKより英語が得意であり
点数もその通りに反映されています。

つまり
- Kの社会の点数 > Mの社会の点数
- Kの英語の点数 < Rの英語の点数

になるように、値を上手いこと変化させます。


2. ルールに則ってプログラムを作る。

2-1. まずは、Mの点数を生み出しましょう。

具体的なプログラムはこちら。

import random

class Character:
 def __init__(self):
   self.score = Score()


class Score:
 def __init__(self):
   self.reset_japanese()
   self.reset_math()
   self.reset_english()
   self.reset_social()
   self.reset_science()

 def reset_japanese(self, min=0, max=100):
   self.japanese = random.randint(min, max)

 def reset_math(self, min=0, max=100):
   self.math = random.randint(min, max)

 def reset_english(self, min=0, max=100):
   self.english = random.randint(min, max)

 def reset_social(self, min=0, max=100):
   self.social = random.randint(min, max)

 def reset_science(self, min=0, max=100):
   self.science = random.randint(min, max)

 def print_score(self):
   print("国語:{}".format(self.japanese))
   print("数学:{}".format(self.math))
   print("英語:{}".format(self.english))
   print("社会:{}".format(self.social))
   print("理科:{}".format(self.science))

K = Character()
K.score.japanese = 68
K.score.math     = 60
K.score.english  = 47
K.score.social   = 80
K.score.science  = 62

M = Character()
M.score.print_score()
print("---")
M.score.reset_social(max = K.score.social-1)
M.score.print_score()

Kのscoreは前述通り、固定値にしてあります。

Mのscoreは、Kのscoreの社会の点数よりも小さくないといけないので
Kのscoreから社会の点数を抜き出して、小さくするために1を減算します。

さて、実行するとどうなるでしょうか?

国語:97
数学:99
英語:95
社会:55
理科:100
---
国語:97
数学:99
英語:95
社会:79
理科:100

社会の点数のみ変化していればOKです。
まるで操作されたような点数ですが、たまたまです。


2-2. 次にRの点数を生み出します。

やることはMと同じです。
Kの英語の点数より大きくする手順を踏むだけです。

サクッとやってみましょう。
CharacterとScoreのクラスは変化しないので、中略します。

import random                                                                                                                                        

#######
# 中略 #
#######

K = Character()
K.score.japanese = 68
K.score.math     = 60
K.score.english  = 47
K.score.social   = 80
K.score.science  = 62

M = Character()
M.score.reset_social(max = K.score.social-1)

R = Character()
R.score.print_score()
print("---")
R.score.reset_english(min = K.score.english+1)
R.score.print_score()

Rの英語の点数は、Kの英語の点数より大きくする必要があるので
Kのscoreから英語の点数を抜き出して、大きくするために1を加算します。

さて、こちらを実行すると

国語:85
数学:40
英語:76
社会:59
理科:32
---
国語:85
数学:40
英語:87
社会:59
理科:32

英語の点数だけが変化していればOKです。

中々、全員いい感じの数値が出てくれてホッとしています。
ええ、ほんとたまたまいい数字が出てくれました。


3. ジュースを掛けた勝b。。。は次回ですか?

いぇすタイトルさん。少しずつ組み上がっていくところもプログラミングは面白いですからね。

今回は、彼らのセオリーに従った点数の補正をいい感じに掛けました。

今回は私が思う補正の掛け方や物語に合わせたルールを適用しましたが
例えば、別の教科でも同じように点数の補正は行えますし
更にランダムを重ねて、あなたの思い描くK,M,Rの点数っぽくしても良いでしょう。

色々工夫して遊んでみてくださいね。

次回はいよいよ、ジュースを掛けた勝負の部分を作ります。
どういう風に作るのが良さそうでしょうか?答えは1つではありませんのでぜひ、考えてみてください。


次回はこちら




では。

この記事が気に入ったらサポートをしてみませんか?