日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

用Python手把手教你實現2048小游戲

瀏覽:37日期:2022-06-17 14:53:45
目錄一、開發環境二、環境搭建三、原理介紹四、效果圖一、開發環境

Python版本:3.6.4相關模塊:pygame模塊;以及一些Python自帶的模塊。

二、環境搭建

安裝Python并添加到環境變量,pip安裝需要的相關模塊即可。

三、原理介紹

“使用方向鍵移動方塊,兩個數字相同的方塊撞在一起后,將會合并為一個數字是原來兩倍的新方塊。游戲的時候盡可能多地合并這些數字方塊就行了。”大概了解了游戲規則之后,我們就可以開始寫這個游戲啦~首先,進行一下游戲初始化操作并播放一首自己喜歡的游戲背景音樂:

# 游戲初始化pygame.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption(’2048 —— 彳余大膽’)# 播放背景音樂pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.play(-1, 30)

接著,我們來定義一個2048游戲類,里面主要負責實現2048的各種游戲規則:

’’’2048游戲’’’class Game2048(object): def __init__(self, matrix_size=(4, 4), max_score_filepath=None, **kwargs): # matrix_size: (num_rows, num_cols) self.matrix_size = matrix_size # 游戲最高分保存路徑 self.max_score_filepath = max_score_filepath # 初始化 self.initialize()

具體而言,我們先用一個二維的列表來保存當前的游戲狀態:

self.game_matrix = [[’null’ for _ in range(self.matrix_size[1])] for _ in range(self.matrix_size[0])]

其中null表示當前的塊里沒有數字。否則,對應的位置則用當前的數字表示。很顯然地,2048小游戲的當前游戲狀態是可以用一個4*4的列表表示的:

用Python手把手教你實現2048小游戲

游戲一開始,我們需要在這個二維列表里隨機地選擇兩個位置生成數字(即2或者4):

’’’在新的位置隨機生成數字’’’def randomGenerateNumber(self): empty_pos = [] for i in range(self.matrix_size[0]): for j in range(self.matrix_size[1]): if self.game_matrix[i][j] == ’null’: empty_pos.append([i, j]) i, j = random.choice(empty_pos) self.game_matrix[i][j] = 2 if random.random() > 0.1 else 4self.randomGenerateNumber()self.randomGenerateNumber()

然后,當玩家按下方向鍵(↑↓←→)時,這個二維列表要根據玩家的操作指令進行更新,主要分為兩個部分:移動所有的數字塊并進行必要的合并和記分;隨機地在一個還沒有數字的位置上生成一個數字。具體而言,代碼實現如下:

’’’更新游戲狀態’’’def update(self): game_matrix_before = copy.deepcopy(self.game_matrix) self.move() if game_matrix_before != self.game_matrix: self.randomGenerateNumber()

其中,移動所有的數字并進行必要的合并的代碼實現如下:

’’’根據指定的方向, 移動所有數字塊’’’def move(self): # 提取非空數字 def extract(array): array_new = [] for item in array: if item != ’null’: array_new.append(item) return array_new # 合并非空數字 def merge(array): score = 0 if len(array) < 2: return array, score for i in range(len(array)-1): if array[i] == ’null’:break if array[i] == array[i+1]:array[i] *= 2array.pop(i+1)array.append(’null’)score += array[i] return extract(array), score # 不需要移動的話直接return if self.move_direction is None: return # 向上 if self.move_direction == ’up’: for j in range(self.matrix_size[1]): col = [] for i in range(self.matrix_size[0]):col.append(self.game_matrix[i][j]) col = extract(col) col.reverse() col, score = merge(col) self.score += score col.reverse() col = col + [’null’,] * (self.matrix_size[0] - len(col)) for i in range(self.matrix_size[0]):self.game_matrix[i][j] = col[i] # 向下 elif self.move_direction == ’down’: for j in range(self.matrix_size[1]): col = [] for i in range(self.matrix_size[0]):col.append(self.game_matrix[i][j]) col = extract(col) col, score = merge(col) self.score += score col = [’null’,] * (self.matrix_size[0] - len(col)) + col for i in range(self.matrix_size[0]):self.game_matrix[i][j] = col[i] # 向左 elif self.move_direction == ’left’: for idx, row in enumerate(copy.deepcopy(self.game_matrix)): row = extract(row) row.reverse() row, score = merge(row) self.score += score row.reverse() row = row + [’null’,] * (self.matrix_size[1] - len(row)) self.game_matrix[idx] = row # 向右 elif self.move_direction == ’right’: for idx, row in enumerate(copy.deepcopy(self.game_matrix)): row = extract(row) row, score = merge(row) self.score += score row = [’null’,] * (self.matrix_size[1] - len(row)) + row self.game_matrix[idx] = row self.move_direction = None

懶得動腦子了(反正就4*4那么大T_T),所以直接遍歷了這個二維列表以實現我們想要的所有操作了。最后,我們再寫個函數以根據當前的游戲狀態來判斷游戲是否結束就ok啦:

’’’游戲是否結束’’’@propertydef isgameover(self): for i in range(self.matrix_size[0]): for j in range(self.matrix_size[1]): if self.game_matrix[i][j] == ’null’: return False if (i == self.matrix_size[0] - 1) and (j == self.matrix_size[1] - 1):continue elif (i == self.matrix_size[0] - 1):if (self.game_matrix[i][j] == self.game_matrix[i][j+1]): return False elif (j == self.matrix_size[1] - 1):if (self.game_matrix[i][j] == self.game_matrix[i+1][j]): return False else:if (self.game_matrix[i][j] == self.game_matrix[i+1][j]) or (self.game_matrix[i][j] == self.game_matrix[i][j+1]): return False return True

其實很簡單,如果二維列表被數字填滿,且數字不能再進行合并的話,這局游戲就結束了,否則,游戲就沒有結束。定義完2048游戲類,我們的游戲基本上算是寫完了。只需要在游戲主循環里根據用戶操作來更新當前的游戲狀態并將游戲里所有必要的元素顯示在屏幕上就ok啦:

# 游戲主循環clock = pygame.time.Clock()is_running = Truewhile is_running: screen.fill(pygame.Color(cfg.BG_COLOR)) # --按鍵檢測 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:game_2048.setDirection({pygame.K_UP: ’up’, pygame.K_DOWN: ’down’, pygame.K_LEFT: ’left’, pygame.K_RIGHT: ’right’}[event.key]) # --更新游戲狀態 game_2048.update() if game_2048.isgameover: game_2048.saveMaxScore() is_running = False # --將必要的游戲元素畫到屏幕上 drawGameMatrix(screen, game_2048.game_matrix, cfg) start_x, start_y = drawScore(screen, game_2048.score, game_2048.max_score, cfg) drawGameIntro(screen, start_x, start_y, cfg) # --屏幕更新 pygame.display.update() clock.tick(cfg.FPS)return endInterface(screen, cfg)四、效果圖

最后的效果大概是這樣的:

用Python手把手教你實現2048小游戲用Python手把手教你實現2048小游戲

玩這個我還是一個菜雞,嘿嘿~

到此這篇關于用Python手把手教你實現2048小游戲的文章就介紹到這了,更多相關Python2048小游戲內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩一区二区三区免费视频| 欧美一区二区三区久久| 99久久久久| 国产精品一区二区av交换| 99久久99久久精品国产片果冰| 亚洲天堂av资源在线观看| 日韩欧美另类一区二区| 国产精品地址| 国产伦精品一区二区三区视频| 国产一区91| 国产日韩欧美在线播放不卡| 91精品国产成人观看| 水蜜桃久久夜色精品一区| 国产精品麻豆成人av电影艾秋| 91p九色成人| 欧美视频精品全部免费观看| 欧美日韩免费观看一区=区三区 | 美女视频免费精品| 国产精品免费精品自在线观看| 五月天综合网站| 国内一区二区三区| 精品一区二区三区亚洲| 免费在线亚洲| 91免费精品| 日韩精品免费一区二区三区| 国产suv精品一区二区四区视频 | 免费视频久久| 一区二区亚洲精品| 国产精品成人a在线观看| 国精品产品一区| 欧美a在线观看| 久久不见久久见免费视频7| 精品国产亚洲一区二区三区大结局| 理论片午夜视频在线观看| 国产一区久久| av一区在线| 亚洲韩日在线| 国产精品久久久久久久久久齐齐| 久久久久久美女精品| 欧洲亚洲一区二区三区| 午夜亚洲一区| 91亚洲国产成人久久精品| 亚洲久久在线| 亚洲网站视频| 亚洲国产欧美日本视频| 欧美日一区二区三区在线观看国产免 | 国产一区二区亚洲| 欧美日一区二区三区在线观看国产免| 中文视频一区| 日韩影院在线观看| 日韩欧美激情| 亚洲综合专区| 日韩精品视频在线看| 日韩高清中文字幕一区| 日本精品在线中文字幕| 美女国产精品| 日韩欧乱色一区二区三区在线| 久久99精品久久久野外观看| 成人自拍av| 午夜亚洲精品| 国产一区二区久久久久| 免费成人在线视频观看| 精品中国亚洲| 免费在线观看精品| 国产精品一区二区美女视频免费看| 老牛影视一区二区三区| 麻豆精品蜜桃| 国产亚洲高清视频| 久久久久久色 | 在线视频亚洲欧美中文| 亚洲大全视频| 欧美特黄一级| 亚洲另类黄色| 国产探花一区| 欧美日韩国产免费观看 | 精品在线网站观看| 激情综合网址| 国产成人免费| 欧美在线综合| 久久成人高清| 日韩精品水蜜桃| 亚州国产精品| 成人午夜网址| 视频一区二区国产| 韩国精品主播一区二区在线观看 | 欧美国产亚洲精品| 午夜电影亚洲| 国产一区二区精品福利地址| 国产亚洲一区| 夜鲁夜鲁夜鲁视频在线播放| 首页国产欧美日韩丝袜| 91福利精品在线观看| 日韩高清国产一区在线| 麻豆精品av| 日韩欧美看国产| 一二三区精品| 精品九九久久| 五月天av在线| 久久国产视频网| 一区三区视频| 国产一区二区三区国产精品| 性欧美精品高清| 国产91在线精品| 国产精品一站二站| 88久久精品| 在线观看精品| zzzwww在线看片免费| 亚洲精品精选| 一区二区国产在线| 都市激情国产精品| xxxxx性欧美特大| 美女少妇全过程你懂的久久| 男人的天堂亚洲一区| 久久精品国产68国产精品亚洲| 精品三级在线| 国产欧美日韩在线一区二区| 日韩精品成人| 日本aⅴ亚洲精品中文乱码| 国产精品嫩草99av在线| 在线观看免费一区二区| 亚洲激情中文在线| 国产盗摄——sm在线视频| 国产成人精品一区二区免费看京| 美女av一区| 久久香蕉精品香蕉| 精品视频91| 日韩一区电影| 亚洲h色精品| 黄色亚洲免费| 免费国产自线拍一欧美视频| 鲁大师成人一区二区三区| 亚洲在线观看| 伊人www22综合色| 日韩精品一区二区三区av | 电影91久久久| 欧美www视频在线观看| 日韩欧美在线中字| 蜜桃av在线播放| 亚洲18在线| 久久精品午夜| 69堂精品视频在线播放| 国产一区二区三区探花| 欧美亚洲tv| 136国产福利精品导航网址| 日本午夜精品久久久久| 一级欧洲+日本+国产| 亚洲18在线| 国产aⅴ精品一区二区三区久久 | 国产色噜噜噜91在线精品| 欧美日韩国产传媒| 欧美日韩视频网站| 国产精品成人自拍| 天堂av一区| 欧美91精品| 亚洲成人不卡| 精品国产乱码久久久| 国产婷婷精品| 日韩毛片视频| av资源中文在线| 国产乱码精品一区二区亚洲| 日韩国产一区二| 日韩一区自拍| 亚洲成人va| 一区二区精品伦理...| 国产精品亚洲欧美一级在线| 久久电影一区| 在线观看精品| 高清av不卡| 蜜臀精品久久久久久蜜臀 | 亚洲精品va| 欧美亚洲色图校园春色| 亚洲欧洲高清| 在线精品一区二区| 国产一区丝袜| 久久久蜜桃一区二区人| 国产探花一区| 99久久久久国产精品| 亚洲一本视频| 国产一区二区三区精品在线观看| 免费视频一区二区| 秋霞国产精品| 欧美日韩精品一区二区三区视频| 欧美黄色网页| 激情不卡一区二区三区视频在线| 一区二区日韩免费看| 久久a爱视频| 亚洲在线成人| 国产高清一区| 在线亚洲人成| 四虎在线精品| 日韩精品一级二级| 亚洲小说欧美另类婷婷| 免费在线亚洲欧美| 91精品国产自产精品男人的天堂 | 成人在线网站| 国产色噜噜噜91在线精品| 亚洲一区欧美激情| 亚洲第一区色| 欧美精品资源| 国产精品久久久久蜜臀|