網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
緊接上回,已經(jīng)完成了單獨(dú)的貪食蛇的控制,但是呢,居然沒(méi)有蘋果可以吃,所以,非常簡(jiǎn)單的加入蘋果,同時(shí)呢,修改一下主程序中貪食蛇的創(chuàng)建,單獨(dú)編寫一個(gè)貪食蛇身體生成函數(shù),這樣將來(lái)要做雙蛇也很簡(jiǎn)單了。
#創(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)建一個(gè)蘋果
if __name__ == '__main__':
pygame.init()
snake = create_new_snake()
# 未按下按鍵時(shí),默認(rèn)的初識(shí)移動(dòng)方向
direction = directions[random.randint(0, 3)]
# 創(chuàng)建一個(gè)小蘋果
apple, apple_location, apple_left, apple_top = create_new_apple(snake)
# 吃到蘋果標(biāo)志
apple_was_eaten = False
因?yàn)樯吲c蘋果之間有交互關(guān)系,如果蛇吃到蘋果,那么蛇的身體會(huì)增加一格,也就是此次循環(huán)不刪除列表的最后一個(gè)元素,所以定義了一格標(biāo)志位。
在主循環(huán)中,與監(jiān)測(cè)按鍵平級(jí)的地方,放入蛇與蘋果關(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
無(wú)論?的那個(gè)部分碰到蘋果,都算遲到蘋果,也可以考慮只有舌頭碰到才算,這根據(jù)自己喜好吧。碰到蘋果后,蘋果消失,得分等等…
還需要修改刪除最后一個(gè)列表元素位置,同時(shí)因?yàn)樯叩纳眢w會(huì)變長(zhǎng)了,所以單純的碰到邊界游戲才結(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é)束的太突然,祭出萬(wàn)年不變的結(jié)束動(dòng)畫。
#游戲結(jié)束時(shí)特效
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界面填充顏色,開(kāi)始很淡,越來(lái)越濃,然后越來(lái)越淡
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)
把動(dòng)畫放到程序中。即可欣賞結(jié)束動(dòng)畫。因?yàn)榻Y(jié)束動(dòng)畫使用alpha時(shí)用到了顏色的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
這個(gè)Kaiti.ttc字體是我從蘋果系統(tǒng)字體里導(dǎo)出到工程里的,目前發(fā)現(xiàn)如果想要顯示中文,這樣比較方便,pygame自帶的字體中,不知道那些可以正常顯示。
在循環(huán)中加入
display.blit(score_display, score_rect)
然后運(yùn)行游戲
雖然簡(jiǎn)陋,但是難看的貪食蛇完成了。我們還可以進(jìn)一步增加難度,根據(jù)得分的增加,提高fps率,也就是提高了貪食蛇的移動(dòng)速度。這個(gè)就不提了。還可以增加開(kāi)始結(jié)束畫面,暫停功能,聲音,音效等等…
如果增加了這些,就不符合簡(jiǎn)陋的定義了,所以就不增加了,本身這些也太簡(jiǎn)單了…
原文鏈接:https://blog.csdn.net/jackwsd/article/details/126501681
相關(guān)推薦
- 2022-12-27 Android?Compose狀態(tài)改變動(dòng)畫animateXxxAsState使用詳解_Android
- 2022-01-29 android打包證書生成
- 2022-07-29 C++超詳細(xì)講解操作符的重載_C 語(yǔ)言
- 2023-06-03 一文帶你吃透Python中的os和sys模塊_python
- 2022-03-14 sql 排序order by重復(fù)數(shù)據(jù)問(wèn)題
- 2023-12-16 六個(gè)開(kāi)發(fā)者必知必會(huì)的Git命令
- 2022-06-04 C#復(fù)雜XML反序列化為實(shí)體對(duì)象兩種方式小結(jié)_C#教程
- 2022-10-17 QT實(shí)現(xiàn)TCP網(wǎng)絡(luò)聊天室_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支