iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 3
1

上一篇我們在數字跟變數的叢林中繞阿繞的,可是我們似乎沒寫到任何一點程式阿!

別急~~~~

我們這就來點不一樣的!!

我們來寫個猜拳遊戲好了!

首先,我們需要定義一下剪刀石頭。我們先姑且用3個整數來代表他們好了。

paper = 1  # 這代表布
scissor = 2  # 這代表剪刀
stone = 3  # 這代表石頭

小提醒:程式當中的#註解,寫在他後面的文字不會被當成程式,也就不會被執行

很好,我們現在有了這3個不同的東西,之後呢?
接下來我們要定義規則,照我們的規則應該是石頭要優於剪刀,剪刀要優於布,布要優於石頭。

if判斷式

對於定義邏輯判斷來說,我們會用if來處理他,像是

if scissor > paper
    println("scissor win!!")
end

大家先別急!我會慢慢說明,在上面這段程式的第一行if scissor > paper中,Julia會去判斷if後面的scissor > paper運算是不是對的,如果是對的就會執行裡面的程式碼。

if <判斷式>
    <程式碼>
end

裡面的程式碼就會叫電腦把"scissor win!!"字樣印在螢幕上。基本上scissor的值是2,而paper的值是1,所以兩相比較之下,這個判斷式是對的,所以你會看到以下結果

scissor win!!

組織起來!

我可以期待使用者輸入一個數字來代表他出的拳,姑且用x代表好了,然後讓x去跟其他拳比較大小。
這邊要讓使用者輸入數字來代表出拳,那就需要readline(STDIN)的幫助囉~~

println("請輸入要出的拳,1代表布,2代表剪刀,3代表石頭:")
s = readline(STDIN)
x = parse(s)

這邊第一行先給使用者一點指示,接著會從終端機讀進使用者輸入的字,並且把他指定給s。注意,這邊讀進來的訊息會以**字串 (string)**的方式表示,跟我們想的整數有很大的不同。接下來,我們要把讀進來的字串轉成整數,我們就把s放到parse()這個函式裡,他會幫我們解析字串裡的內容,並且把他轉成相對應的值給我們,所以這時候x的值就會是整數了!

但是如果直接比較大小的話是會有問題的,因為stone的值是3,然而paper的值是1,照理說paper > stone應該要是對的才對,但是值卻不是。
我們這邊換成去確認x是誰好了!

if x == paper
    println("你出布")
elseif x == scissor
    println("你出剪刀")
elseif x == stone
    println("你出石頭")
end

當中的elseif是,當前一個判斷式是錯的時候,就會進到下一個判斷式中。

if <判斷式1>
    <程式碼1>
elseif <判斷式2>
    <程式碼2>
else
    <程式碼3>
end

<判斷式1>是對的就會執行<程式碼1>,如果是錯的就會判斷<判斷式2>是不是對的,是對的就會執行<程式碼2>,如果不是就會進到else當中,他會直接執行<程式碼3>
相對的是,如果<判斷式1>是對,<程式碼1>就被執行,<程式碼2><程式碼3>就會被忽略不執行囉~

所以我們的程式碼他會進一步判斷你出的拳是什麼囉~~

電腦怎麼出拳

我們希望電腦可以出拳,但是電腦要如何決定出什麼拳呢?

當然是隨機阿!

這時候就用用到Julia的亂數產生器了!

y = rand([1, 2, 3])

rand()這個函式他會幫我們從你給他的數字當中隨機抽出一個給我們,所以我們把1, 2, 3裝進盒子裡,放到函式的小括弧內,就變成了rand([1, 2, 3])這個樣子。這時rand()就會隨機指定一個值給y囉~~~

巢狀比較

現在我們假設使用者跟電腦都出了拳,那我們要怎麼決定到底誰贏誰輸呢?

if x == y
    println("平手")
...

我們先決定兩個人出的拳是不是一樣的,如果一樣那就是平手。

...
elseif x == paper
    println("你出布")
    if y == scissor
        println("電腦出剪刀")
        println("電腦贏了")
    elseif y == stone
        println("電腦出石頭")
        println("你贏了")
    end
...

這邊選擇再把一段判斷程式碼放到elseif當中,也就是判斷x == paper是對的之後,會進而判斷裡面的y == scissory == stone,當滿足任一個判斷式的時候就會自動顯示裡面的字樣囉~~

所以照這個方法寫出來完整的程式如下

if x == y
    println("平手")
elseif x == paper
    println("你出布")
    if y == scissor
        println("電腦出剪刀")
        println("電腦贏了")
    elseif y == stone
        println("電腦出石頭")
        println("你贏了")
    end
elseif x == scissor
    println("你出剪刀")
    if y == paper
        println("電腦出布")
        println("你贏了")
    elseif y == stone
        println("電腦出石頭")
        println("電腦贏了")
    end
elseif x == stone
    println("你出石頭")
    if y == scissor
        println("電腦出剪刀")
        println("你贏了")
    elseif y == paper
        println("電腦出布")
        println("電腦贏了")
    end
end

我想玩很多次!

當我想要一直跟電腦玩猜拳,那就需要用到迴圈的概念了。
這邊先介紹while,他的邏輯是這樣的

while <判斷式>
    <程式碼>
end

while後面的判斷式成立的話,他就會不斷執行裡面的程式碼片斷,當執行完一次之後,又會回頭檢查一次判斷式是否成立,直到判斷式不成立就會停止。這時候我們就要小心,要設定判斷式會不成立的狀況。

s = readline(STDIN)
x = parse(s)
while x != -1
    ...
    s = readline(STDIN)
    x = parse(s)
end

我們可以設定當使用者輸入-1的時候就跳出迴圈,也就當使用者不想玩的時候就可以輸入-1把程式停掉。迴圈的尾巴會再次的更新x,那就是下一次的輸入了,如此一來,程式就會回到前面去檢查x了。


上一篇
[Day 02] 進入Julia叢林—變數與數字
下一篇
[Day 04] Julia的函式
系列文
Julia語言—從入門到專案31

尚未有邦友留言

立即登入留言