您好,登錄后才能下訂單哦!
如何使用python制作俄羅斯方塊,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
為什么有這么一個簡單的游戲?這個游戲如此受歡迎?
僅僅是因為它在游戲行業異常匱乏的年代出現,從而成為了一代人的記憶嗎?恐怕并不是。
玩過俄羅斯方塊的人都明白,它給人的感覺就像是嗑瓜子一樣,一旦開始就會像上癮一樣難以停下來,絞盡腦汁只想填滿空缺的地方。
哈哈哈!小編每周的話基本上都會整理一些游戲代碼的哈!
這一期文章就帶大家來開發一款俄羅斯方塊小游戲!
游戲規則:由小方塊組成的不同形狀的板塊陸續從屏幕上方落下來,玩家通過調整板塊的位置和方向,使它們在屏幕底部拼出完整的一條或幾條。
這些完整的橫條會隨即消失,給新落下來的板塊騰出空間,與此同時,玩家得到分數獎勵。沒有被消除掉的方塊不斷堆積起來,一旦堆到屏幕頂端,玩家便告輸,游戲結束。
(1)游戲定義,俄羅斯方塊兒的不同的類型:
class tetrisShape(): def __init__(self, shape=0): # 空塊 self.shape_empty = 0 # 一字型塊 self.shape_I = 1 # L型塊 self.shape_L = 2 # 向左的L型塊 self.shape_J = 3 # T型塊 self.shape_T = 4 # 田字型塊 self.shape_O = 5 # 反向Z型塊 self.shape_S = 6 # Z型塊 self.shape_Z = 7
(2)獲得該形狀當前旋轉狀態的四個小方塊的相對坐標分布:
def getRotatedRelativeCoords(self, direction): # 初始分布 if direction == 0 or self.shape == self.shape_O: return self.relative_coords # 逆時針旋轉90度 if direction == 1: return [[-y, x] for x, y in self.relative_coords] # 逆時針旋轉180度 if direction == 2: if self.shape in [self.shape_I, self.shape_Z, self.shape_S]: return self.relative_coords else: return [[-x, -y] for x, y in self.relative_coords] # 逆時針旋轉270度 if direction == 3: if self.shape in [self.shape_I, self.shape_Z, self.shape_S]: return [[-y, x] for x, y in self.relative_coords] else: return [[y, -x] for x, y in self.relative_coords]
(3)游戲的方塊兒可以向不同方向移動:
'''向右移動''' def moveRight(self): if self.ableMove([self.current_coord[0] + 1, self.current_coord[1]]): self.current_coord[0] += 1 '''向左移動''' def moveLeft(self): if self.ableMove([self.current_coord[0] - 1, self.current_coord[1]]): self.current_coord[0] -= 1 '''順時針轉''' def rotateClockwise(self): if self.ableMove(self.current_coord, (self.current_direction - 1) % 4): self.current_direction = (self.current_direction-1) % 4 '''逆時針轉''' def rotateAnticlockwise(self): if self.ableMove(self.current_coord, (self.current_direction + 1) % 4): self.current_direction = (self.current_direction+1) % 4 '''向下移動''' def moveDown(self): removed_lines = 0 if self.ableMove([self.current_coord[0], self.current_coord[1] + 1]): self.current_coord[1] += 1 else: x_min, x_max, y_min, y_max = self.current_tetris.getRelativeBoundary(self.current_direction) # 簡單起見, 有超出屏幕就判定游戲結束 if self.current_coord[1] + y_min < 0: self.is_gameover = True return removed_lines self.mergeTetris() removed_lines = self.removeFullLines() self.createNewTetris() return removed_lines '''墜落''' def dropDown(self): removed_lines = 0 while self.ableMove([self.current_coord[0], self.current_coord[1] + 1]): self.current_coord[1] += 1 x_min, x_max, y_min, y_max = self.current_tetris.getRelativeBoundary(self.current_direction) # 簡單起見, 有超出屏幕就判定游戲結束 if self.current_coord[1] + y_min < 0: self.is_gameover = True return removed_lines self.mergeTetris() removed_lines = self.removeFullLines() self.createNewTetris() return removed_lines
(4)合并俄羅斯方塊(最下面定型不能再動的那些):
def mergeTetris(self): for x, y in self.current_tetris.getAbsoluteCoords(self.current_direction, self.current_coord[0], self.current_coord[1]): self.board_data[x + y * self.width] = self.current_tetris.shape self.current_coord = [-1, -1] self.current_direction = 0 self.current_tetris = tetrisShape()
(5)當每行鋪滿之后會得分,相應的消失一行:
'''移出整行都有小方塊的''' def removeFullLines(self): new_board_data = [0] * self.width * self.height new_y = self.height - 1 removed_lines = 0 for y in range(self.height - 1, -1, -1): cell_count = sum([1 if self.board_data[x + y * self.width] > 0 else 0 for x in range(self.width)]) if cell_count < self.width: for x in range(self.width): new_board_data[x + new_y * self.width] = self.board_data[x + y * self.width] new_y -= 1 else: removed_lines += 1 self.board_data = new_board_data return removed_lines
哈哈哈!好啦!按住方向鍵也可以變形的哈!趕快試試~
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。