見出し画像

【AutoHotkey】おみくじとじゃんけんを作ってみる

AutoHotkeyのコードの書き方に慣れるために、簡単なプログラムを作ってみます。
私はJavaScriptは少し齧っていますが、プログラミングが得意なわけではないので、新しい言語だとよちよち歩きからのスタートです。どうせなので、他のよちよち歩きの人の参考になればと書いておくことにします。

まずはおみくじ。乱数とIf分岐を使います。

Fortune() {
  FormatTime,TimeString,,yyyy年M月d日	;変数TimeStringに指定したフォーマットで現在日時を代入する
  Random, r,1,4		;変数rに1から4までの範囲の乱数(整数)を代入する
  If r = 1
    Result = 大吉
  Else If r = 2
    Result = 吉
  Else If r = 3
    Result = 中吉
  Else
    Result = 凶
  MsgBox, %TimeString%の運勢は`n%Result%です	;ダイアログに結果を表示する
}
vk1D & F::Fortune() ;無変換キー+F

前回、日時を入力するにあたってIMEのオンオフがどうこうということを書きましたが、今回はダイアログの中に表示するので貼り付け用の関数は必要ありません。
Randomコマンドは、「Random, 変数,最小値,最大値」の形で変数に乱数を入れます。今回は変数をrにしましたが、rの部分は何でもいいです。

AutoHotkeyは文字列と変数名の区別の仕方がちょっと独特に思えます。JavaScriptとは違うので少し混乱しました。文字列と数字の型の区別もありません。
現時点で自分がわかったことをまとめますが、理解が不十分な可能性があります。この記事は個人の日記として読んでください。

;「=」で代入する
A = 文字列	;「文字列」という文字列をAに代入
A = 123
A = %B%		; 変数Aに変数Bの値を代入(変数は%で挟む)

;「:=」で代入する
A := "文字列"	;「文字列」という文字列をAに代入(""で囲む)
A := 123	;数字はそのまま
A := B		;変数Aに変数Bの値を代入(%で挟まない)

;Ifコマンド(括弧なし)
If A = 文字列	;囲まない
If A = %B%	;%で挟む

;IfIf (A = "文字列")	;""で囲む
If (A = B)		;%で挟まない

;コマンド内
MsgBox, 変数Aの中身は%A%です		;変数を%で挟む
MsgBox, % "変数Aの中身は" . A . "です"	;最初に「% 」を書いておくと文字列の方を囲む形になる

なお、エスケープ文字は「\(バックスラッシュ)」ではなく「`(バッククォート)」です。「`n」で改行を意味します。

上記のおみくじは細かくIf分岐しましたが、これだとすごく垢抜けない感じがします。選択肢が増えていくと大変です。
なので、If分岐ではなく配列を使った形に書き換えてみます。

Fortune() {
  FormatTime,TimeString,,yyyy年M月d日
  array := ["大吉","吉","中吉","凶"]
  Random, r,1,4
  MsgBox, % TimeString . "の運勢は" . array[r] . "です"
}
vk1D & F::Fortune()	;無変換キー+F

いくらかシュッとした感じがしますね。
なおJavaScriptでは添字(array[i]のiの部分)が0始まりですが、AutoHotkeyでは1始まりのようです。なので、array[1]に「大吉」が入っているということになります。

次はじゃんけんを作ってみます。

Janken() {
  InputBox, hand,じゃんけんゲーム,どの手を出しますか?(数字を半角で入力してください)`n1:グー`n2:チョキ`n3:パー
  If ErrorLevel <> 0	;キャンセルを選択した時はReturn
    Return
  If hand =		;空欄のままOKした場合もReturn
    Return
  Random, r,1,3		;1から3までの乱数
  array := ["グー","チョキ","パー"]
  If (hand = r)
    Result = あいこ
  Else If (hand = r - 1 || (hand = 3 && r = 1))	;「||」はOR、「&&」はAND
    Result = 勝ち!
  Else
    Result = 負け…
  MsgBox, % "結果は" .  "`nあなた:" . array[hand] . "`n相手:" . array[r] . "`n`n" . Result
  MsgBox, 4,,もう一度やりますか?
  IfMsgBox, Yes
    Janken()
}
vk1D & J::Janken()	;無変換キー+J

ちょっと複雑になったような感じがしますが、やっていることはほぼ既に登場したことの組み合わせです。

これでいつでもおみくじを引けるしじゃんけんで遊べます。…というのは大してありがたいことではありませんが、乱数と条件分岐とダイアログでの入力が使えればその組み合わせでかなり色々なことができるので、自由度は大きく上がったように思います。

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