日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hotdog 热狗大战

發布時間:2023/12/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hotdog 热狗大战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HOTDOG CONFLICT

廢話介紹 背景介紹

創作背景

19號磨磨蹭蹭地在重慶考完了雅思,終于有機會打開積灰已久的CSDN記錄一下“代碼人生"了哈哈哈。未來的一個月還要同時進行AP的學習,加油啊啊啊!

項目背景

這個項目是寒假參加“發現杯”前的復習項目,覺得還不錯就想把它搬上來分享分享。
【聲明】非原創,受小學時候玩的“金山打字通”接蘋果游戲、和wsc吃熱狗的啟發


整體思路

  • 準備工作(搭建環境,例如導入庫、設置標題、窗框大小坐標等等)
  • 設置處理事件類型
  • 通過“類”的方式創造組件,并進行調用
  • 后臺處理

準備工作

導入庫大家都應該很熟練,這里我們也很熟練地操作一下~
(玄武黑,感覺比簡約白更高級炫酷欸哈哈哈,高光也很棒orz)

# coding:utf-8 import pygame from pygame.locals import * import time, random import sys import os

接下來的一步,創建窗口和設置標題我們在Time Management里面也見到過,這里不難也比較標準,不用過多進行思維上的理解。
值得一提的是,最后一行(255,255,255)表示的是邊框的顏色,分別對應“紅黃藍”三原色的占比(此處代表白色),(0, 0, 0)的配比則是黑色。

# 初始化pygame環境 pygame.init()# 創建一個長寬分別為1300/700窗口 os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (100, 25) canvas = pygame.display.set_mode((1000, 625)) canvas.fill((255, 255, 255))

窗口標題的設置也很常規~

# 設置窗口標題 pygame.display.set_caption("熱狗大戰")

(哈哈哈說一句題外話,我真的好喜歡Markdown:)
在完成外框的設置之后,我們就要開始逐步傳輸圖片了。我們事先會將圖片儲存在同級別的文件夾里,運用調動相對路徑的方式將它們傳輸上去。
(如何區分相對路徑和絕對路徑呢?
絕對路徑跟快遞收貨地址很像,就像是衛星定位一樣,需要提供確切的位置。在電腦中的絕對路徑就相當于“C盤 XXX文件夾”
而相對路徑適用于描述某個相鄰的事物,例如當你知道我的位置時,我通知你來到我的鄰居家,你也能很方便清晰地找到它。)

# 加載圖片 bg = pygame.image.load("images/bg.jpg") h = pygame.image.load("images/hotdog.png") player = pygame.image.load("images/hero.png") end = pygame.image.load("images/end.jpg") bullet_tip = pygame.image.load("images/bullet_tip.png") time_tip = pygame.image.load("images/time_tip.png")

到此為止準備任務就到此結束啦,我們接下來進行事件處理類型的設置。

下一步是對用戶操作動作的設置,例如如果按下了移動箭頭的按鍵,程序會進行怎樣的變化。用到的是比較簡單的if-elif-else語句,所以也很便于理解~

# 處理事件 def handleEvent():for event in pygame.event.get(): # 循環出事件列表中的每個事件對象if event.type == QUIT: # 如果事件的類型是退出類型pygame.quit() # pygame游戲框的退出方法sys.exit() # 系統程序結束方法if event.type == KEYDOWN: # 如果事件類型是鍵盤被按下if event.key == 276: # 通過key屬性查看是不是左箭頭被按下Var.wsc.x -= 40 # 如果是,王思聰x軸左移動40if event.key == 275: # 通過key屬性查看是不是右箭頭被按下Var.wsc.x += 40 # 如果是,王思聰x軸右移動40if Var.wsc.x < 0: # 如果王思聰的x軸比0小Var.wsc.x = 0 # 那么還是把這個值賦值為0if Var.wsc.x > 1000 - Var.wsc.width: # 如果王思聰的x軸最右邊Var.wsc.x = 1000 - Var.wsc.width # 那x值賦值為最右邊的值

這時 重點就來了!!!
一般我們想用某個庫/工具包里的功能時,我們直接用庫名.方法名() 的方法進行調用;但如果此時我們想調用的功能還沒有被創建出來,但每一次書寫都特別麻煩時,我們就可以用def的方法自己創造工具包。
例如這里,我們想創造一個“字體”方法,之后設置字體的時候就可以直接調用 。

# 工具方法-寫文字方法 def fillText(text, position, view=canvas):# 設置字體樣式和大小my_font = pygame.font.Font("my_font/font1.ttf", 30)# 渲染文字text = my_font.render(text, True, (255, 255, 255))view.blit(text, position)
  • 第一排括號里的(text, position, view=canvas)是形式參數,相當于只是一個名字而已,沒有任何實際意義。之后在調用這個方法時,再將實際參數傳輸進去。
  • 第二行代碼是進行字體的設置,前者是字體類型,后者是字體大小
  • 下一行的第一個元素代表內容;第二個元素True代表“抗鋸齒效果”,如果設置為False或者忽略設置,就會看到一群馬賽克在晃動;后面的3個255我們在前面已經提到過啦~)
  • 最后一行就是傳輸文字,包含內容和位置坐標。

class object

這里比較特別,是用class語句將特定功能*“封裝”*起來,也是方便之后的調用。
def括號內的內容也是形式參數,后面的傳參就是“實例化方法”。
就像是設置的一個一個工具包,把代碼分成一塊一塊的,再來調用。

# 創建一個熱狗類 # 創建一個熱狗類 class HotDog():def __init__(self, x, y, width, height, img): # 實例化方法,有參數self.x = x # x軸的值self.y = y # y軸的值self.width = width # 圖片寬self.height = height # 圖片高self.img = img # 圖片self.canDelete = False # 可刪除屬性,初始為False,即不可刪除def paint(self): # 定義一個畫畫方法canvas.blit(self.img, (self.x, self.y)) # 將熱狗畫出來def step(self): # 定義一個移動方法self.y += 4 # 將熱狗的y坐標變大,即往下移動def hit(self, wsc): # 碰撞方法,檢查是否發生碰撞并做處理# 一定要讓熱狗的x軸和y軸同時滿足碰到王思聰if self.x >= wsc.x - self.width + 10 and self.x <= wsc.x + wsc.width - 10 and self.y >= wsc.y - self.height + 10 and self.y <= wsc.y + wsc.height - 10:self.canDelete = True # 這個熱狗可以刪除Var.game.score += 1 # 得分加1def out(self): # 出界方法if self.y >= 625 - self.height: # 如果熱狗出界self.canDelete = True # canDelete屬性改成True# 判斷游戲時間是否到了def gameOver():Var.game.end() # 調用游戲對象中的end方法來處理游戲倒計時的問題

最后一步,是為了保持項目的實時性,即使用while True死循環將保證所有的插件元素(熱狗、wsc、背景等一直出現在畫布上)

while True:if not Var.game.isEnd: # 如果游戲時間還沒到componentEnter() # 生產熱狗componentPaint() # 畫出所有的角色componentStep() # 移動所有的角色checkHit() # 檢查王思聰和熱狗是否發生碰撞componentDelete() # 刪除該消失的熱狗isOutBounds() # 判斷是否出界gameOver() # 判斷游戲是否時間到else: # 如果游戲時間到canvas.blit(end, (0, 0)) # 畫結束背景圖fillTextOver(str(Var.game.score), (460, 390)) # 畫最后得分# 監聽有沒有按下退出按鈕handleEvent()# 更新屏幕內容pygame.display.update()# 延時10毫秒pygame.time.delay(10)

這個項目就到此結束啦!剛剛回看了一下自己寫的blog,感覺有很多東西沒有講清楚:(
只能先這樣啦,到時候想到什么再補嘻嘻!
對了,來看看這個項目的完整版和效果視頻吧:

# coding:utf-8 import pygame from pygame.locals import * import time, random import sys import os# 初始化pygame環境 pygame.init()# 創建一個長寬分別為1300/700窗口 os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (100, 25) canvas = pygame.display.set_mode((1000, 625)) canvas.fill((255, 255, 255))# 設置窗口標題 pygame.display.set_caption("熱狗大戰")# 加載圖片 bg = pygame.image.load("images/bg.jpg") h = pygame.image.load("images/hotdog.png") player = pygame.image.load("images/hero.png") end = pygame.image.load("images/end.jpg") bullet_tip = pygame.image.load("images/bullet_tip.png") time_tip = pygame.image.load("images/time_tip.png")# 處理事件 def handleEvent():for event in pygame.event.get(): # 循環出事件列表中的每個事件對象if event.type == QUIT: # 如果事件的類型是退出類型pygame.quit() # pygame游戲框的退出方法sys.exit() # 系統程序結束方法if event.type == KEYDOWN: # 如果事件類型是鍵盤被按下if event.key == 276: # 通過key屬性查看是不是左箭頭被按下Var.wsc.x -= 40 # 如果是,王思聰x軸左移動40if event.key == 275: # 通過key屬性查看是不是右箭頭被按下Var.wsc.x += 40 # 如果是,王思聰x軸右移動40if Var.wsc.x < 0: # 如果王思聰的x軸比0小Var.wsc.x = 0 # 那么還是把這個值賦值為0if Var.wsc.x > 1000 - Var.wsc.width: # 如果王思聰的x軸最右邊Var.wsc.x = 1000 - Var.wsc.width # 那x值賦值為最右邊的值# 工具方法-寫文字方法 def fillText(text, position, view=canvas):# 設置字體樣式和大小my_font = pygame.font.Font("my_font/font1.ttf", 30)# 渲染文字text = my_font.render(text, True, (255, 255, 255))view.blit(text, position)def fillTextOver(text, position, view=canvas):my_font = pygame.font.Font("my_font/font1.ttf", 50)# 渲染文字text = my_font.render(text, True, (255, 255, 255))view.blit(text, position)# 創建一個熱狗類 class HotDog():def __init__(self, x, y, width, height, img): # 實例化方法,有參數self.x = x # x軸的值self.y = y # y軸的值self.width = width # 圖片寬self.height = height # 圖片高self.img = img # 圖片self.canDelete = False # 可刪除屬性,初始為False,即不可刪除def paint(self): # 定義一個畫畫方法canvas.blit(self.img, (self.x, self.y)) # 將熱狗畫出來def step(self): # 定義一個移動方法self.y += 4 # 將熱狗的y坐標變大,即往下移動def hit(self, wsc): # 碰撞方法,檢查是否發生碰撞并做處理# 一定要讓熱狗的x軸和y軸同時滿足碰到王思聰if self.x >= wsc.x - self.width + 10 and self.x <= wsc.x + wsc.width - 10 and self.y >= wsc.y - self.height + 10 and self.y <= wsc.y + wsc.height - 10:self.canDelete = True # 這個熱狗可以刪除Var.game.score += 1 # 得分加1def out(self): # 出界方法if self.y >= 625 - self.height: # 如果熱狗出界self.canDelete = True # canDelete屬性改成True# 創建一個王思聰類 class Wsc():def __init__(self, x, y, width, height, img): # 定義實例化方法self.x = x # x軸的值self.y = y # y軸的值self.width = width # 圖片寬self.height = height # 圖片高self.img = img # 圖片def paint(self): # 畫畫方法canvas.blit(self.img, (self.x, self.y)) # 畫出王思聰# 游戲類,相當于裁判,來判定游戲結束,得分等等 class Game():def __init__(self, t): # 實例化方法self.score = 0 # 分數self.t = t # 時間self.lastTime = time.time() # 用于判斷游戲進行的時間self.interval = 0.6 # 生產熱狗間隔是0.4秒鐘self.time0 = 0 # time0屬性代表,上次生產熱狗的時間self.isEnd = False # 時間是否結束,一開始是沒結束def end(self): # 定義end方法if self.t > 0: # 代表游戲還在進行t = time.time() # 獲得現在的時間if t - self.lastTime >= 1: # 用現在時間和之前時間比,是否超過1秒self.t -= 1 # 如果超過了1秒,我們現實的倒計時就減1self.lastTime = t # 并且,更新lastTime的時間為現在的時間else: # 代表游戲已經結束self.isEnd = True # 把isEnd屬性改為Truedef isTime(self): # 判斷是否要生產熱狗的方法if not self.time0: # 如果time0==0,代表還沒有生產過熱狗self.time0 = time.time() # 更新time0屬性return True # 返回一個Truet = time.time() # 得到一個現在的時間# 如果現在時間-上次生產熱狗時間大于等于我們設置的間隔時間if t - self.time0 >= self.interval:self.time0 = t # 更新我們的time0屬性return True # 返回一個Truepass# 創建一個類,專門儲存游戲中用到的變量 class Var():hotDogs = [] # 儲存熱狗對象的列表wsc = Wsc(480, 625 - 153, 80, 133, player) # 創建王思聰對象game = Game(30) # 創建游戲對象,傳參時間為30秒pass# 產生熱狗的組件 def componentEnter():if Var.game.isTime(): # 時間到的方法,達成了我們再生產熱狗x = random.randint(0, 1000 - 32) # 產生隨機數,作為熱狗的x軸Var.hotDogs.append(HotDog(x, 0, 32, 60, h)) # 創建熱狗對象加進列表pass# 刪除熱狗的組件 def componentDelete():for hotDog in Var.hotDogs: # 循環出每一個熱狗if hotDog.canDelete: # 檢查這些熱狗的canDelete屬性是否為真Var.hotDogs.remove(hotDog) # 從列表中刪除被吃的熱狗對象pass# 畫角色的組件 def componentPaint():canvas.blit(bg, (0, 0)) # 首先要畫背景for hotDog in Var.hotDogs: # 循環出熱狗列表中的每個熱狗對象hotDog.paint() # 調用熱狗對象的畫畫方法Var.wsc.paint() # 調用王思聰對象的畫畫方法canvas.blit(bullet_tip, (800, 5)) # 畫積分板canvas.blit(time_tip, (25, 25)) # 畫時間板fillText(str(Var.game.t), (40, 40)) # 寫上時間fillText(str(Var.game.score), (880, 40)) # 寫上分數pass# 移動的組件 def componentStep():for hotDog in Var.hotDogs: # 循環出熱狗列表中的每個熱狗對象hotDog.step() # 調用熱狗對象的移動方法pass# 檢查是否碰撞 def checkHit():for hotDog in Var.hotDogs: # 循環出每個熱狗對象hotDog.hit(Var.wsc) # 調用熱狗對象的碰撞方法,傳入王思聰對象pass# 判斷是否出界 def isOutBounds():for hotDog in Var.hotDogs: # 循環出每一個熱狗對象hotDog.out() # 調用熱狗對象的out方法pass# 判斷游戲時間是否到了 def gameOver():Var.game.end() # 調用游戲對象中的end方法來處理游戲倒計時的問題while True:if not Var.game.isEnd: # 如果游戲時間還沒到componentEnter() # 生產熱狗componentPaint() # 畫出所有的角色componentStep() # 移動所有的角色checkHit() # 檢查王思聰和熱狗是否發生碰撞componentDelete() # 刪除該消失的熱狗isOutBounds() # 判斷是否出界gameOver() # 判斷游戲是否時間到else: # 如果游戲時間到canvas.blit(end, (0, 0)) # 畫結束背景圖fillTextOver(str(Var.game.score), (460, 390)) # 畫最后得分# 監聽有沒有按下退出按鈕handleEvent()# 更新屏幕內容pygame.display.update()# 延時10毫秒pygame.time.delay(10)


嘿嘿,之前參加比賽,為傳承中國文化,還專門照葫蘆畫瓢了個“蘇武牧羊”:

最后的最后,小本生意碼字不易,大家能看到這里已經是我何等的榮幸了哈哈哈
如有問題,記得聯系我呀~
1773632066@qq.com

總結

以上是生活随笔為你收集整理的Hotdog 热狗大战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。