Python贪吃蛇
貪吃蛇設計
文章目錄
- 貪吃蛇設計
- 設計目標
- 一、需求分析
- 二、存儲結構設計
- 1.算法設計
- 2.程序代碼
- 總結
設計目標
運用 python設計出一個簡單的貪吃蛇小游戲,以貪吃蛇游戲為目標,完成 游戲開始與結束的規則制定,游戲邊界的繪制,物體隨機的散落,蛇體的運動 與長度變化等功能模塊。
一、需求分析
系統功能的基本要求: 游戲主界面設計; 蛇體運動控制; 物體隨機出現; 游戲開始與結束的規則判定; 用戶信息(積分等)讀取。
二、存儲結構設計
采用順序存儲結構 即把邏輯上相鄰的結點存儲在物理位置相鄰的存儲單元里,結點間的邏輯 關系由存儲單元的鄰接關系來體現,由此得到的存儲表示。本程序借助列表實 現,其中每個存儲空間含有所存元素本身的信息,元素之間的邏輯關系是通過 列表下標位置簡單計算出來的線性表的順序存儲
1.算法設計
通過主函數中調用多個函數實現程序。 在主函數中實現游戲模塊初始化、Pygame時鐘對象和游戲的運行主體的加 載。在游戲運行主體的函數中實現游戲初始的定義、鍵盤輸入的判斷、食物的 顯示、蛇的顯示、蛇的移動、蛇是否存活、蛇是否吃到食物、窗體背景、分數 的顯示、游戲速度的變化。 在顯示食物的函數中,食物的主體用紅色表示 在顯示蛇的函數中,用列表的方式表示蛇的身體,蛇的邊體顏色為藍色, 其他為亮藍色。 在移動蛇的函數中,用字典判斷蛇頭移動的方向,最后要把新生成的蛇頭 1
2 長度插入蛇身中。 在判斷蛇的存活中,分有兩種導致蛇的死亡。一種蛇的頭跟窗體的四邊重 合;另一種是蛇的頭碰到了自己的身體。 在判斷蛇是否吃到食物中,當蛇吃到了食物,就重置食物的位置;當蛇沒 有吃到實物,就向前移動,并刪掉尾部一格。 定義獲取食物的函數,食物獲取為隨機。 在這里,為了使游戲具有更好的體驗,設置一個游戲開始和游戲結束的提 示界面函數。 最后定義顯示分數的函數。
2.程序代碼
代碼如下(示例):
#主函數 defmain(): pygame.init() #模塊初始化 snake_speed_clock=pygame.time.Clock() #創建 Pygame時鐘對象 screen=pygame.display.set_mode((windows_width,windows_height)) #顯示界面 screen.fill(white) #設置開始背景為白色 3 pygame.display.set_caption("Python貪吃蛇小游戲") #設置標題 show_start_info(screen) #歡迎信息 whileTrue: running_game(screen,snake_speed_clock) show_gameover_info(screen) #游戲運行主體 defrunning_game(screen,snake_speed_clock): startx=random.randint(3,map_width-8) starty=random.randint(3,map_height-8) #開始位置 snake_coords=[{'x':startx,'y':starty}, {'x':startx-1,'y':starty}, {'x':startx-2,'y':starty}] #初始貪吃蛇 direction=RIGHT #開始時向右移動 food=get_random_location() #實物隨機位置 whileTrue: #判斷鍵盤輸入 foreventinpygame.event.get(): ifevent.type==QUIT: terminate() elifevent.type==KEYDOWN: if(event.key==K_LEFTorevent.key==K_a)anddirection!=RIGHT: direction=LEFT elif(event.key==K_RIGHTorevent.key==K_d)anddirection!=LEFT: direction=RIGHT elif(event.key==K_UPorevent.key==K_w)anddirection!=DOWN: direction=UP elif(event.key==K_DOWNorevent.key==K_s)anddirection!=UP: direction=DOWN elifevent.key==K_ESCAPE: terminate() 4 move_snake(direction,snake_coords) #移動蛇 ret=snake_is_alive(snake_coords) ifnotret: break #蛇跪了.游戲結束 snake_is_eat_food(snake_coords,food) #判斷蛇是否吃到食物 screen.fill(BG_COLOR) draw_grid(screen) #畫網格 draw_snake(screen,snake_coords) #畫蛇 draw_food(screen,food) #畫食物 draw_score(screen,len(snake_coords)-3) #畫分數 pygame.display.update() #更新界面 iflen(snake_coords)<40: #速度跟隨長度變化,這樣游戲 更有意思啦 snake_speed=6+len(snake_coords)//4 else:snake_speed=16 snake_speed_clock.tick(snake_speed) #控制 fps #將食物畫出來 defdraw_food(screen,food): x=food['x']*cell_size y=food['y']*cell_size #獲取食物的 X,Y位置 信息 appleRect=pygame.Rect(x,y,cell_size,cell_size) #定義一個食物矩陣 pygame.draw.rect(screen,Red,appleRect) #畫出食物 #將貪吃蛇畫出來 defdraw_snake(screen,snake_coords): forcoordinsnake_coords: x=coord['x']*cell_size 5 y=coord['y']*cell_size wormSegmentRect=pygame.Rect(x,y,cell_size,cell_size) #蛇外層為深藍色 pygame.draw.rect(screen,dark_blue,wormSegmentRect) wormInnerSegmentRect=pygame.Rect( #蛇身子 里面的第二層藍色x+4,y+4,cell_size-8,cell_size-8) pygame.draw.rect(screen,blue,wormInnerSegmentRect) #畫蛇 #移動貪吃蛇 defmove_snake(direction,snake_coords): ifdirection==UP: #判斷蛇的 走向,并改變蛇頭的位置 newHead={'x':snake_coords[HEAD]['x'],'y':snake_coords[HEAD]['y']-1} elifdirection==DOWN: newHead={'x':snake_coords[HEAD]['x'],'y':snake_coords[HEAD]['y']+1} elifdirection==LEFT: newHead={'x':snake_coords[HEAD]['x']-1,'y':snake_coords[HEAD]['y']} elifdirection==RIGHT: newHead={'x':snake_coords[HEAD]['x']+1,'y':snake_coords[HEAD]['y']} snake_coords.insert(0,newHead) #將新生成 的蛇頭插入蛇身的首部 #移動貪吃蛇 defmove_snake(direction,snake_coords): ifdirection==UP: #判斷蛇的 走向,并改變蛇頭的位置 newHead={'x':snake_coords[HEAD]['x'],'y':snake_coords[HEAD]['y']-1} elifdirection==DOWN: newHead={'x':snake_coords[HEAD]['x'],'y':snake_coords[HEAD]['y']+1} 6 elifdirection==LEFT: newHead={'x':snake_coords[HEAD]['x']-1,'y':snake_coords[HEAD]['y']} elifdirection==RIGHT: newHead={'x':snake_coords[HEAD]['x']+1,'y':snake_coords[HEAD]['y']} snake_coords.insert(0,newHead) #將新生成 的蛇頭插入蛇身的首部 #判斷蛇死了沒 defsnake_is_alive(snake_coords): tag=True ifsnake_coords[HEAD]['x']== -1 orsnake_coords[HEAD]['x']== map_width or snake_coords[HEAD]['y']==-1or\ snake_coords[HEAD]['y']==map_height: tag=False #蛇碰壁啦 forsnake_bodyinsnake_coords[1:]: if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']: tag=False #蛇碰到自己身體啦 returntag #判斷貪吃蛇是否吃到食物 defsnake_is_eat_food(snake_coords,food): #如果是列表或字典,那么函 數內修改參數內容,就會影響到函數體外的對象。 ifsnake_coords[HEAD]['x']==food['x']andsnake_coords[HEAD]['y']==food['y']: food['x']=random.randint(0,map_width-1) food['y']=random.randint(0,map_height-1) #實物位置重新設置 else:delsnake_coords[-1] #如果沒有吃到實物, 就向前移動,那么尾部一格刪掉 7 #食物隨機生成 defget_random_location(): return{'x':random.randint(0,map_width-1),'y':random.randint(0,map_height-1)} #畫成績 defdraw_score(screen,score): font=pygame.font.Font('myfont.ttf',30) scoreSurf=font.render('得分:%s'%score,True,Green) scoreRect=scoreSurf.get_rect() #設置一個分數矩陣 scoreRect.topleft=(windows_width-120,10) #定義矩陣的起始位置 screen.blit(scoreSurf,scoreRect) #顯示分數 #程序終止 defterminate(): pygame.quit() sys.exit() if__name__=="__main__": main()總結
運用 python設計貪吃蛇游戲,其中運用了不少列表和字典 的基礎知識,最明顯的例子就是利用列表和字典建立一個二維坐標圖,分別用 列表表示 x,y,用字典儲存坐標值。還有利用隨機函數 random生成隨機初始位 置和隨機食物位置。類比 Java中設置監聽器來監聽來自輸入端的事件,python 中直接用循環 event.get()獲得事件。基于坐標的建立,可以輕松通過 x,y坐標 的移動來實現貪吃蛇的位置移動,使的游戲的建立更加簡單。
總結
- 上一篇: 怎么用计算机撩人,如何用你的专业“撩人”
- 下一篇: matlab小波分析工具箱,matlab