Python+Pygame實(shí)戰(zhàn)之俄羅斯方塊游戲的實(shí)現(xiàn)
導(dǎo)語
俄羅斯方塊,作為是一款家喻戶曉的游戲,陪伴70、80甚至90后,度過無憂的兒時歲月
它上手簡單能自由組合、拼接技巧也很多。
你知道么,最原始的俄羅斯方塊,是長這樣嬸兒的~
是不是很有童年的味道?今天小編還要給大家,介紹一個全新版本——程序員的版本,期待期待
自從俄羅斯貓被制裁以后,很多人不禁擔(dān)心起俄羅斯方塊的命運(yùn)。
雖然名字的含俄量很高,但這款游戲圈抗衰老神話肯定不會遭殃,因?yàn)?strong>它的版權(quán)歸美國人所有,跟俄羅斯沒半毛錢關(guān)系。很多玩了半輩子俄羅斯方塊的鐵子現(xiàn)在多少能理解喬峰當(dāng)年的心情了吧~
算起來,俄羅斯方塊都快39歲高齡了,圈子里比它老的游戲沒它好玩,比它好玩的游戲沒它老。所以這一款為人類帶來無數(shù)歡樂的游戲,值得我們更深入的了解。
一、運(yùn)行環(huán)境
小編使用的環(huán)境:Python3、Pycharm社區(qū)版、,部分自帶的就不一一 展示啦。本文主要是一個Turtle版本的。
模塊安裝:pip install -i https://pypi.douban.com/simple/+模塊名
二、代碼展示
import turtle import random class Block: def __init__(self, color, tiles): self.color = color self.tiles = tiles I = Block("cyan", [ [ [ 1, 0, 0, 0 ], [ 1, 0, 0, 0 ], [ 1, 0, 0, 0 ], [ 1, 0, 0, 0 ] ], [ [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 1, 1, 1 ] ] ]) J = Block("blue", [ [ [ 0, 1, 0 ], [ 0, 1, 0 ], [ 1, 1, 0 ] ], [ [ 0, 0, 0 ], [ 1, 1, 1 ], [ 0, 0, 1 ] ], [ [ 1, 1, 0 ], [ 1, 0, 0 ], [ 1, 0, 0 ] ], [ [ 0, 0, 0 ], [ 1, 0, 0 ], [ 1, 1, 1 ] ] ]) L = Block("orange", [ [ [ 1, 0, 0 ], [ 1, 0, 0 ], [ 1, 1, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 1 ], [ 1, 1, 1 ] ], [ [ 0, 1, 1 ], [ 0, 0, 1 ], [ 0, 0, 1 ] ], [ [ 0, 0, 0 ], [ 1, 1, 1 ], [ 1, 0, 0 ] ] ]) S = Block("lime", [ [ [ 0, 0, 0 ], [ 0, 1, 1 ], [ 1, 1, 0 ] ], [ [ 1, 0, 0 ], [ 1, 1, 0 ], [ 0, 1, 0 ] ] ]) Z = Block("red", [ [ [ 0, 0, 0 ], [ 1, 1, 0 ], [ 0, 1, 1 ] ], [ [ 0, 1, 0 ], [ 1, 1, 0 ], [ 1, 0, 0 ] ] ]) O = Block("yellow", [ [ [ 1, 1 ], [ 1, 1 ] ] ]) T = Block("magenta", [ [ [ 0, 0, 0 ], [ 0, 1, 0 ], [ 1, 1, 1 ] ], [ [ 0, 1, 0 ], [ 1, 1, 0 ], [ 0, 1, 0 ] ], [ [ 0, 0, 0 ], [ 1, 1, 1 ], [ 0, 1, 0 ] ], [ [ 1, 0, 0 ], [ 1, 1, 0 ], [ 1, 0, 0 ] ] ]) tile_size = 25 map_rows = 20 map_cols = 10 map_x = -125 map_y = 250 map_turtle = turtle.Turtle() map_turtle.hideturtle() map_turtle.up() game_map = [["" for _ in range(map_cols)] for _ in range(map_rows)] active_block = None active_block_row = 0 active_block_col = 0 active_block_index = 0 block_turtle = turtle.Turtle() block_turtle.hideturtle() block_turtle.up() game_update_interval = 250 score = 0 score_turtle = turtle.Turtle() score_turtle.hideturtle() score_turtle.up() score_turtle.goto(170, 210) score_turtle.write("Score: " + str(score), font=("Calibri", 20, "bold")) game_over_turtle = turtle.Turtle() game_over_turtle.hideturtle() game_over_turtle.color("red") def draw_box(t, width, height, pencolor, fillcolor): t.color(pencolor, fillcolor) t.down() t.begin_fill() for _ in range(2): t.forward(width) t.right(90) t.forward(height) t.right(90) t.end_fill() t.up() def draw_map(): map_turtle.clear() for row in range(map_rows): for col in range(map_cols): map_turtle.goto(map_x + tile_size * col, map_y - tile_size * row) draw_box(map_turtle, tile_size, tile_size, "black", game_map[row][col].color if game_map[row][col] else "mintcream") def make_new_block(): global active_block global active_block_row, active_block_col global active_block_index active_block = random.choice((I, J, L, S, Z, O, T)) active_block_row = 0 active_block_col = 4 active_block_index = 0 def draw_block(): block_turtle.clear() # Find the x and y position of the block x = map_x + active_block_col * tile_size y = map_y - active_block_row * tile_size block_tiles = active_block.tiles[active_block_index] block_color = active_block.color for row in range(len(block_tiles)): for col in range(len(block_tiles[row])): if block_tiles[row][col] == 1: block_turtle.goto(x+col*tile_size, y-row*tile_size) draw_box(block_turtle, tile_size, tile_size, "black", block_color) def is_valid_block(block_type, block_row, block_col, block_index): block_tiles = block_type.tiles[block_index] for row in range(len(block_tiles)): for col in range(len(block_tiles[row])): if block_tiles[row][col] == 1: if block_row + row not in range(0, map_rows): return False if block_col + col not in range(0, map_cols): return False if game_map[block_row + row][block_col + col] != "": return False return True def set_block_on_map(): block_tiles = active_block.tiles[active_block_index] for row in range(len(block_tiles)): for col in range(len(block_tiles[row])): if block_tiles[row][col] == 1: game_map[active_block_row + row][active_block_col + col] = active_block draw_map() r = 0 def remove_completed_rows(): global game_map global score global game_update_interval global r new_map = [] for row in range(len(game_map)): game_row = game_map[row] if "" in game_row: new_map.append(game_row) else: score += 10 score_turtle.clear() score_turtle.write("Score: " + str(score), font=("Calibri", 20, "bold")) r += 1 if r == 5: game_update_interval = int(game_update_interval/1.1) r = 0 for row in range(0, map_rows - len(new_map)): game_row = ["" for _ in range(map_cols)] new_map.insert(0, game_row) game_map = new_map draw_map() # Task: increase the score and difficulty when a row is completed pause = False def game_loop(): global active_block, active_block_row if active_block is None: make_new_block() if not is_valid_block(active_block, active_block_row, active_block_col, active_block_index): active_block = None game_over_turtle.write("Game over!", align="center", font=("Calibri", 60, "bold")) return draw_block() else: if is_valid_block(active_block, active_block_row + 1, active_block_col, active_block_index): if not pause: active_block_row += 1 draw_block() else: set_block_on_map() active_block = None remove_completed_rows() turtle.update() # Set the next update turtle.ontimer(game_loop, game_update_interval) # Set up the turtle window turtle.setup(800, 600) turtle.title("Tetris") turtle.bgcolor("navajowhite") turtle.up() turtle.hideturtle() turtle.tracer(False) # Draw the background border around the map turtle.goto(map_x - 10, map_y + 10) draw_box(turtle, tile_size * map_cols + 20, tile_size * map_rows + 20, \ "", "lightslategray") # Draw the empty map in the window draw_map() turtle.update() # Set up the game loop turtle.ontimer(game_loop, game_update_interval) def rotate(): global active_block_index if active_block is None: return new_block_index = (active_block_index + 1) % len(active_block.tiles) if is_valid_block(active_block, active_block_row, active_block_col, new_block_index): active_block_index = new_block_index draw_block() turtle.onkeypress(rotate, "Up") def move_left(): global active_block_col if active_block is None: return if is_valid_block(active_block, active_block_row, active_block_col - 1, active_block_index): active_block_col -= 1 draw_block() turtle.onkeypress(move_left, "Left") def move_right(): global active_block_col if active_block is None: return if is_valid_block(active_block, active_block_row, active_block_col + 1, active_block_index): active_block_col += 1 draw_block() turtle.onkeypress(move_right, "Right") def drop(): global active_block_row if active_block is None: return while is_valid_block(active_block, active_block_row + 1, active_block_col, active_block_index): active_block_row += 1 draw_block() turtle.onkeypress(drop, "Down") def pause_game(): global pause pause = not pause turtle.onkeypress(pause_game, "space") def change_block_type(): global active_block global active_block_index new_block = random.choice((I, J, L, S, Z, O, T)) new_block_index = 0 if is_valid_block(new_block, active_block_row, active_block_col, new_block_index): active_block = new_block active_block_index = new_block_index draw_block() turtle.onkeypress(change_block_type, "c") turtle.listen() turtle.done()
三、效果展示
1)游戲開始
2)方塊兒截圖game over
到此這篇關(guān)于Python+Pygame實(shí)戰(zhàn)之俄羅斯方塊游戲的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python Pygame俄羅斯方塊游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python利用3D引擎寫一個Pong游戲
- Python+Pygame編寫一個Pong游戲
- Python Pygame實(shí)戰(zhàn)之實(shí)現(xiàn)經(jīng)營類游戲夢想小鎮(zhèn)代碼版
- Python+Pygame實(shí)現(xiàn)接小彈珠游戲
- Python+Pygame實(shí)戰(zhàn)之詩詞填空游戲的實(shí)現(xiàn)
- Python+numpy實(shí)現(xiàn)一個蜘蛛紙牌游戲
- Python+Pygame實(shí)戰(zhàn)之文字劇情游戲的實(shí)現(xiàn)
- Python+Pygame實(shí)戰(zhàn)之炫舞小游戲的實(shí)現(xiàn)
- Python之freegames?零代碼的22個小游戲集合
相關(guān)文章
python opencv旋轉(zhuǎn)圖像(保持圖像不被裁減)
這篇文章主要為大家詳細(xì)介紹了python opencv旋轉(zhuǎn)圖像,保持圖像不被裁減,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07Python制作數(shù)據(jù)預(yù)測集成工具(值得收藏)
這篇文章主要介紹了Python如何制作數(shù)據(jù)預(yù)測集成工具,幫助大家進(jìn)行大數(shù)據(jù)預(yù)測,感興趣的朋友可以了解下2020-08-08pandas DataFrame 根據(jù)多列的值做判斷,生成新的列值實(shí)例
今天小編就為大家分享一篇pandas DataFrame 根據(jù)多列的值做判斷,生成新的列值實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05PyQt5實(shí)現(xiàn)界面(頁面)跳轉(zhuǎn)的示例代碼
這篇文章主要介紹了PyQt5實(shí)現(xiàn)界面跳轉(zhuǎn)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04python for循環(huán)如何實(shí)現(xiàn)控制步長
這篇文章主要介紹了python for循環(huán)如何實(shí)現(xiàn)控制步長,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05Python實(shí)現(xiàn)快速保存微信公眾號文章中的圖片
這篇文章主要為大家詳細(xì)介紹了如何利用Python語言實(shí)現(xiàn)快速保存微信公眾號文章中的圖片,文中的示例代碼講解詳細(xì),感興趣的可以嘗試一下2022-06-06Python類方法__init__和__del__構(gòu)造、析構(gòu)過程分析
這篇文章主要介紹了Python類方法__init__和__del__構(gòu)造、析構(gòu)過程分析,本文分析了什么時候構(gòu)造、什么時候析構(gòu)、成員變量如何處理、Python中的共享成員函數(shù)如何訪問等問題,需要的朋友可以參考下2015-03-03