国产露脸精品国产沙发|极品妇被弄得99久九精品亚洲|亚洲va成精品在线播放人|日韩精品久久久免费观看

    
    

        <delect id="w59je"></delect>

            當(dāng)前位置:首頁 > 乒乓球資訊 > 正文內(nèi)容

            Python語言難學(xué)嗎?第15講實(shí)操小游戲項(xiàng)目

            杏彩體育3年前 (2022-12-01)乒乓球資訊49

            想談?wù)勔粋€(gè)項(xiàng)目一般是怎么完成的。更具體的說,程序員是如何思考和解決問題的呢?

            我認(rèn)為其中一個(gè)很重要的能力是【問題拆解】。問題拆解,指的是在做一件事或面對一個(gè)問題的時(shí)候,將其拆解成多個(gè)步驟或多個(gè)層次,逐步執(zhí)行和解決問題,直至達(dá)到最終效果。

            舉個(gè)例子,在上一關(guān)的末尾,我們就將一個(gè)猜數(shù)字游戲拆解成四個(gè)目標(biāo):

            當(dāng)然這種拆解問題的思維并不少見。不過可能是出于長期編寫代碼的習(xí)慣,程序員會(huì)將問題拆得更細(xì)致一些,即拆到無法再拆為止。

            像這樣,我會(huì)將完成一個(gè)項(xiàng)目的流程總結(jié)為以下三步:

            明確項(xiàng)目目標(biāo),是指我們希望程序達(dá)成什么目的,實(shí)現(xiàn)什么功能,從而幫我們將項(xiàng)目拆解成不同的單元;而一個(gè)妥當(dāng)?shù)牟鸾夥桨?,難度適度遞增,能幫我們逐步順利執(zhí)行,最終完成項(xiàng)目。這三個(gè)步驟可以說是環(huán)環(huán)相扣的。

            明確項(xiàng)目目標(biāo)

            在互聯(lián)網(wǎng)公司,一般情況下是由產(chǎn)品經(jīng)理提出明確的項(xiàng)目需求,由程序員來實(shí)現(xiàn),他們之間是“相愛相殺”的關(guān)系。:)

            今天且讓我扮演一下產(chǎn)品經(jīng)理的角色。我們此次要實(shí)現(xiàn)的需求是:人機(jī)PK小游戲。具體效果請參照下面的示意動(dòng)圖。

            簡單來說,這個(gè)游戲中,會(huì)隨機(jī)生成玩家和敵人的屬性,同時(shí)互相攻擊,直至一方血量小于零。

            另外,這樣的戰(zhàn)斗會(huì)持續(xù)三局,采取三局兩勝制,最后輸出戰(zhàn)斗結(jié)果,公布獲勝方。

            確了項(xiàng)目要實(shí)現(xiàn)什么效果后,就可以對項(xiàng)目進(jìn)行拆解了。

            分析過程,拆解項(xiàng)目

            編寫代碼,我們無須苛求一步到位。尤其對于剛接觸編程的學(xué)習(xí)者來說,層層遞進(jìn)、逐漸提升難度才能達(dá)到更好的練習(xí)效果。

            了讓你暖暖身,同時(shí)照顧大部分同學(xué)的學(xué)習(xí)節(jié)奏,我從“功能疊加、難度遞增”這個(gè)角度考慮,將我們要實(shí)現(xiàn)的小游戲拆分成了三個(gè)版本。

            版本1.0,主要是幫我們理清戰(zhàn)斗邏輯。而版本2.0和3.0,會(huì)涉及到一些新的知識點(diǎn),到時(shí)遇到了再和大家介紹。

            當(dāng)項(xiàng)目被清晰地拆解后,剩下的就是去逐步執(zhí)行,也就是重復(fù)“執(zhí)行→遇到問題→解決問題→繼續(xù)執(zhí)行”這個(gè)循環(huán)的過程。

            下面,開始正式寫代碼咯

            逐步執(zhí)行,代碼實(shí)現(xiàn)

            版本1.0:自定屬性,人工PK

            第一階段的代碼,主要任務(wù)是理清戰(zhàn)斗的邏輯,再用print()函數(shù)將戰(zhàn)斗過程打印在終端。

            先來思考一下,一個(gè)人機(jī)PK游戲最基礎(chǔ)的元素是什么,可以拿最經(jīng)典的拳皇游戲來腦補(bǔ)一下。

            根據(jù)這一版本的設(shè)定,我們要做的主要有三步:1.規(guī)定并顯示出玩家和敵人的屬性 2.雙方同時(shí)互相攻擊,血量根據(jù)對方的攻擊力扣除 3.若有一方血量小于等于0,游戲結(jié)束。

            為了讓我們的思路保持清晰,畫成流程圖就是這樣子的:

            這個(gè)版本的所有步驟,都還很不“智能”,只用到了唯一一個(gè)函數(shù)Print()。也就是說,我們只要把步驟一個(gè)一個(gè)打印上去,就算成功啦。

            好,我們從第1步開始:設(shè)定【玩家】和【敵人】的屬性,即【血量】和【攻擊】。

            第2步:手動(dòng)計(jì)算攻擊一次,雙方各自所剩的血量。

            第3步:繼續(xù)做人工計(jì)算:算一算,玩家攻擊2次敵人,敵人的血量就等于0了,這時(shí)候可以結(jié)束戰(zhàn)斗,打印游戲結(jié)果。

            很簡單吧!現(xiàn)在我們要做的,就是把這三段代碼拼起來,然后我會(huì)加一些修飾視覺的換行符和分割線,讓運(yùn)行結(jié)果看得更清楚一點(diǎn)。

            現(xiàn)在,請你直接運(yùn)行一下代碼,看看結(jié)果是不是如我們所愿。

            唔...雖然看起來還有點(diǎn)兒意思,但所有信息一下子都蹦跶出來,一點(diǎn)都沒有體現(xiàn)游戲的進(jìn)程感。

            所以,為了讓打印出的東西能有時(shí)間間隔地依次出現(xiàn),我們需要設(shè)置一個(gè)類似“計(jì)時(shí)器”的東西。在Python里,我們需要用到兩行代碼來實(shí)現(xiàn):(敲黑板,很簡單的新知識)

            這里有個(gè)新名詞——模塊,它是Python里一個(gè)重要的概念,會(huì)在之后的課程詳細(xì)介紹。

            你可以把模塊想象成是一個(gè)裝著許多神奇函數(shù)的百寶箱,不過想要使用這個(gè)百寶箱里的函數(shù),得先用import 模塊名這樣一句代碼來打開它。

            然后這里我們想使用time模塊里的sleep()函數(shù),也就是讓代碼運(yùn)行結(jié)果不要一次性全部出現(xiàn),而是分批分批的出現(xiàn)。就要寫成time.sleep(secs)的形式。

            如果我想設(shè)置成打印的信息間隔1.5秒出現(xiàn),代碼就可以這么寫:

            呼~總算完成了版本1.0,不過我想你一定在心里默默吐槽,一句句用print()寫也太蠢太弱雞了吧。

            沒錯(cuò),不過代碼嘛,總得一步步實(shí)現(xiàn)。就先當(dāng)作是小小的熱身。

            而且,這個(gè)版本的代碼還有兩個(gè)明顯的缺陷:一是玩家和敵人的屬性(血量&攻擊)是我自己說了算,那勝負(fù)早已沒有懸念;二是戰(zhàn)斗過程中血量的變化要自己手動(dòng)算,那要計(jì)算機(jī)有何用?

            放心,這些都是我們會(huì)在版本2.0解決的問題。

            版本2.0:隨機(jī)屬性,自動(dòng)PK

            如前所述,這個(gè)階段,我們主要新增【隨機(jī)屬性】和【自動(dòng)戰(zhàn)斗】兩個(gè)功能,畫成流程圖是這樣子的:

            想一想:自己來定義雙方角色的屬性,那簡直是黑箱操作,勝負(fù)早已注定。所以,為了游戲公平,我們要讓屬性由自己說了算變成隨機(jī)生成。

            現(xiàn)在問題來了,要隨機(jī)生成屬性(數(shù)字),這課堂里又沒教。怎么辦?

            百度一下你就知道~

            遇到卡點(diǎn)后上網(wǎng)搜索,其實(shí)就能解決目前你絕大多數(shù)的問題。“不懂就查”也是程序員的工作習(xí)慣之一。

            要隨機(jī)生成整數(shù),就要用到random模塊里的randint()函數(shù),括號里放的是兩個(gè)整數(shù),劃定隨機(jī)生成整數(shù)的范圍。

            好,可以動(dòng)手敲代碼了!

            請聽題:1.定義兩個(gè)變量,來存儲(chǔ)玩家血量和玩家攻擊力的數(shù)值 2.血量是100-150的隨機(jī)數(shù),攻擊力是30-50的隨機(jī)數(shù) 3.將兩個(gè)變量打印出來

            標(biāo)準(zhǔn)的變量名最好是用英文來表達(dá)含義,如果是多個(gè)單詞組成,需要用英文下劃線_來隔開。

            對于取英文變量名,很多英語水平在高考即巔峰的同學(xué)會(huì)感到頭疼,這里我推薦大家一個(gè)網(wǎng)站:CODELF,輸入中文就可以看到別人是怎么命名的。

            好,我們已經(jīng)知道如何生成隨機(jī)屬性,下面我們就要將屬性展示打印出來,請閱讀下列代碼,弄懂每一行的含義:

            那截至目前,我們已經(jīng)完成了隨機(jī)生成屬性和展示屬性,接下來我們就來實(shí)現(xiàn)"自動(dòng)戰(zhàn)斗"。

            要怎么實(shí)現(xiàn)自動(dòng)戰(zhàn)斗呢?如果一頭霧水的話,可以先嘗試從版本1.0的人為戰(zhàn)斗來尋找規(guī)律:

            我們可以發(fā)現(xiàn),4-6行這3行是重復(fù)出現(xiàn)的結(jié)構(gòu),除了數(shù)字是靈活變動(dòng)之外,其余是一毛一樣的。

            根據(jù)我們已學(xué)知識,用循環(huán)來解決重復(fù)勞動(dòng)!

            說到循環(huán),我們就要思考是要使用for循環(huán)還是while循環(huán)了。

            因?yàn)楝F(xiàn)在雙方的血量和攻擊是隨機(jī)生成,不是固定的。所以我們不知道具體要戰(zhàn)斗多少回合才能分出勝負(fù),也就是循環(huán)次數(shù)不明確,那自然要用while循環(huán)。

            所以我們現(xiàn)在確定了讓循環(huán)執(zhí)行需要滿足的條件就是——雙方血量均大于零,也就是不死不休。

            可見while后面要同時(shí)滿足兩個(gè)條件,即這兩個(gè)條件要同時(shí)為真,所以我們要用and來連接,用代碼來表示就是:

            現(xiàn)在我們確定了執(zhí)行while循環(huán)的條件,接下來就是要填充循環(huán)內(nèi)部的內(nèi)容。

            根據(jù)剛才的分析,我們希望循環(huán)的內(nèi)容是雙方互相攻擊,掉血的過程。

            其中【敵人】剩余血量=敵人當(dāng)前血量-玩家攻擊,【玩家】剩余血量=玩家當(dāng)前血量-敵人攻擊。

            事實(shí)上我們之前已經(jīng)定義好了這四個(gè)變量,每一次互相傷害后,player_life(玩家血量)和enemy_life(敵人血量)都會(huì)被重新賦值,所以轉(zhuǎn)換為代碼邏輯就是:

            好,自動(dòng)攻擊的基礎(chǔ)邏輯也已經(jīng)理清楚了。我們先合并一下這之前寫過的代碼。

            接下來,只需要補(bǔ)充完成while循環(huán)語句,讓雙方自動(dòng)戰(zhàn)斗、扣血的過程循環(huán)起來

            應(yīng)該能感受到,版本2.0總算像模像樣了,慢慢逼近我們的項(xiàng)目目標(biāo)。

            不過它還沒有實(shí)現(xiàn):打印出每局結(jié)果,三局兩勝,并打印最終戰(zhàn)果的功能。這就是我們在版本3.0要增加的功能。

            版本3.0:打印戰(zhàn)果,三局兩勝

            對比版本2.0,在版本3.0中,我們想要增加的功能是:1.打印戰(zhàn)果:每局戰(zhàn)斗后,根據(jù)勝負(fù)平的結(jié)果打印出不同的提示;2.三局兩勝:雙方戰(zhàn)斗三局,勝率高的為最終贏家。

            反復(fù)解釋新增功能,是因?yàn)檫@樣不斷地明確項(xiàng)目的階段性目標(biāo),可以讓自己持續(xù)專注地推進(jìn)項(xiàng)目。

            好啦,我們繼續(xù)前進(jìn)。版本3.0也只剩最后的“三局兩勝”了!

            同樣的,我們可以將其拆分成兩個(gè)部分:先來個(gè)三局,再判斷最終勝負(fù)。

            首先我們來看,三局戰(zhàn)斗也是一個(gè)可以循環(huán)的結(jié)構(gòu),且循環(huán)次數(shù)是固定的,所以要用到for循環(huán)。

            在這里我們可以使用for i in range( )的結(jié)構(gòu),我們先來回顧一下之前學(xué)過的range()函數(shù):

            現(xiàn)在,你有思路了嗎?嘗試把代碼打出來吧,讓戰(zhàn)斗循環(huán)三局。

            給兩個(gè)提示:1.想清楚哪些代碼要嵌套到for循環(huán)里,即一局戰(zhàn)斗里包括什么信息。確定了for寫在哪里之后,一局戰(zhàn)斗包含的所有信息都要縮進(jìn);2.細(xì)節(jié)也需要留意,如局與局之間要怎么區(qū)分開來(時(shí)間間隔&打印局?jǐn)?shù)信息)

            如果做起來有些障礙,檢查一下是否存在上面提示的這幾個(gè)問題:

            1. for循環(huán)語句的位置放的對不對?這個(gè)關(guān)鍵在于,你想讓哪些信息被循環(huán)展示。例如:如果你錯(cuò)將for循環(huán)語句放在了【隨機(jī)屬性】 和【自動(dòng)戰(zhàn)斗】之間,那每一局的戰(zhàn)斗信息會(huì)是一樣的,也就不存在什么三局兩勝了。

            2.你寫完for循環(huán)語句后,需要縮進(jìn)的信息【整體】縮進(jìn)了嗎?如果沒有縮進(jìn),可能存在報(bào)錯(cuò),或者只有部分戰(zhàn)斗信息循環(huán)的情況。

            3.細(xì)節(jié)注意到了嗎?局與局之間要有明顯間隔,那我們可以同時(shí)使用time.sleep()和print(現(xiàn)在是第x局)來完美解決這個(gè)問題。此外,遇到各種報(bào)錯(cuò)的話,記得去搜索一下,看看報(bào)的是什么錯(cuò),先自己嘗試解決看看。

            OK,打三局這個(gè)需求也成功了。現(xiàn)在我們距離最后的終點(diǎn)只剩一步之遙,只有“統(tǒng)計(jì)三局兩勝的結(jié)果”這個(gè)功能還沒實(shí)現(xiàn)了。

            我們可以想一想,平常我們是怎么統(tǒng)計(jì)比賽結(jié)果呢?

            好比乒乓球比賽,有一方贏了一局就翻一下計(jì)分牌,讓數(shù)字+1,最后看哪邊的數(shù)字大就是哪邊獲勝。

            對于計(jì)算機(jī)也是如此:它靠數(shù)據(jù)思考,比如拿數(shù)據(jù)做計(jì)算、做條件判斷、做循環(huán)等。所以這里的關(guān)鍵就在于,要給計(jì)算機(jī)數(shù)據(jù)。

            那么仿照計(jì)分牌的做法,我們的解決方法也就出來了:采取計(jì)分的方式,贏一局記一分,平局不計(jì)分。

            所以,我們要給計(jì)算機(jī)一個(gè)空白的“計(jì)分板”,用于存放【玩家】和【敵人】每一局的得分。

            那什么情況下,這兩個(gè)變量會(huì)變動(dòng)(+1)呢?自然是要與具體每一局的結(jié)果掛鉤,這時(shí)候可以回看我們計(jì)算輸贏的條件判斷語句。

            然后,我們將敵人和玩家各自贏的局?jǐn)?shù)給算出來:

            這樣三局過后,player_victory和enemy_victory會(huì)被賦上新的值。給你一個(gè)小技巧:player_victory = player_victory + 1,總是這樣寫有點(diǎn)煩人,我們可以寫作player_victory += 1,這兩個(gè)代碼是等價(jià)的,都代表"如果if后的條件滿足,變量就+1"。

            這也是程序員是追求“極簡”的體現(xiàn)。好,我們把這段代碼替換一下:

            現(xiàn)在,我們只需要再用一次條件判斷,比較兩個(gè)變量的大小就能知道誰輸誰贏了。

            將條件判斷的思維邏輯轉(zhuǎn)換成代碼邏輯的話是這樣子的:

            需要注意的是最終判斷結(jié)果要放在for循環(huán)外面,也就是不用縮進(jìn)。

            完整代碼:

            不過,這還沒完呢。作為一個(gè)程序員,代碼是我們的名片,我們會(huì)追求更加優(yōu)雅的,方便他人閱讀的代碼,所以上述代碼還有一些優(yōu)化空間。

            所以,以下是彩蛋時(shí)間,我會(huì)教大家一個(gè)新的知識點(diǎn)——【格式化字符串】,作為這一關(guān)的收尾。

            什么意思呢,上面有這么兩行代碼,是用來展示雙方角色的屬性的:

            我們在用+拼接字符串和變量的時(shí)候,常常需要考慮變量是什么類型的數(shù)據(jù),如果不是字符串類型,還先需要str()函數(shù)轉(zhuǎn)換。

            并且一句話常常要拼接成好幾個(gè)部分,然后我們要考慮每一對引號的起始位置,好麻煩,相信你多少會(huì)有點(diǎn)體會(huì)。

            所以,為了更方便地實(shí)現(xiàn)不同數(shù)據(jù)類型的拼接,用【格式符%】是更常用更便利的一種方式。

            我們可以把%想象成:圖書館里用來占位的一本書。先占一個(gè)位置,之后再填上實(shí)際的變量。舉個(gè)例子:下面這兩種寫法是相同的,請你著重研究下第二行的語法。

            我們看到格式符%后面有一個(gè)字母s,這是一個(gè)類型碼,用來控制數(shù)據(jù)顯示的類型。%s就表示先占一個(gè)字符串類型的位置。

            還有其他常見的類型碼如下圖所示:

            占完位置之后,我們要以%的形式在后面補(bǔ)上要填充的內(nèi)容,如此一來我們就免去了轉(zhuǎn)換類型的煩惱。如果是多個(gè)數(shù)據(jù),就要把它們放進(jìn)括號,按順序填充,用逗號隔開。

            舉個(gè)例子,你可以運(yùn)行一下,對比下列輸出的結(jié)果:

            一個(gè)小小的提示:%后面的類型碼用什么,取決于你希望這個(gè)%占住的這個(gè)位置的數(shù)據(jù)以什么類型展示出來,如果你希望它以字符串形式展示,那就寫%s,如果你希望它以整數(shù)形式展示,那就寫%d。

            這就出現(xiàn)了一些容易混淆的地方,比如,請運(yùn)行以下的代碼:

            選用了不同的類型碼,打印出的結(jié)果卻是一樣,原因也已經(jīng)在代碼注釋中寫清楚了:因?yàn)檎麛?shù)8與字符串8的打印結(jié)果是一樣的,所以選兩種類型碼都OK。但這種“都OK”的情況僅限于整數(shù),對文字是行不通的:

            會(huì)報(bào)錯(cuò),對吧?好啦,現(xiàn)在你應(yīng)該更懂這個(gè)格式化字符串該怎么用了。

            那就看回我們之前的代碼,如果把一開始用+拼接的字符串都替換成%格式符表示,我們先替換一部分試試

            你也許想問我,這里的%s是不是都能換成%d,答案是“YES!”,因?yàn)檫@里的變量i,player_life,player_attack統(tǒng)統(tǒng)都是整數(shù)。

            是不是看起來清爽了些?如果還不習(xí)慣這種表示方法沒有關(guān)系,多寫幾次就習(xí)慣啦。

            以上就是第一節(jié)項(xiàng)目實(shí)操課的全部內(nèi)容了!

            ----------------------------------------------------------------------------------------------

            更多課程請關(guān)注:

            掃描二維碼推送至手機(jī)訪問。

            版權(quán)聲明:本文由財(cái)神資訊-領(lǐng)先的體育資訊互動(dòng)媒體轉(zhuǎn)載發(fā)布,如需刪除請聯(lián)系。

            本文鏈接:http://thecityplacetownhomes.com/?id=8933

            “Python語言難學(xué)嗎?第15講實(shí)操小游戲項(xiàng)目” 的相關(guān)文章

            接發(fā)球|不可不讀!專業(yè)乒乓球隊(duì)的接發(fā)球秘籍

            接發(fā)球|不可不讀!專業(yè)乒乓球隊(duì)的接發(fā)球秘籍

              在乒乓球比賽中,接發(fā)球往往被視作比較被動(dòng)的環(huán)節(jié)。即使在采取無遮擋發(fā)球規(guī)則后,接發(fā)球的一方仍然有如覆薄冰的感覺。是后發(fā)先至還是先機(jī)盡失;是以靜制動(dòng)還是受制于人,很大程度上取決于運(yùn)動(dòng)員二、四板銜接嚴(yán)謹(jǐn)與否。本文就發(fā)球的每個(gè)環(huán)節(jié)通過一定的科研手段對國內(nèi)外高水平的技術(shù)分析研...

            原創(chuàng)
            女子乒乓球世界排名更新!孫穎莎擴(kuò)大領(lǐng)先優(yōu)勢,王藝迪有望反超王曼昱

            原創(chuàng) 女子乒乓球世界排名更新!孫穎莎擴(kuò)大領(lǐng)先優(yōu)勢,王藝迪有望反超王曼昱

            原標(biāo)題:女子乒乓球世界排名更新!孫穎莎擴(kuò)大領(lǐng)先優(yōu)勢,王藝迪有望反超王曼昱 隨著WTT新鄉(xiāng)世界杯決賽的落幕,世乒聯(lián)官網(wǎng)也迅速給出了最新的世界排名更新。 與男子乒乓球相比,前十名的排名變化比較大。王楚欽排名大幅提升,來到了世界前三,距離世界第二的馬龍僅差75分。張本...

            乒乓球規(guī)則 乒乓球拍的規(guī)則規(guī)定你了解嗎?

            乒乓球規(guī)則有很多,除了在打球過程中需要規(guī)則,關(guān)于乒乓球用品也有著相應(yīng)的規(guī)則,大家了解乒乓球拍的規(guī)則規(guī)定嗎?乒乓球拉球的分類方法是什么?打乒乓球注意事項(xiàng)有哪些?下面我們就一起來了解一下吧!   乒乓球拍的規(guī)則規(guī)定   (一)球拍的大小、形狀和重量不限。但底板應(yīng)平整、堅(jiān)硬。底板...

            重點(diǎn)必看:掌握乒乓球比賽規(guī)則真的很重要

            重點(diǎn)必看:掌握乒乓球比賽規(guī)則真的很重要

            無論是乒乓球愛好者還是準(zhǔn)備學(xué)習(xí)后參加乒乓球比賽的朋友,在學(xué)習(xí)乒乓球的過程中都需要了解和掌握一些乒乓球比賽的規(guī)則,這樣才可以確保后續(xù)上了比賽場后可以輕松應(yīng)對,以免給自己帶來一些不必要的麻煩。 乒乓球作為我國的國球,同時(shí)也因?yàn)槠古仪驅(qū)龅匾笠脖容^簡單,因此成為大多數(shù)朋友喜愛...

            乒乓球標(biāo)準(zhǔn)計(jì)分表

            乒乓球標(biāo)準(zhǔn)計(jì)分表

            乒乓球比賽計(jì)分表 裁判員: 記分員: 乒乓球單打比賽的計(jì)分規(guī)則:...

            ?