python貪吃蛇核心功能實現(xiàn)下
緊接上回,已經(jīng)完成了單獨的貪食蛇的控制,但是呢,居然沒有蘋果可以吃,所以,非常簡單的加入蘋果,同時呢,修改一下主程序中貪食蛇的創(chuàng)建,單獨編寫一個貪食蛇身體生成函數(shù),這樣將來要做雙蛇也很簡單了。
#創(chuàng)建一條新的蛇 def create_new_snake(): snake_body = [] snake_x = random.randint(5, rows - 5) snake_y = random.randint(5, columns - 5) snake_body.append([snake_x, snake_y]) snake_body.append([snake_x, snake_y + 1]) snake_body.append([snake_x, snake_y + 2]) return snake_body
把主程序中所有生成新蛇的地方換成
snake = create_new_snake()
創(chuàng)建新蘋果,蘋果不能出現(xiàn)在蛇的身體里,所以
def create_new_apple(snake_body): apple_in_game = False while not apple_in_game: apple_x = random.randint(0, rows - 1) apple_y = random.randint(0, columns - 1) # print(apple_x, apple_y) if (apple_x, apple_y) not in snake_body: new_apple = pygame.image.load('apple.png') new_apple = pygame.transform.scale(new_apple, (tile_size - 2, tile_size - 2)) apple_x_location = apple_y * tile_size + x_margin/2 apple_y_location = apple_x * tile_size + y_margin/2 display.blit(new_apple, (apple_x_location, apple_y_location)) apple_in_game = True return new_apple, (apple_x, apple_y), apple_x_location, apple_y_location
在主程序中,主循環(huán)之前創(chuàng)建一個蘋果
if __name__ == '__main__': pygame.init() snake = create_new_snake() # 未按下按鍵時,默認(rèn)的初識移動方向 direction = directions[random.randint(0, 3)] # 創(chuàng)建一個小蘋果 apple, apple_location, apple_left, apple_top = create_new_apple(snake) # 吃到蘋果標(biāo)志 apple_was_eaten = False
因為蛇與蘋果之間有交互關(guān)系,如果蛇吃到蘋果,那么蛇的身體會增加一格,也就是此次循環(huán)不刪除列表的最后一個元素,所以定義了一格標(biāo)志位。
在主循環(huán)中,與監(jiān)測按鍵平級的地方,放入蛇與蘋果關(guān)系檢查。
if apple_location in snake: apple, apple_location, apple_left, apple_top = create_new_apple(snake) apple_was_eaten = True my_score += 1
無論??的那個部分碰到蘋果,都算遲到蘋果,也可以考慮只有舌頭碰到才算,這根據(jù)自己喜好吧。碰到蘋果后,蘋果消失,得分等等…
還需要修改刪除最后一個列表元素位置,同時因為蛇的身體會變長了,所以單純的碰到邊界游戲才結(jié)束,已經(jīng)不夠了,我們還需要加入如果蛇頭碰到自己的身體,游戲還是要結(jié)束。
if snake[0] in snake[1:]: snake = create_new_snake() #print(snake) elif is_right_direction(snake, new_body_location[0], new_body_location[1]): snake.insert(0, new_body_location) if not apple_was_eaten: del snake[-1] else: apple_was_eaten = False
如果不想結(jié)束的太突然,祭出萬年不變的結(jié)束動畫。
#游戲結(jié)束時特效 def game_over_animation(color=white, animation_speed=50): orig_surf = display.copy() flash_surf = pygame.Surface(display.get_size()) flash_surf = flash_surf.convert_alpha() r, g, b = color for i in range(3): for start, end, step in ((0, 255, 1), (255, 0, -1)): for alpha in range(start, end, animation_speed * step): # 先鋪一層新的界面,包含老界面所有內(nèi)容 display.blit(orig_surf, (0, 0)) # flash界面填充顏色,開始很淡,越來越濃,然后越來越淡 flash_surf.fill((r, g, b, alpha)) # 把flash界面加載到display中 display.blit(flash_surf, (0, 0)) # draw_game_board(maze) # 刷新看效果 pygame.display.update() fps_clock.tick(fps)
把動畫放到程序中。即可欣賞結(jié)束動畫。因為結(jié)束動畫使用alpha時用到了顏色的RGB三色,這里需要把while的定義改為三色(255, 255, 255),而不是’white’。
還可以加入得分系統(tǒng)。
def make_score(): score = pygame.font.Font('Kaiti.ttc', 20) score_surf = score.render('得分: %d' % my_score, True, text_color, bg_color) score_rect = score_surf.get_rect() score_rect.topleft = (screen_width-100, y_margin/8) return score_surf, score_rect
這個Kaiti.ttc字體是我從蘋果系統(tǒng)字體里導(dǎo)出到工程里的,目前發(fā)現(xiàn)如果想要顯示中文,這樣比較方便,pygame自帶的字體中,不知道那些可以正常顯示。
在循環(huán)中加入
display.blit(score_display, score_rect)
然后運行游戲
雖然簡陋,但是難看的貪食蛇完成了。我們還可以進(jìn)一步增加難度,根據(jù)得分的增加,提高fps率,也就是提高了貪食蛇的移動速度。這個就不提了。還可以增加開始結(jié)束畫面,暫停功能,聲音,音效等等…
如果增加了這些,就不符合簡陋的定義了,所以就不增加了,本身這些也太簡單了…
到此這篇關(guān)于python貪吃蛇核心功能實現(xiàn)的文章就介紹到這了,更多相關(guān)python貪吃蛇內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基于httpx模塊實現(xiàn)發(fā)送請求
這篇文章主要介紹了Python基于httpx模塊實現(xiàn)發(fā)送請求,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07Pytorch實現(xiàn)基于CharRNN的文本分類與生成示例
今天小編就為大家分享一篇Pytorch實現(xiàn)基于CharRNN的文本分類與生成示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01python字符串編碼識別模塊chardet簡單應(yīng)用
有時候需要先檢測一個文件的編碼,然后將其轉(zhuǎn)化為另一種編碼。這時候就會用到chardet(chardet是python的一個第三方庫,是非常優(yōu)秀的編碼識別模塊)2015-06-06Python詳細(xì)對比講解break和continue區(qū)別
這篇文章主要介紹了python循環(huán)控制語句 break 與 continue,break就像是終止按鍵,不管執(zhí)行到哪一步,只要遇到break,不管什么后續(xù)步驟,直接跳出當(dāng)前循環(huán)2022-06-06