ディレクターがコードを書く

webディレクターのネトゲ廃人がコード書きたくなってはじめたブログ。

"とりあえず即興でできればいい"コートの例

社内でチーム選定にPGが何かしらで割り振ってるらしいのですが、 都合により、割り振りがない時があったので、即興で書いてみた。

配列に突っ込んで配列の中身をランダムで並び替えて、よしなに表示すればいいかなー くらいの浅い考えで作ってみた。

use List::Util;

標準の配列操作できるモジュールを使用。 特に難しいことはなさそう。

my @data2 = List::Util::shuffle @data;

OK!shuffleで@dataの中をシャッフルして@data2に突っ込め!!!

print "$#data";
print "人\n";

何人いるんだろーねー。

if($#data == 15){
    以下人数によって表示出しわけ(じ・ん・り・き)

手動で配列の中を弄ったり、全然スマートじゃない。 ちょっとしたウォーミングアップ


use strict;
use warnings;
use List::Util;

my @data = qw (
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    ひとのなまえ
    );



my @data2 = List::Util::shuffle @data;


    print "$#data";
    print "人\n";


    if($#data == 15){
    # 15人
    print "team1------------------------\n";
    print "$data2[0]\n";
    print "$data2[1]\n";
    print "$data2[2]\n";
    print "$data2[3]\n";
    print "$data2[4]\n\n";

    print "team2------------------------\n";

    print "$data2[5]\n";
    print "$data2[6]\n";
    print "$data2[7]\n";
    print "$data2[8]\n";
    print "$data2[9]\n\n";

    print "team3------------------------\n";

    print "$data2[10]\n";
    print "$data2[11]\n";
    print "$data2[12]\n";
    print "$data2[13]\n";
    print "$data2[14]\n\n";

    }

    elsif($#data == 14){
    # 14人
    print "team1------------------------\n";
    print "$data2[0]\n";
    print "$data2[1]\n";
    print "$data2[2]\n";
    print "$data2[3]\n\n";

    print "team2------------------------\n";

    print "$data2[4]\n";
    print "$data2[5]\n";
    print "$data2[6]\n";
    print "$data2[7]\n";
    print "$data2[8]\n\n";

    print "team3------------------------\n";

    print "$data2[9]\n";
    print "$data2[10]\n";
    print "$data2[11]\n";
    print "$data2[12]\n";
    print "$data2[13]\n\n";
    }

elsif($#data == 13){
    # 13人
    print "team1------------------------\n";
    print "$data2[0]\n";
    print "$data2[1]\n";
    print "$data2[2]\n";
    print "$data2[3]\n\n";

    print "team2------------------------\n";

    print "$data2[4]\n";
    print "$data2[5]\n";
    print "$data2[6]\n";
    print "$data2[7]\n";
    print "$data2[8]\n\n";

    print "team3------------------------\n";

    print "$data2[9]\n";
    print "$data2[10]\n";
    print "$data2[11]\n";
    print "$data2[12]\n\n";
    }

elsif($#data == 13){
    # 13人
    print "team1------------------------\n";
    print "$data2[0]\n";
    print "$data2[1]\n";
    print "$data2[2]\n";
    print "$data2[3]\n\n";

    print "team2------------------------\n";

    print "$data2[4]\n";
    print "$data2[5]\n";
    print "$data2[6]\n";
    print "$data2[7]\n\n";

    print "team3------------------------\n";

    print "$data2[8]\n";
    print "$data2[9]\n";
    print "$data2[10]\n";
    print "$data2[11]\n\n";
    }










あけましておめでとうございます

あけましておめでとうございます。

季節とは速いものでもう1日です。

2013年はいろいろあって何がしかアレしようとしたり、ネトゲをやりこんだりいろいろとあったったようで、何もなかったような。

(略)

今年もよろしくお願いします。

いやー1日ですよ1日、お年玉とか三が日はごろごろと・・・

え?2月?1月じゃないの?

1月どこ行ったの?

1月ドコ?

ドコ?

ドコドコ?

・・・・・

ディレクターがコードを書く。はっじまるよー!

さて、進捗です。

前回のお遊び//レベルアップポイントを計算する - ディレクターがコードを書くから約1か月

更新なかったけど、やってたりしてたのに更新してなかったのを深く反省。しないかもしれません。

ハッシュ。サブルーチン当たりをみてほほぉーとか言ってたと思います。

言ってたと思います。というのもほとんどシミュの方をいじってたため、ほぼ勉強っぽい勉強をしてません。

必要にあったらみたいな。

以前社内の同期PGに「早く作れよー」と言われて「たぶん8月くらいじゃないかー?」と言ったけど

すまん、あれは嘘だ。

だいたい出来た( 'ω')

f:id:kwsmD:20140201112235p:plain

仕様についてまとめ

レベルアップに関する仕様

  • レベルの上限は255
  • レベルアップするとポイントを付与する
  • レベルに応じて付与するポイントが異なる
  • レベルアップ時、選んだ"先行"によってステータス1種が1上昇しもう1種は50%の確率で1上昇する
  • レベルアップ前に"先行"を選べる

ステータスについての仕様

  • ステータスの上限は255
  • ステータスの種類は7種
  • レベルアップ時に付与したポイントを消費してステータスを上昇することができる
  • ステータスアップに必要なポイントはレベル、現ステータス、初期ステータスによって変動する

こんな感じだったかな

前回からの実装経過

  1. レベルにに応じたポイント付与できた
  2. 1種のステータスに振リ続けるように実装
  3. 2の実装がおかしいことに気が付く。
  4. ステータスアップに必要なポイントがレベルごとになっていたが原因 ->ステータスごとに修正
  5. ステータスを任意で指定できるように実装
  6. 先行でレベルアップ時にステータスが上がるように実装
  7. 先行を任意指定できるように調整
  8. わからなくなってきたからutf8対応()
  9. 表示調整

くらいのステップが合った気がする。。。。

コード類 kwsmD/tw_levelupsimulator · GitHub

9割ifで書いてるけどな!!111111

追加機能を入れたいのでそのときリファクタリングかな

たぶん追加機能が今ある知識じゃ無理だからまた本見ながらとかかな

キャラクターの設定ファイルを外に逃がすとか、ログを出すとかそこらへん。

あとwebで動くようにするのにどうするかも調べたり、やることあるぞー!ふぉー!

お遊び//レベルアップポイントを計算する

モチベーションアップ回

そもそもperlを勉強をしようと思ったネトゲのシミュレータを。 合間合間に作りながらやっていこう。と思う。

何のシミュレータか。

パラメータのシミュレータである。

無料オンラインゲーム テイルズウィーバー公式サイト

レベルアップするとポイントがもらえ、自分で割り振る。。。 という形式はオンラインゲームではなくてもよくみると思う。

ただクセがあり、ランダムで一定確率で上がったり、そもそもLv1≠1point。ステータスの振り具合によって必要ポイントが違ったりと、まあ複雑な仕様になっているのでそれを再現したい。

幸いにもhttp://oresim.visithp.jp/先人が仕様については分析しているので実装は見ず、思考錯誤しながらなぞるように実装できればいいなー。と思っている次第。

まずはレベルアップとポイント

レベルアップでもらえるポイントか下記の内容らしい。

LvUp // POINT上昇値

Lv
1 - 6     -> 2
7 - 22    -> 3
23 -48    -> 4
49 - 80   -> 5
81 - 129  -> 6
130 - 175 -> 7
176 - 235 -> 8
236 - 255 -> 9

レベルの上限が255と8bitかよと突っ込みたくなるレベル上限である(今は解放されたがとりあえず255で)

サンプル例題

今ある知識で遊べる程度にコードを書いて遊んでみる。

  • レベルアップでポイントを加算し、その内容を表示せよ
  • POINT上昇値はレベルに応じて変動せよ

かな。

コード内容

my  $level = 1;
my  $point = 0;
my    $totalpoint;

for my $level(1..255){
    if( $level < 6){
        $totalpoint = $totalpoint + 2;
            print "Level:"."$level\n"."Point:"."$totalpoint\n"."\n";
    }
    elsif( $ level < 22){
        $totalpoint = $totalpoint + 3;
            print "Level:"."$level\n"."Point:"."$totalpoint\n"."\n";
    }
    elsif( $ level < 48){
        $totalpoint = $totalpoint + 4;
            print "Level:"."$level\n"."Point:"."$totalpoint\n"."\n";
    }
    elsif( $ level < 80){
        $totalpoint = $totalpoint + 5;
            print "Level:"."$level\n"."Point:"."$totalpoint\n"."\n";
    }
    elsif( $ level < 129){
        $totalpoint = $totalpoint + 6;
            print "Level:"."$level\n"."Point:"."$totalpoint\n"."\n";
    }
    elsif( $ level < 175){
        $totalpoint = $totalpoint + 7;
            print "Level:"."$level\n"."Point:"."$totalpoint\n"."\n";
    }
    elsif( $ level < 235){
        $totalpoint = $totalpoint + 8;
            print "Level:"."$level\n"."Point:"."$totalpoint\n"."\n";
    }
    elsif( $ level < 256){
        $totalpoint = $totalpoint + 9;
            print "Level:"."$level\n"."Point:"."$totalpoint\n"."\n";
    }
#    print "$totalpoint\n";
}

解説

for my $level(1..255){

forでレベルアップをLv1~255まで処理をループさせる。

    if( $level < 6){
        $totalpoint = $totalpoint + 2;

    elsif( $ level < 22){
        $totalpoint = $totalpoint + 3;

    elsif( $ level < 48){
        $totalpoint = $totalpoint + 4;

    elsif( $ level < 80){
        $totalpoint = $totalpoint + 5;

    elsif( $ level < 129){
        $totalpoint = $totalpoint + 6;

    elsif( $ level < 175){
        $totalpoint = $totalpoint + 7;

    elsif( $ level < 235){
        $totalpoint = $totalpoint + 8;

    elsif( $ level < 256){
        $totalpoint = $totalpoint + 9;

それぞれ $levelの内容に応じてtotalpointを加算し、レベルに応じたポイントを付与(加算)する。

結果:

f:id:kwsmD:20131226215716p:plain

見切れる(爆)

でもまぁ正常通り動いていそう。

Lv255時に所持するポイントは1607ポイントでした!

基礎編④//配列とforループ

そろそろ理解が難しくなってきました。

配列

  • 数字や文字をまとめて格納できる便利な子。
  • 能力パラメータという中にそれぞれの能力格納しておけば別々に定義しなくてもOKってことだよね!
  • 程度の認識。実際実装段階にならないとイメージつかなそう。
my @array = (1, "hoge" , 3);

# 配列の場合は変数名の前に@をつける必要がある。

print    "@array\n";

# 配列の中身を1つずつ表示する場合は@ではなく$を使用

print    "$array[0]\n";
print    "$array[1]\n";
print    "$array[2]\n";

実行結果

f:id:kwsmD:20131225220748p:plain

ふむふむ。内容は理解しつつ、使い方のイメージがわかないなぁ・・・。 という感想

forループ

  • 繰り返し行う場合に使う
  • forの()の条件で繰り返し処理が走る
my @array = (1, "hoge" , 3);

for my $var ( @array){

# この場合、@arrayの[0]から順番に再生される。
# 指定の回数を繰り返したいの場合(1...10)のよう記述する

    print "$var\n";
}
    

実行結果

f:id:kwsmD:20131225221232p:plain

よしよし。

今日はここまで。

明日は今までの知識で遊ぶ回で。

基礎編③//制御構文と比較

どうも、githubのsshのkeyを設定した後で詰んでいるkwsmDです。

難易度高ッ!

プロジェクトdGithubを使っているのですがディレクター職がpush等することはないのでそっから。 いずれはできるようになりたいところですが時間がつぶれすぎてしまったのでとりあえずコードを書くところから

制御構文

  • ifとelseのアレ

サンプル

my $hoge = 15;

if ( $hoge = 15 ) {
    print "OK\n";
} else {
    print "NG\n";
}

もし(if) $hogeの内容が15だった場合{}の中を実行 -> この場合print "OK\n";
結果 -> OK の表示

違った場合(else) $hogeの内容が15じゃなかった場合はこっち(else)の{}の中を実行 -> この場合print "NG\n";
結果 -> NG の表示

となる。

条件が複数の場合は

my $hoge = 15;

if ( $hoge = 15 ) {
    print "OK\n";
}
elsif( $hoge = 20 ) {
    print "+5\n";
}
elsif( $hoge = 10 ) {
    print "-5\n";
}
elsif {
    print "NG\n";
}

elsifでつなげる。

比較

()と()を比較する場合に使用するもの

== // 右辺と左辺が等しいならば真
!= // 右辺と左辺が等しくないならば真
<  // 右辺より左辺が小さいならば真
>  // 右辺より左辺が大きいならば真
<= // 右辺が左辺以上ならば真
>= // 右辺が左辺以下ならば真

ex.

$hoge = 1;
$hage = 1;

if( $hoge == $hage){
  print '$hoge=$hoge\n';
}

# 該当のためprintの内容を表示

みたいな使い方ですね。

エクセルでも似たようなのをよく使っています(震え声)

練習問題

  • 簡単な数当てゲーム question_num.plを作成しよう
  • 端末から数字を一つ入力し, その数字が$answerと一致したらOK, $answerより大きければtoo big, 小さければtoo smallと表示する
  • オプション: 入力した値が, $answerから-5+5の範囲内($answerが10なら, 5~15)の場合, nearと表示するようにしてみよう

※この練習問題はPerl Entranceを参考にしております。

hmhm。なるほど。

エクセルだと

=IF(A1=10,"OK",IF(A1>15,"too big",IF(A1<5,"to small",IF(A1-5>10,"near",IF(A1-5<15,"near","null")))))

こんな感じですかね!(カオス)

冗談さておき実行。

コード

use strict;
use warnings;


my     $input = ;
my    $anser =10;


    if( $input == $anser){
        print "OK\n";
    }
    elsif( $input > $anser + 5){
        print    "too Big\n";
    }
    elsif( $input < $anser - 5 ){
        print    "too small\n";
    }
    elsif( $input  > $anser - 5 ){
        print "near\n";
    }
    elsif(    $input > $anser + 5 ){
        print "near\n";
    }   

実行結果

f:id:kwsmD:20131224213214p:plain

若干違う気もするけども、問題はクリアできている感。

プログラム自体、求められている内容の解は複数あるけど、実用レベルになるとある程度これが良い。みたいのあるんだろーなー。 と思いつつ、経験を積んで行こ。

基礎編②//標準入力と四則演算子

さて今日もゴリゴリと書いていく。

標準入力と四則演算

  • 標準入力

<STDIN>で端末から入力。$hogehoge = <STDIN> で変数$hogehogeに格納できる。

ここらへんはエクセル使っていれば普通にわかるところ(のはず)

やってみる

めんどくさいので2つまとめてごりっと整形して出力。

use strict;
use warnings;


my $str = <STDIN>
#  <STDIN>//入力を求める大事なヤツ

 chomp $str;
# chomp//改行を消す

my $hoge = 1;
my $res;

 print '$str = '."$str\n";
 print '$hoge ='."$hoge\n";
# 今変数に何が入っているか表示。かーらーのー。


 $res = $hoge + $str;
     print '$hoge + $str = '."$res\n";

 $res = $hoge - $str;
     print '$hoge - $str = '."$res\n";

 $res = $hoge * $str;
     print '$hoge * $str = '."$res\n";

 $res = $hoge / $str;
     print '$hoge / $str = '."$res\n";

 $res = $hoge % $str;
     print '$hoge % $str = '."$res\n";

 $res = $hoge ** $str;
     print '$hoge ** $str = '."$res\n";
# <STDIN>で入力された数字を$srtに格納して$hogeと四則演算

出力結果

f:id:kwsmD:20131221093837p:plain

問題ないかと。

整形しちゃうあたり、性分という感じですが

コードがきれいかどうかは判断つかない

まだまだ順調そう。

基礎編①//表示・変数

たくさんのツイート、はてぶ、コメントありがとうございます。

ブログすらたどたどしいですが、まったりとやっていきます。


さて、順を追ってやっていくに当たり最初は

Perl Entrance

こちらのPerl入学式の資料を教科書として進めて移行とおもってます。

表示・変数的なアレ

my $test = "Hello,Perl";
print "$test\n";

はい、定番(?)のアレですね。

f:id:kwsmD:20131220203808p:plain

前にC++をいじったので雑な感じの所感はありそうで、ない

練習問題をやってみる

  • 自分の名前, 年齢, 身長などの情報をそれぞれname, age, heightといった変数に格納し, それらの値を出力するスクリプトprofile.plを作成しよう

hmhm。

さらさらさら~

どや。

f:id:kwsmD:20131220204844p:plain

おぉkwsmDよ。こんな所でつまづくとはなさけない。

変数の$を忘れていました。てへぺろ

修正修正。

my $name = "kwsmD";
my $age = "twenties";
my $height = "normal";

print "$name\n$age\n$height\n";

f:id:kwsmD:20131220205058p:plain

問題ないようですね。

$と;を忘れやすいので注意ですね。 あとmyも忘れがち(どんだけ忘れるんだよ)

忘れやすいって書いとかないと覚えないからね!!!

覚えたばかりのをゴリゴリわふー!って書いてたりすると大体忘れてるという反省。

普通に楽しいわー。