0コメント

私、浮気症なんで・・・【Java】【プログラミング】


この記事を見てもらえれば分かると思うんだけど、今までシェルスクリプトで記述してきたんだけど、

最近のトレンドはJava!大学もJava!TwitterもRubyからJavaに変わった!マイクラもJava!!!!!!



暇だし、Java言語勉強しよかな・・・と思った。

大抵、プログラミング技術って言うのはC言語で基本的な条件分岐・演算処理を学ぶわけですが、アルゴリズム的な制御って実務じゃないと身につかないと思うんですよね。

ですが、私はプログラミング言語を何も習得していないのに(あでも、C言語はヘッダー次第ある程度使えるんかな)そういう技術がある(高度ではないが)からこそ、シェルスクリプトで記述する事が出来たんですと。

だって、条件分岐・演算処理の基本的な関数を暗記したところで「じゃあそれで実用的なもん作れんの」って話になったら、まずどっから作ればいいかが分からないから。

何故私にそれが出来るのかって言うのは、マイクラのせい。
マイクラのコマンドで制御しミニゲームシステムを作っただの、PvPゲームシステムだの、エメラルドPvPだの、
どういう順序で、どういう仕組みで、どういうすれば簡単に組みやすくなるかってのを考える事が多かった。


例えば、ここにマイクラのfunctionが置いてあるので流れを見てみる。これはSkywarsという空中島でチェスト内のアイテムをあさって、PvPを行い生き残った者が勝利というゲームだが
スクリーンショット 2021-04-13 221158.jpg
まず、functionってのは一度に記述してあるコマンドすべてを一度に実行するって言うシステム。
それに、scoreboard...まあプログラミング言語でいう変数++みたいなもんだけど、それを使って
scoreboardが○○の範囲内であればこの処理をする、○○まではこの処理をする。
ってな書き方を自己流で記述しているので、実質プログラムの逐次実行って言う特性を再現してるんだけど

そのための時間制御用スコア加算から始まって、→ゲームシステム起動通知→ゲームステージfunctionから構築→特殊ルール設定→開始カウントダウン→PvP用アイテムチェストfunctionから呼び出してステージに設置→ゲームシステム起動→
で、起動中にif文で「もし○○であれば○○」を重ねて、終了条件にもif文で、条件適合で→終了処理function

…とまあ、こんな感じ。

これでコマンドは約300行程度。

しかし、実はこれ半年以上前の自信が記述したのでガバだらけなのだが、「オブジェクト指向プログラミング」ってのが実際取り入れられた構成をしている。
○ゲームステージfunction
○アイテムチェストfunction
○終了処理function
これだ。

javaでいうpublic static void main(String args[])がメイン関数、メインの流れだが
その他のprivate static void sushi()で宣言されたメソッドはサブ関数となる。
main関数内でsushi();とすることで呼び出す事が出来るのだが、

さっき記述した三つのfunctionはサブ関数だ。

メイン関数内、っていうかこのSkywarsの関数にこれら三つ、別のfunctionを呼び出している。
スクリーンショット 2021-04-13 225955.jpg
例えばこれがゲーム終了処理functionを呼び出している行だ。

終了処理functionがどういうことをやっているのかというと、
プレイヤーのゲームモード変更、プレイヤーのリス地リセット、アイテムリセット、スコアリセット、ステージリセット、終了処理後他のミニゲームが実行できる状態に待機させる初期設定
これらを実行するためにはコマンドが何行必要になるかというと、まあ50-70行くらいだったハズ。

それを一行に短縮してメイン関数にぶち込むというのは、とてもコードが見やすくなる。だらっだら色々な処理を数十行単位で書き綴っていたら当然わかりにくいし、この場合スコア・・・もとい、変数を独立させているのでメイン関数でこの処理を行う文をすべて詰め込んだから変数の管理もややこしくなって面倒だ。

じゃあどうするか、独立化させるわけ。

それがサブ関数。

あと、これら記述したの2019年だった。半年どころじゃないね


しかしまあ、実際にこうやって独立・・・いや、「オブジェクト化」させてミニゲームを制御するという記述方法を無意識に作っていたという、まあそれが現状の私が持つ実力だと思う。
まあ、もっと省略できるしややこしすぎるしって点はあるんだけどね('ω')

何が言いたいか。

プログラムは暗記じゃなく、アルゴリズムを組む技術の方が重要になってくると思う。

俺が持ってる技術とか偉そうに言ってるが、それに三年から四年マイクラで時間を費やしたから流石に素人として済ませるわけにはいかない。
せっかくなので、他の言語も触ってみよう!!!!!!!

という事で別言語に手を出してみようかなって考え付いた('ω')

ちなみにこういう思いと別に、トリガーがあって
大学で「基本Java言語を履修する」という情報を得たってのが大きいw

ちなみに高校ではC言語(情報技術検定二級程度のレベル)、C#(Unityの課題研究の時に独学で触った)、bash(C言語で開発されたスクリプト言語で、実際に作ったのはこういうの程度→https://nekoyama030330.seesaa.net/article/479148914.html https://nekoyama030330.seesaa.net/article/478641686.html)
マイクラのコマンドってのはプログラミング言語とは言えないからね・・・マジでマトモに開発するために触った言語なんて皆無だよ
C#は触って正解だったかもだけどね Javaと酷似してるからね
JavaScriptもマイクラのなんかで少し触ったな(json形式ファイルだが)


まあ、それはどうでもいいんだよ!!!!

とにかく、プログラミング言語を本気で触ってみようかなと思います。

JDK構築は多分できた
unknown.png

・・・多分。
スクリーンショット 2021-04-14 000908.jpg

実行でけた
スクリーンショット 2021-04-14 001434.jpg
日本語が入ってるとコンパイルできなかったけど、javacでちゃんとclassファイルを出力することもできるようだ。

ちなみにJava言語のプログラムはJVM上で動作させるからか、javaでclassファイルを実行しないとダメそうだ。

あと、classを逆コンパイル(デコンパイル)することで中身を確認する(ソースコードに戻す)事も出来るようだ。これはSpigot鯖でサーバーソフトウェアのバージョンを偽装してアプデに対応させようかと思って解析した時に見つけたんだけど、やはりコンパイル時に何かしら仕込んでおいて戻すことは難しいってこともあるのかな

てかコンパイルされたファイルってマシン語で記述されてるから、バイナリコードしか読み取れないはずなのに
デコンパイルできるってのは・・・ルール的には問題ないのだろうか?

んまあ、こんな記事書いていたら十二時を回っていたので今日はここら辺で寝ることにする。

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;
でinput/output関連の関数も使えるのかな?
        Scanner scan = new Scanner(System.in);        String str = scan.next();
でScanner型(importした内容に型が定義されてるんかな)scan変数に読み取った内容を入れて文字列型のstrにscan内nextメソッドの中身を・・・

こういうのって、仕組み自体は覚えず丸暗記した方が良いんだろうか(本末転倒)
誰だプログラムは暗記じゃないって言ったの!

('ω')

寝る。

この記事へのコメント