Python+Pygame制作"長沙版"大富翁
導語
?說到童年愛玩的電腦游戲,你會想到什么?
最國民的莫過于金山打字通,接著是掃雷、紅心大戰(zhàn),而紅極一時的單機游戲當屬《大富翁》。
嘻嘻 打字游戲——掃雷這是之前都已經(jīng)給大家寫過的游戲啦~SO 剩下《大富翁》游戲。
今天來給大家大顯身手一波——
作為一款經(jīng)典的強手棋類游戲,“大富翁”系列在長達十幾年的時間內(nèi)長盛不衰,從2代開始走紅,3代成為了大哥大,4代創(chuàng)造了回合制游戲的顛峰,5代開啟了網(wǎng)絡(luò)聯(lián)機對戰(zhàn)……至今,華語大富翁類游戲怕是沒幾個能超越大富翁系列的高光時刻了。
而擲骰子、開寶箱、跳格,成了大多數(shù)80、90后的童年記憶,幾個好友擠在一起,等著自己扔骰子買地建房,孫小美、阿土伯、金貝貝、沙隆巴斯、錢夫人、莎拉公主……這些可愛的游戲人物,陪著我們度過了一個又一個愉快的時光。好啦,廢話說的有點兒多撒,一時刻剎不住腳了。
來來來 我們正式開始吧!
一、大富翁之旅
嘿嘿!元宵啦,有沒有小伙伴兒來長沙浪一浪吖?
今天這款《大富翁》小游戲是基于長沙著名景點所作的撒、可以看到,地圖上鑲嵌進了 8 個長沙的標志性地點,按 照從上往下、從左往右的順序依次為西站、世界之窗、五一廣場、橘子洲、植物園、博物館、岳麓書院、岳麓山。當玩家到達這些 地點時,便會觸發(fā)相應(yīng)的特殊事件。
二、特殊事件
1)觸發(fā)的特殊事件如下
西站:玩家經(jīng)過西站時會停留休息一天,即一 回合不能擲骰子,作為回報,該玩家 GPA 上升 0.2。
世界之窗:玩家經(jīng)過世界之窗時會玩兒一天,即一回合不能 擲骰子。
五一廣場:玩家經(jīng)過五一廣場時會體驗一次幫忙充場跑跑業(yè)務(wù), 金錢增加 500,GPA 下降 1.0。
橘子洲:玩家經(jīng)過 橘子洲時會口渴買茶顏跟吃的,金 錢減少 100。
植物園:玩家經(jīng)過植物園時會買票觀看演出,金錢減 少 200。
博物館:玩家經(jīng)過博物館時突然記起來在世界之窗掉東西, 即直接傳送到世界之窗,且一個回合不能擲骰子。
岳麓山:玩家經(jīng)過岳麓山時會看到最美風景,身、心收到鼓舞,GPA 上升 0.3。
2)游戲規(guī)則
作為一款大富翁游戲,“長沙之旅”保留了傳統(tǒng)大富翁游 戲的機制,即通過買地建房賺取金錢,某玩家金錢耗盡即宣布破產(chǎn),游戲結(jié)束。
在此基礎(chǔ)上,為了更多地體現(xiàn)出多種元 素,游戲中每個角色的實力除了財產(chǎn)之外,還有另一個衡量標準——GPA。當某位玩家的 GPA 達到 4.0 時,游戲結(jié)束, 該玩家獲勝;GPA 達到 1.0 時,游戲結(jié)束,該玩家失敗。本游戲可以支持 2~4 人的玩法,為玩家準備的 4 位可愛 的游戲角色哦!
三、代碼演示
1)環(huán)境素材
2)運行環(huán)境
環(huán)境安裝 本文用到的運行環(huán)境:Python3.7、Pycharm社區(qū)版2020、Pygame游戲模塊部分自帶模塊直 接導入不需要安裝。
模塊安裝:pip install -i https://pypi.douban.com/simple/ +模塊名
3)主程序
import pygame import sys import time from draw import Button, draw_text, draw_mapstatus, draw_player from game import * from player import Player pygame.init() screen_size = (1080, 680) # 第一個是寬度,第二個是高度 role_size = (60, 60) screen = pygame.display.set_mode(screen_size) pygame.display.set_caption("大富翁——長沙之旅") map_screen = pygame.image.load('image/地圖.bmp') stop_picture = pygame.image.load('image/禁止.jpg') stop_picture = pygame.transform.scale(stop_picture, (20, 20)) lose_sound = pygame.mixer.Sound('sound/失敗.wav') # 載入音效 win_sound = pygame.mixer.Sound('sound/勝利.wav') up_sound = pygame.mixer.Sound('sound/升級.wav') click_sound = pygame.mixer.Sound('sound/按鍵.wav') chances_sound = pygame.mixer.Sound('sound/事件.wav') picture_dice = [] for i in range(6): picture_dice.append(pygame.image.load('image/dice/%d.jpg'%(i+1))) map_screen = pygame.transform.scale(map_screen, screen_size) screen.blit(map_screen, (0, 0)) play_button = Button(screen, '開始游戲') # 繪制開始游戲按鈕 play_button.draw_button() status = 0 # 控制游戲進程 0:游戲未開始 1:選擇游戲人數(shù) 2:擲骰子 3:玩家行走 4:觸發(fā)事件 5:買地建房 6:游戲結(jié)束 cur_player = 0 # 當前玩家 dice_answer = 1 # 擲骰子結(jié)果 player = [] role = [] local_init = [0, 20, 12, 32] # 四位玩家最初的位置 map_status = [] for i in range(8): map_status.append(Map(i)) # 存儲地產(chǎn)信息,包括所有者、價值、租金等 while True: if status == 0: # 游戲未開始 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.MOUSEBUTTONDOWN: (mouse_x, mouse_y) = event.pos #print(mouse_x, mouse_y) if click_button(mouse_x, mouse_y, 0): click_sound.play() num_player_button = Button(screen, '請輸入游戲人數(shù)(2~4)') num_player_button.draw_button() draw_text(screen, (540, 440), '操作指南:按↑擲骰子、購買地產(chǎn)', 50, 'STXINGKA.TTF', pygame.Color('gold')) status = 1 pygame.display.update() elif status == 1: # 選擇游戲人數(shù) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if 258 <= event.key <= 260 or 50 <= event.key <= 52: #載入相應(yīng)數(shù)量的角色 click_sound.play() role.append(pygame.image.load('image/role/小e.jpg')) role.append(pygame.image.load('image/role/皮卡丘.jpg')) if event.key == 259 or event.key == 51: role.append(pygame.image.load('image/role/可達鴨.jpg')) elif event.key == 260 or event.key == 52: role.append(pygame.image.load('image/role/可達鴨.jpg')) role.append(pygame.image.load('image/role/小黃雞.jpg')) screen.blit(map_screen, (0, 0)) for i in range(len(role)): #初始化游戲玩家 role[i] = pygame.transform.scale(role[i], role_size) player.append(Player(i)) player[i].local = local_init[i] draw_player(screen, player, role, stop_picture) status = 2 elif status == 2: #擲骰子 for i in range(6): # 繪制骰子動畫 screen.blit(picture_dice[i], (500, 400)) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if event.key == 273: dice_answer = get_dice() status = 3 pygame.display.update() elif status == 3: #玩家行走 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() for i in range(dice_answer): screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) player[cur_player].local = (player[cur_player].local + 1) % 40 draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) click_sound.play() pygame.display.update() time.sleep(0.5) if Special(player[cur_player].local): #判斷是否觸發(fā)特殊事件 status = 4 else: # 普通地段,判斷需要買地或交租金 local = player[cur_player].local if map_status[local2order(local)].owner == -1: chances_sound.play() draw_text(screen, (800, 340), '是否買下這塊地?(¥%d)' % map_status[local2order(local)].value1, 30, 'STXINGKA.TTF', pygame.Color('grey')) status = 5 elif map_status[local2order(local)].owner == cur_player and map_status[local2order(local)].level == 1: chances_sound.play() draw_text(screen, (800, 340), '是否要加蓋建筑?(¥%d)' % map_status[local2order(local)].value2, 30, 'STXINGKA.TTF', pygame.Color('grey')) status = 5 elif map_status[local2order(local)].owner == cur_player and map_status[local2order(local)].level == 2: cur_player = (cur_player + 1) % len(player) # 下一個玩家擲骰子 while player[cur_player].stop == 1: player[cur_player].stop = 0 cur_player = (cur_player + 1) % len(player) status = 2 else: if map_status[local2order(local)].level == 1: player[cur_player].money -= map_status[local2order(local)].rent1 player[map_status[local2order(local)].owner].money += map_status[local2order(local)].rent1 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (800, 340), '支付租金(¥%d)' % map_status[local2order(local)].rent1, 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() elif map_status[local2order(local)].level == 2: player[cur_player].money -= map_status[local2order(local)].rent2 player[map_status[local2order(local)].owner].money += map_status[local2order(local)].rent2 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (800, 340), '支付租金(¥%d)' % map_status[local2order(local)].rent2, 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() cur_player = (cur_player + 1) % len(player) # 下一個玩家擲骰子 while player[cur_player].stop == 1: player[cur_player].stop = 0 cur_player = (cur_player + 1) % len(player) if not game_over(player) == 0: if game_over(player) > 0: win_sound.play() else: lose_sound.play() status = 6 else: status = 2 pygame.display.update() elif status == 4: #觸發(fā)特殊事件 if player[cur_player].local == 5: #C樓 player[cur_player].money -= 100 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (800, 340), '去橘子洲購物,金錢-100', 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() elif player[cur_player].local == 11: #紫操 player[cur_player].money += 100 if full_somewhere(35, player): player[cur_player].gpa += 0.2 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (800, 340), '西站,績點+0.2', 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() else: player[cur_player].local = 35 player[cur_player].stop = 1 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (800, 340), '博物館', 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() elif player[cur_player].local == 15: #羅姆樓 if cur_player == 0: player[0].stop = 1 player[0].gpa += 0.2 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (750, 340), '學習一天,績點+0.2', 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() elif player[cur_player].local == 19: #主樓 player[cur_player].gpa += 0.3 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (750, 340), '觀看岳麓山風景,績點+0.3', 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() elif player[cur_player].local == 25: #新清 player[cur_player].money -= 200 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (800, 340), '去植物園看演出,金錢-200', 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() elif player[cur_player].local == 31: #二校門 player[cur_player].money += 500 player[cur_player].gpa -= 1.0 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (750, 340), '五一廣場業(yè)務(wù),金錢+500,績點-1.0', 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() elif player[cur_player].local == 35: #校醫(yī)院 player[cur_player].stop = 1 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (800, 340), '世界之窗', 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() elif player[cur_player].local == 39: #圖書館 if not cur_player == 2: player[cur_player].stop = 1 player[cur_player].gpa += 0.2 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_mapstatus(screen, player, map_status) draw_player(screen, player, role, stop_picture) draw_text(screen, (800, 340), '泡在西站一天,績點+0.2', 30, 'STXINGKA.TTF', pygame.Color('grey')) chances_sound.play() cur_player = (cur_player + 1) % len(player) #下一個玩家擲骰子 while player[cur_player].stop == 1: player[cur_player].stop = 0 cur_player = (cur_player + 1) % len(player) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() pygame.display.update() if not game_over(player) == 0: if game_over(player) > 0: win_sound.play() else: lose_sound.play() status = 6 else: status = 2 elif status == 5: #買地建房 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if event.key == 273: if map_status[local2order(player[cur_player].local)].level == 0: player[cur_player].money -= map_status[local2order(player[cur_player].local)].value1 map_status[local2order(player[cur_player].local)].owner = cur_player map_status[local2order(player[cur_player].local)].level = 1 elif map_status[local2order(player[cur_player].local)].level == 1: player[cur_player].money -= map_status[local2order(player[cur_player].local)].value2 map_status[local2order(player[cur_player].local)].level = 2 cur_player = (cur_player + 1) % len(player) # 下一個玩家擲骰子 while player[cur_player].stop == 1: player[cur_player].stop = 0 cur_player = (cur_player + 1) % len(player) status = 2 screen.blit(map_screen, (0, 0)) screen.blit(picture_dice[dice_answer - 1], (500, 400)) draw_player(screen, player, role, stop_picture) draw_mapstatus(screen, player, map_status) up_sound.play() if not game_over(player) == 0: if game_over(player) > 0: win_sound.play() else: lose_sound.play() status = 6 pygame.display.update() elif status == 6: # 游戲結(jié)束 if game_over(player) > 0: draw_text(screen, (540, 340), '游戲結(jié)束,%s勝利' % player[game_over(player)-1].name, 50, 'STXINGKA.TTF', pygame.Color('darkgreen')) draw_text(screen, (540, 440), '再來一局', 50, 'STXINGKA.TTF', pygame.Color('darkgreen')) else : draw_text(screen, (540, 340), '游戲結(jié)束,%s失敗' % player[- game_over(player) - 1].name, 50, 'STXINGKA.TTF', pygame.Color('darkgreen')) draw_text(screen, (540, 440), '再來一局', 50, 'STXINGKA.TTF', pygame.Color('darkgreen')) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.MOUSEBUTTONDOWN: (mouse_x, mouse_y) = event.pos if click_button(mouse_x, mouse_y, 1): player = [] role = [] map_status = [] for i in range(8): map_status.append(Map(i)) cur_player = 0 click_sound.play() screen.blit(map_screen, (0, 0)) num_player_button = Button(screen, '請輸入游戲人數(shù)(2~4)') num_player_button.draw_button() draw_text(screen, (540, 440), '操作指南:按↑擲骰子、購買地產(chǎn)', 50, 'STXINGKA.TTF', pygame.Color('gold')) status = 1 pygame.display.update()
4)玩家角色
class Player: # 玩家類 def __init__(self, order): self.money = 3000 self.gpa = 3.0 self.local = 0 self.stop = 0 if order == 0: self.name = '小E' elif order == 1: self.name = '皮卡丘' elif order == 2: self.name = '可達鴨' elif order == 3: self.name = '小黃雞'
四、效果展示
1)初始界面
鼠標左鍵點擊“開始游戲”即可!
2)選擇游戲人數(shù)界面
鍵盤輸入 2~4 的數(shù)字即可!
3)后續(xù)
按鍵盤“↑”鍵擲骰子、按鍵盤“↑”鍵買地(升級地產(chǎn)操作相同、鼠標左鍵點擊“再來一局”重新開始游戲!
?以上就是Python+Pygame制作"長沙版"大富翁的詳細內(nèi)容,更多關(guān)于Python Pygame大富翁的資料請關(guān)注腳本之家其它相關(guān)文章!
- 基于python?的Pygame最小開發(fā)框架
- 基于Python+Pygame實現(xiàn)經(jīng)典賽車游戲
- Python?Pygame實戰(zhàn)之五款童年經(jīng)典游戲合集
- Python Pygame實戰(zhàn)之飛機大戰(zhàn)的實現(xiàn)
- Python Pygame實戰(zhàn)之塔防游戲的實現(xiàn)
- Python Pygame實戰(zhàn)之賽車游戲的實現(xiàn)
- Python Pygame實戰(zhàn)之水果忍者游戲的實現(xiàn)
- 基于Python利用Pygame實現(xiàn)翻轉(zhuǎn)圖像
- python中的pygame實現(xiàn)接球小游戲
相關(guān)文章
Python入門教程5. 字典基本操作【定義、運算、常用函數(shù)】
這篇文章主要介紹了Python字典基本操作,包括字典的基本定義、運算與常用函數(shù)相關(guān)使用技巧,代碼注釋中備有詳盡說明,便于理解,需要的朋友可以參考下2018-11-11Python虛擬環(huán)境venv實戰(zhàn)過程詳解
Python的虛擬環(huán)境可以幫助我們在同一臺機器上,同時使用不同的Python版本和庫,方便管理和開發(fā),下面這篇文章主要給大家介紹了關(guān)于Python虛擬環(huán)境venv的相關(guān)資料,需要的朋友可以參考下2023-06-06Python實現(xiàn)識別手寫數(shù)字 Python圖片讀入與處理
這篇文章主要為大家詳細介紹了Python實現(xiàn)識別手寫數(shù)字,Python圖片的讀入與處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01在Python中操作字典之setdefault()方法的使用
這篇文章主要介紹了在Python中操作字典之setdefault()方法的使用,是Python入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05在pytorch 中計算精度、回歸率、F1 score等指標的實例
今天小編就為大家分享一篇在pytorch 中計算精度、回歸率、F1 score等指標的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01tensorflow2.10使用BERT實現(xiàn)Semantic Similarity過程解析
這篇文章主要為大家介紹了tensorflow2.10使用BERT實現(xiàn)Semantic Similarity過程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04Python實現(xiàn)將DNA序列存儲為tfr文件并讀取流程介紹
為什么要在實驗過程中存儲文件,因為有些算法的內(nèi)容存在一些重復計算的步驟,這些步驟往往消耗很大一部分時間,在有大量參數(shù)的情況時,需要在多次不同參數(shù)的情況下重復試驗,因此可以考慮將一些不涉及參數(shù)運算的部分結(jié)果存入文件中2022-09-09