Julia でじゃんけんゲームを書いてみる

20200306004319

いつものじゃんけんゲームを Julia のお勉強として書いてみました。Julia のバージョンは 1.0.4 です。
janken.jl

using Printf

mutable struct Person
    name::String
    wincount::Int
    hand::Int
end

function judge(player1::Person, player2::Person)
    show_hand(player::Person) = ["グー", "チョキ", "パー"][player.hand]
    
    @printf("%s 対 %s で ", show_hand(player1), show_hand(player2))
    
    winner = player1
    if player1.hand == player2.hand
        println("引き分けです。")
        return
    elseif (3 + player1.hand - player2.hand) % 3 == 1
        winner = player2
    end
    println("$(winner.name)の勝ちです。")
    
    winner.wincount += 1
end

function game(player1::Person, player2::Person, i::Int)
    println("*** $(i)回戦 ***")
    
    n = ""
    while true
        n = Base.prompt("$(player2.name)の手を入力して下さい(1:グー, 2:チョキ, 3:パー)")
        if n == "1" || n == "2" || n == "3" ; break end
    end
    player2.hand = parse(Int, n)
    
    player1.hand = rand(1:3)
    
    judge(player1, player2)
end

function winner(player1::Person, player2::Person)
    p1 = player1.wincount
    p2 = player2.wincount
    
    print("\n*** 最終結果 ***\n$(p1)$(p2) で ")
    
    final_winner = player1
    if p1 == p2
        println("引き分けです。")
        return
    elseif p1 < p2
        final_winner = player2
    end
    
    println("$(final_winner.name)の勝ちです。")
end

function main()
    pc = Person("Computer", 0, 0)
    
    name = Base.prompt("あなたの名前を入力して下さい")
    if name == "" ; name = "名無し" end
    player = Person(name, 0, 0)
    
    print("$(pc.name) 対 $(player.name) :じゃんけん開始\n\n")
    
    for i in 1:5 game(pc, player, i) end
    
    winner(pc, player)
end


main()

Julia はオブジェクト指向言語ではないですね。コードの見た目はすっきりした感じです。


Go言語版はこちらです。リンク先に他の言語での実装もまとめてあります。
Go言語でじゃんけんゲーム - Camera Obscura