第一部分
- 下載這個小專案的程式模板並回顧card類的定義。這個類已經執行了所以你的任務是自己熟悉下程式碼。開始,通過貼上card類定義到程式模板中並驗證我們的程式碼如預期那樣工作。
- 實現“__init__,__str__,add_card方法在Hand類裡面。我們建議建模hand作card列表物件,啥呢,儲存在Hand物件的域裡面。__init__類函式應該復位Hand物件來有一個空的card物件列表。add_card應該新增一個card物件到cards列表裡面。__str__函式應該返回一個代表Hand物件在一種可以人類閱讀的方式的字串。
為了幫你實現__str__函式,回去看看the solution的第四個問題在week 5a的練習題。記得使用字串函式對Card物件來將每張卡片在手牌卡片列表轉變成字串。(不要在add_card裡面將一張card物件轉換成字串來讓你的字串函式工作)一旦你應用Hand類,用測試模板來測試一下。
- Deck類的實現方法已經列在mini_project的模板中了。我們建議以列表的形式表達一副牌。你可以形成這個列表使用一對巢狀的for迴圈或者一個列表比較。記得使用Card初始化來建立你的卡片,使用random.shuffle()來洗牌。一旦你完成了Deck類,使用提供的測試模板測試你的Deck類,記得洗牌後deck變成隨機的了,所以輸出,測試模板應該在形式上但不需要在準確的數值對應備註裡面的輸出。
- 完成”Deal"的handler啥呢,洗牌並給莊家和玩家各兩張牌。事件handler deal對應這個按鈕應該洗牌(以全域性變數的形式儲存),建立新玩家和莊家(以全域性變數的形式儲存),並加給他們兩張牌。為了從一疊牌裡面發一張牌給到人家手裡,你應該聯合使用Deck類裡面的“deal_card" 函式和Hand類裡面的add_card函式。hands的結果應該被列印到控制檯待遇合適的資訊表明哪隻手是哪個。
- 實現Hand類裡面的get_value函式。你應該使用提供的VALUE字典來查詢單張卡片的值用視訊裡面的邏輯對這個專案來計算手牌的值。一旦你完成了get_value函式,利用提供的測試模板來測試一下。
- 完成”Hit"按鈕。如果手牌小於等於21,點選這個按鈕新增一個額外的卡片到玩家手中。如果按hit後值超過21,列印“你爆了”
- Remember the dealer wins ties in our version.完成“Stand"按鈕。如果玩家爆了,提醒玩家他已經爆了。否則,再次點選dealer直到他的手牌是17或者更大(使用while迴圈),如果莊家爆了,要讓玩家知道。否則,比較玩家和莊家手牌的數值。如果玩家的手牌低於或等於莊家的手牌,莊家贏。否則玩家贏,記得在我們的版本里面莊家贏得領帶。
在我們的blackjack版本中,當遊戲開始的時候一手牌自動的發給玩家和莊家。尤其,在復位的時候程式模板包含一個呼叫deal()函式。在這一點上,我們建議測試你的普遍的執行balckjack
第二部分
在第二部分,你將新增5個特寫。包括用全域性變數畫,記得復位這些變數來適當的值(就好像建立空白的手牌給玩家和莊家)在開始框架之前
- 完成你自己的draw函式對於hand類用draw函式,啥呢,card類裡面的draw函式。我們建議畫手牌作水平卡片序列在哪呢,pos引數位於左上角最左邊卡片,為了簡化你的程式碼,呢可以假設只有前五張玩家的手牌在畫布上是可見的。
- 通過畫文字資訊到畫布上代替列印到控制檯,我們建議新增一個全域性outcome字串變數啥呢使用draw_text在draw handler裡面。這些資訊應該提供給玩家去要求一些行為並且有類似“Hit or stand"和”新牌?“.另外,畫出遊戲的標題”balckjack"在畫布的任意位置。
- 使用全域性變數in_play新增邏輯來跟著是否玩家的手牌仍然在玩,如果仍然在玩,呢應該畫出一個卡片的背面圖案(模板有提供)超過莊家的第一個(hole)卡來隱藏它。一旦回合結束,莊家的牌應該被揭示
- 新增一個計分跟蹤輸贏次數,我們演示的是最簡單的情況,程式顯示出贏得次數減去輸得次數。當然,你也可以製作花哨一點的計分系統
- Modify the logic for the "Deal" button to create and shuffle a new deck (or restock and shuffle an existing deck) each time the "Deal" button is clicked. This change avoids the situation where the deck becomes empty during play.修改“deal"按鈕的邏輯來建立並洗一副新牌(或者重新進貨並且洗一副已經存在的牌)
- Finally, modify the
deal
function such that, if the "Deal" button is clicked during the middle of a round, the program reports that the player lost the round and updates the score appropriately.最後,修改deal函式,如果”Deal"按鈕在回合中已經按了,程式報告玩家輸了這局並且合適的更新比賽分數。
恭喜!你已經建立了黑傑克,為了包裹起來,請回顧我們視訊裡面的演示版本,包裝你的版本功能全面。
Grading rubric - 18 pts total (scaled to 100)
你一定要執行黑傑克最簡單的規則。跟我們的版本小小的不同是可以接受的,比如顯示手牌的值或者加入下注系統。但你不要更改遊戲的邏輯系統。在提交日期結束以後,歡迎提交你的加強版黑傑克比如新增雙倍下注。
- 1 pt - 程式在畫布上顯示“Blackjack”
- 1 pt - 控制區域顯示三個按鈕(“Deal","Hit"和”Stand“)
- 2 pts - 程式用圖片形式生動的顯示玩家的手牌。(1 pt如果文字顯示在控制檯)
- 2 pts - 程式生動的顯示莊家的手牌使用卡片圖片。莊家的卡片全部向上是允許的當計運算元彈的時候
- 1 pt - 莊家的底牌是隱藏的直到本局結束。在這局結束後,把他翻過來
- 2 pts - 按”Deal"會發兩張陪給玩家和莊家。(一方得1 pt)
- 1 pt - 在一回閤中按“Deal"按鈕會導致玩家這局失敗。
- 1 pt - 按”Hit"按鈕給玩家再添一張牌。
- 1 pt - 按“Stand"按鈕必要的情況下加一張牌給莊家。
- 1 pt - 程式準確的識別玩家是否爆了。
- 1 pt - 程式準確的識別莊家是否爆了。
- 1 pt - 程式正確的計算手牌值並且宣佈勝利者。基於訊息來評估。
- 2 pts - 程式準確的提供玩家和資訊”Hit or stand?"和“New deal?"(1 pt沒個資訊)
- 1 pt - 程式以計分形式正確的反應輸贏次數。這部分計分可以寬鬆一點
hand類怎麼做。停牌以後莊家底牌揭示。爆了以後莊家底牌揭示,顯示“You went bust and lose". Deal相當於重新開始,hand要實現什麼效果?什麼功能?視訊裡面有麼?有幾個引數,fild是啥,codeclinic
連續兩個mini project沒搞定了。現在再怎麼悔恨也沒用,上週重感冒一整週,從週日爬山開始回來就重感冒了,現在已經週二,八天了,仍然有點流鼻涕,還有點咳嗽,還有點痰,有點想做一個個人電子病歷本,就好像記賬有隨手記一樣。這個貌似是我的獨特想法?百度了一下好像沒人做呢。黑傑克這個project連URL都沒有提交,其實簡單的還是能夠得1分的,怎麼辦?姜鴻說碰到class類就不學了,姜鴻說全文翻譯沒用,也有點道理,挑重點的翻譯吧,能理解就行。無論如何也要提交URL,儘量完成這門課,程式設計並不是青春飯,我在微信公眾號上看到了一篇文章,雖然學習碰到了一點困難,知乎上有給出新的參考書目,我們還要嘗試,加油,我的掙扎不漂亮,我要掙扎。這周開局不錯,今天才星期二,quiz已經完成了。看看下班前能不能儘量把相關資訊翻譯完。看看自己的部落格,已經寫了4篇,我堅持了一個月,加油!上週經常從早上就開始忙,然後一忙就是一整天,但是我真正高效率的時間是上午,等我忙完已經下午了,這時候我再學python效率就不高了,不理解的時候經常有挫敗感,所以本週我儘量把工作內容放在下午,上午的時候用來學習python,效果不錯,今天週二,我已經連蒙帶唬把quize完成了。這個經驗很好。司馬遷的《史記》並不是太史公的工作內容,但是《史記》流傳千古,所以去做自己真正想做的事情吧。《小強升職記》說將任務放在籃子裡,專注把手頭的任務完成,這樣才井井有條,這個我執行了一次,感覺很不錯,“2分鐘內能完成的事情,馬上去完成”這個還沒執行,應該也是很有道理的。下午的時間如何利用,現在還沒找到規律。 - 本週的主要任務:半程馬拉松;完成spaceship,起碼要提交URL,健身胸背肩。我還記得自己的承諾,每週一篇部落格,超過800字。記錄自己的掙扎。
- 上週日去爬東莞銀瓶嘴,好久好久沒爬山了,久違的雲霧繚繞,就是人太多了,不過有個基友一起,感覺還是很不錯的,希望有空收集些新路線報給登山會長參考。