68行Python代碼實(shí)現(xiàn)帶難度升級(jí)的貪吃蛇
一、前言
之前版本很多小伙伴都覺得難度過高,另外也有粉絲問還能不能精簡(jiǎn)代碼。
所以這版降低了難度 (由原來過關(guān)增加5km/h改為3.5KM/h)
并通過反射代替IF ELSE的寫法,刪除了一些冗余的代碼,將代碼由85行壓縮到了68行 (不必要的壓縮代碼是不建議的,這里壓縮代碼只是為了好玩)
二、實(shí)現(xiàn)效果

個(gè)人最高紀(jì)錄

三、環(huán)境要求
python 3+
pygame包 安裝命令:打開cmd 輸入: pip install pygame
四、源碼分享
import pygame,sys,random
SCREEN,dirction_node = 600, {pygame.K_LEFT:['left',-25],pygame.K_RIGHT:['right',25],pygame.K_UP:['top',-25],pygame.K_DOWN:['top',25]} # 屏幕尺寸,移動(dòng)的定義
class Snake: # 蛇類
def __init__(self): # 初始化各種需要的屬性 [開始時(shí)默認(rèn)向右/身體塊x5]
self.dirction, self.body = pygame.K_RIGHT, []
[self.add_node() for _ in range(5)]
def add_node(self):
node = pygame.Rect(((self.body[0].left, self.body[0].top) if self.body else (0, 0)) + (25, 25)) # 隨時(shí)增加蛇塊
setattr(node, dirction_node[self.dirction][0], getattr(node, dirction_node[self.dirction][0]) + dirction_node[self.dirction][1])
self.body.insert(0, node)
def is_dead(self):
body_h = self.body[0]
if body_h.x not in range(SCREEN) or body_h.y not in range(SCREEN) or body_h in self.body[1:]: # 撞墻、撞自己則死亡
return True
def move(self):
self.add_node()
self.body.pop()
def change_direction(self, curkey): # 改變方向 但是左右、上下不能被逆向改變
LR, UD = [pygame.K_LEFT, pygame.K_RIGHT], [pygame.K_UP, pygame.K_DOWN]
if curkey in LR + UD:
if not ((curkey in LR) and (self.dirction in LR) or (curkey in UD) and (self.dirction in UD)):
self.dirction = curkey
class Food: # 食物類
def __init__(self):
self.rect = pygame.Rect(-25, 0, 25, 25)
def remove(self):
self.rect.x = -25
def set(self):
if self.rect.x == -25:
allpos = [pos for pos in range(75, SCREEN - 75, 25)] # 生成的食物距離墻在75 ~ SCREEN-55 之間
self.rect.left, self.rect.top = random.choice(allpos), random.choice(allpos)
def show_text(screen, pos, text, color, font_size=30):
cur_font = pygame.font.SysFont("SimHei", font_size) # 設(shè)置文字樣式
text_fmt = cur_font.render(text, True, color) # 設(shè)置文字內(nèi)容
screen.blit(text_fmt, pos) # 繪制文字
def main():
pygame.init()
screen = pygame.display.set_mode((SCREEN, SCREEN))
pygame.display.set_caption('貪吃蛇:是男人就堅(jiān)持到第10關(guān)!')
snake,food,clock, scores, isdead = Snake(),Food(),pygame.time.Clock(), 0, False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
snake.change_direction(event.key)
if event.key == pygame.K_SPACE and isdead: # 死后按space重新
return main()
screen.fill((255, 255, 255))
if not isdead: # 畫蛇身 / 每一步+1分
snake.move()
for rect in snake.body:
pygame.draw.rect(screen, (144, 238, 144), rect)
isdead = snake.is_dead() # 顯示死亡文字
if isdead:
show_text(screen, (150, 200), '翻車了!', (227, 29, 18), 80)
show_text(screen, (50, 320), '是男人就超過45KM/h,按空格鍵重試...', (0, 0, 22))
if food.rect == snake.body[0]: # 當(dāng)食物rect與蛇頭重合,吃掉 -> Snake增加一個(gè)Node
scores += 1 # 食物處理 / 吃到+1分
food.remove()
snake.add_node()
food.set() # 食物投遞
pygame.draw.rect(screen, (233, 150, 122), food.rect)
speed = 10 + scores * 3.5 if scores else 10 # 蛇移動(dòng)速度
show_text(screen, (20, 550), '關(guān)卡:' + str(scores) + ' 速度:' + str(speed) + 'KM/h', (0, 0, 205)) # 顯示得分和速度
pygame.display.update()
clock.tick(speed)
main()
五、總結(jié)
再?gòu)?qiáng)調(diào)一遍:這里減少代碼量只是為了好玩,不必要的壓縮代碼是不建議的!代碼可讀性、可維護(hù)性才是我們?cè)诰幋a中首要考慮的事情!
這也只是隨便弄的一個(gè)小玩意,如果真要做游戲還是建議使用游戲引擎。
市面上常見的cocos、unity都是不錯(cuò)的游戲引擎,能夠讓你開發(fā)游戲的效率達(dá)到事半功倍的效果
到此這篇關(guān)于68行Python代碼實(shí)現(xiàn)帶難度升級(jí)的貪吃蛇的文章就介紹到這了,更多相關(guān)Python 貪吃蛇內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python實(shí)現(xiàn)簡(jiǎn)易的植物識(shí)別小系統(tǒng)
這篇文章主要介紹了利用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易的植物識(shí)別系統(tǒng),文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們學(xué)習(xí)Python有一定的幫助,需要的小伙伴可以參考一下2021-12-12
Python實(shí)現(xiàn)json對(duì)值進(jìn)行模糊搜索的示例詳解
我經(jīng)常使用json進(jìn)行存儲(chǔ)配置,于是常常遇到這樣的問題:如果想要對(duì)某個(gè)數(shù)組里的值進(jìn)行模糊搜索,同時(shí)輸出相關(guān)的其他數(shù)組相同位置的的值該如何實(shí)現(xiàn)呢?本文就來和大家詳細(xì)聊聊2023-01-01
使用Python腳本zabbix自定義key監(jiān)控oracle連接狀態(tài)
這篇文章主要介紹了使用Python腳本zabbix自定義key監(jiān)控oracle連接狀態(tài),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
python對(duì) MySQL 數(shù)據(jù)庫進(jìn)行增刪改查的腳本
這篇文章主要介紹了python對(duì) MySQL 數(shù)據(jù)庫進(jìn)行增刪改查的腳本,幫助大家更好的利用python處理數(shù)據(jù)庫,感興趣的朋友可以了解下2020-10-10
Python中的裝飾器鏈(decorator chain)詳解
在Python中,裝飾器是一種高級(jí)功能,它允許你在不修改函數(shù)或類代碼的情況下,為它們添加額外的功能,裝飾器通常用于日志記錄、性能測(cè)量、權(quán)限檢查等場(chǎng)景,當(dāng)多個(gè)裝飾器應(yīng)用于同一個(gè)函數(shù)或類時(shí),形成裝飾器鏈,這篇文章主要介紹了Python中的裝飾器鏈詳解,需要的朋友可以參考下2024-06-06
python數(shù)據(jù)預(yù)處理之將類別數(shù)據(jù)轉(zhuǎn)換為數(shù)值的方法
下面小編就為大家?guī)硪黄猵ython數(shù)據(jù)預(yù)處理之將類別數(shù)據(jù)轉(zhuǎn)換為數(shù)值的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07

