日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python贪吃蛇 (完整代码+详细注释+粘贴即食)

發(fā)布時間:2023/12/31 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python贪吃蛇 (完整代码+详细注释+粘贴即食) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 代碼
  • 運行截圖
  • 筆記補充
  • 參考博客(阿里嘎多!)

代碼

#!/usr/bin/env python # -*- coding: utf-8 -*- # author:Wangdali time:2021年1月20日16:08:44 #python實現(xiàn):貪吃蛇 ''' 游戲玩法:回車開始游戲;空格暫停游戲/繼續(xù)游戲;方向鍵/wsad控制小蛇走向 ''' ''' 思路:用列表存儲蛇的身體;用淺色表示身體,深色背景將身體凸顯出來; 蛇的移動:仔細觀察,是:身體除頭和尾不動、尾部消失,頭部增加,所以,新添加的元素放在列表頭部、刪除尾部元素; 游戲結(jié)束判定策略:超出邊界;觸碰到自己的身體:蛇前進的下一格子為身體的一部分(即在列表中)。 ''' #注:因為在列表中需要頻繁添加和刪除元素,所以用deque容器代替列表;是因為deque具有高效的插入和刪除效率 #初始化蛇,長度為3,放置在屏幕左上角; #導(dǎo)包 import random import sys import time import pygame from pygame.locals import * from collections import deque #基礎(chǔ)設(shè)置 Screen_Height=480 Screen_Width=600 Size=20#小方格大小 Line_Width=1 #游戲區(qū)域的坐標范圍 Area_x=(0,Screen_Width//Size-1) #0是左邊界,1是右邊界 #注:python中//為整數(shù)除法;/為浮點數(shù)除法 Area_y=(2,Screen_Height//Size-1) #食物的初步設(shè)置 #食物的分值+顏色 Food_Style_List=[(10,(255,100,100)),(20,(100,255,100)),(30,(100,100,255))] #整體顏色設(shè)置 Light=(100,100,100) Dark=(200,200,200) Black=(0,0,0) Red=(200,30,30) Back_Ground=(40,40,60) #文本輸出格式設(shè)置 def Print_Txt(screen,font,x,y,text,fcolor=(255,255,255)):#font.render參數(shù)意義:.render(內(nèi)容,是否抗鋸齒,字體顏色,字體背景顏色)Text=font.render(text,True,fcolor)screen.blit(Text,(x,y)) #初始化蛇 def init_snake():snake=deque()snake.append((2,Area_y[0]))snake.append((1,Area_y[0]))snake.append((0,Area_y[0]))return snake #食物設(shè)置 #注意需要對食物出現(xiàn)在蛇身上的情況進行判斷 def Creat_Food(snake):'''注:randint 產(chǎn)生的隨機數(shù)區(qū)間是包含左右極限的,也就是說左右都是閉區(qū)間的[1, n],能取到1和n。而 randrange 產(chǎn)生的隨機數(shù)區(qū)間只包含左極限,也就是左閉右開的[1, n),1能取到,而n取不到。randint產(chǎn)生的隨機數(shù)是在指定的某個區(qū)間內(nèi)的一個值,而 randrange 產(chǎn)生的隨機數(shù)可以設(shè)定一個步長,也就是一個間隔。'''food_x=random.randint(Area_x[0],Area_x[1]) #此處有疑問food_y=random.randint(Area_y[0],Area_y[1])#如果食物出現(xiàn)在蛇上,重來;while(food_x,food_y)in snake:food_x = random.randint(Area_x[0], Area_x[1])food_y = random.randint(Area_y[[0], Area_y[1]])return food_x,food_y #食物風(fēng)格 def Food_Style():return Food_Style_List[random.randint(0,2)] #返回隨機的分值和顏色 def main():pygame.init()screen=pygame.display.set_mode((Screen_Width,Screen_Height)) #初始化一個準備顯示的窗口或屏幕pygame.display.set_caption('貪吃蛇') #Set the current window caption#得分字體設(shè)置font1=pygame.font.SysFont('SimHei',24)#GO字體設(shè)置font2 = pygame.font.SysFont(None, 72)fwidth, fheight = font2.size('GAME OVER') ####程序bug修復(fù):如果蛇在向右移動,快速點擊分別施加向下、向左的命令,向下的命令會被覆蓋,只有向左的命令被接受,直接GameOver# b變量為了防止這個情況發(fā)生b=True#蛇snake=init_snake()#食物food=Creat_Food(snake)food_style=Food_Style()#方向控制pos=(1,0) ####啟動游戲相關(guān)變量初始化game_over=True #結(jié)束標志 # 是否開始,當start = True,game_over = True 時,才顯示 GAME OVERgame_start=False #開始標志score=0 #得分orispeed=0.3 #蛇初始速度speed=orispeed #蛇速度last_move_time=Nonepause=False #暫停while True:for event in pygame.event.get():if event.type==QUIT:sys.exit()elif event.type==KEYDOWN:if event.key==K_RETURN:if game_over:game_start=Truegame_over=Falseb=Truesnake=init_snake()food=Creat_Food(snake)food_style=Food_Style()pos=(1,0)#得分score=0last_move_time=time.time()elif event.key==K_SPACE:if not game_over:pause=not pause#以下為防止蛇在向右移動時按向左鍵,導(dǎo)致GameOverelif event.key in (K_UP,K_w):if b and not pos[1]: ###pos=(0,-1)b=Falseelif event.key in (K_DOWN,K_s):if b and not pos[1]:pos = (0, 1)b = Falseelif event.key in (K_LEFT,K_a):if b and not pos[0]:pos = (-1, 0)b = Falseelif event.key in (K_RIGHT,K_d):if b and not pos[0]:pos = (1, 0)b = False#填充背景色screen.fill(Back_Ground)####畫網(wǎng)格線、豎線for x in range(Size, Screen_Width, Size):pygame.draw.line(screen, Black, (x, Area_y[0] * Size), (x, Screen_Height), Line_Width)#畫網(wǎng)格線、橫線for y in range(Area_y[0] * Size, Screen_Height, Size):pygame.draw.line(screen, Black, (0, y), (Screen_Width, y), Line_Width)#蛇的爬行過程if not game_over:curTime=time.time()if curTime-last_move_time>speed: ###if not pause:b=Truelast_move_time=curTimenext_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])#如果吃到了食物if next_s==food:snake.appendleft(next_s)score+=food_style[0]speed = orispeed - 0.03 * (score // 100)food = Creat_Food(snake)food_style = Food_Style()else:#在區(qū)域內(nèi)if Area_x[0]<=next_s[0]<=Area_x[1] and Area_y[0]<=next_s[1]<=Area_y[1] and next_s not in snake:snake.appendleft(next_s)snake.pop()else :game_over=True#畫食物if not game_over:'''rect(Surface,color,Rect,width=0) 第一個參數(shù)指定矩形繪制到哪個Surface對象上第二個參數(shù)指定顏色第三個參數(shù)指定矩形的范圍(left,top,width,height)第四個參數(shù)指定矩形邊框的大小(0表示填充矩形)例如繪制三個矩形:pygame.draw.rect(screen, BLACK, (50, 50, 150, 50), 0)pygame.draw.rect(screen, BLACK, (250, 50, 150, 50), 1)pygame.draw.rect(screen, BLACK, (450, 50, 150, 50), 10)'''# 避免 GAME OVER 的時候把 GAME OVER 的字給遮住了pygame.draw.rect(screen, food_style[1], (food[0] * Size, food[1] * Size, Size, Size), 0)#畫蛇for s in snake:pygame.draw.rect(screen, Dark, (s[0] * Size + Line_Width, s[1] * Size + Line_Width,Size - Line_Width * 2, Size - Line_Width * 2), 0)Print_Txt(screen, font1, 30, 7, f'速度: {score // 100}')Print_Txt(screen, font1, 450, 7, f'得分: {score}')#畫GameOverif game_over:if game_start:#print('GameOver')Print_Txt(screen, font2, (Screen_Width - fwidth) // 2, (Screen_Height - fheight) // 2, 'GAME OVER',Red)pygame.display.update() if __name__=='__main__':main()

運行截圖

筆記補充

1)
蛇的移動,首先根據(jù)方向來判斷,這里使用pos變量來記錄方向
pos(1, 0) //表示當前蛇向右的方向
pos(-1, 0) //表示當前蛇向左的方向
pos(0, 1) //表示當前蛇向下的方向
pos(0, -1) //表示當前蛇向上的方向
2)
怎么能控制蛇的速度呢?
其實是控制時間來刷新,我們知道所有的動作都在一個循環(huán)里面完成的,也就是代碼都一直在運行著。

比如我設(shè)置速度為1,表示一秒刷新一次,那么蛇的移動也就是一秒一次,我們看到的也是一秒移動一格。

當我們設(shè)置速度為0.5,表示0.5秒刷新一次,那我們就看到0.5秒移動一格,速度就相對地看起來快了。

參考博客(阿里嘎多!)

1、博客A
2、博客B

總結(jié)

以上是生活随笔為你收集整理的Python贪吃蛇 (完整代码+详细注释+粘贴即食)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。