欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pygame實(shí)現(xiàn)貪吃蛇游戲(下)

 更新時(shí)間:2019年10月29日 10:12:12   作者:冰風(fēng)漫天  
這篇文章主要為大家介紹了pygame實(shí)現(xiàn)貪吃蛇游戲的下篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

接著上篇pygame實(shí)現(xiàn)貪吃蛇游戲(上)繼續(xù)介紹

1.豆子的吃掉效果

只需在代碼最后移動(dòng)蛇頭的代碼后增加一個(gè)蛇頭和豆子坐標(biāo)的判斷即可

if snake_x == bean_x and snake_y == bean_y:
 bean_x,bean_y = get_bean_pos()

體驗(yàn)一下,現(xiàn)在蛇頭碰到豆子后,豆子已經(jīng)會(huì)消失了

2.蛇身的加長(zhǎng)

前面我們給蛇身只設(shè)置了一個(gè)坐標(biāo),既然蛇身會(huì)越加越長(zhǎng),當(dāng)然我們用一個(gè)數(shù)組去存這個(gè)身體是更合適的,于是我們把蛇身的變量做一些修改。

在初始化body_x和body_y完成后,將這個(gè)坐標(biāo)加入一個(gè)名叫body_arr的數(shù)組

body_arr = [(body_x,body_y)]

將繪制蛇身的pygame.draw.rect做下修改,用遍歷數(shù)組去繪制

for body_x,body_y in body_arr:
 pygame.draw.rect(screen,yellow,[body_x-20,body_y-20,40,40],5)

蛇身的移動(dòng)也同樣要改成循環(huán),分別使身體的后一節(jié)使用前一節(jié)的位置

body_arr = [(snake_x,snake_y)]+body_arr[:-1]

最后吃到豆子后蛇身的加長(zhǎng)我們可以這么做,先把蛇最后一節(jié)的位置備份一下

last_body_x,last_body_y = body_arr[-1]

如果吃到豆子,那么把這備份下的最后一節(jié)加到身體數(shù)組最后就好了

body_arr.append((last_body_x,last_body_y))

現(xiàn)在基本的游戲效果可以看到了

3.蛇自身碰撞的游戲失敗判斷

用一個(gè)標(biāo)記表示游戲狀態(tài)

game_state = 1 # 游戲狀態(tài)1.表示正常 2.表示失敗

將移動(dòng)判斷的代碼加入標(biāo)記的判斷改成

if game_state == 1 and pygame.time.get_ticks() >= ticks:

在移動(dòng)的最后增加一個(gè)頭和身體、身體和身體的重合判斷

for body_x,body_y in body_arr: # 判斷下蛇頭和身體是否有重合
      if snake_x == body_x and snake_y == body_y:
        game_state = 2
        break
for i in range(len(body_arr)-1):
      for j in range(i+1,len(body_arr)):
        if body_arr[i][0] == body_arr[j][0] and body_arr[i][1] == body_arr[j][1]: # 判斷下身體每節(jié)是否有重合
          game_state = 2
          break

游戲失敗后的效果的圖如下

再把網(wǎng)格線去了,看起來(lái)干凈一點(diǎn)

最后再附一下完整的程序

# -*- coding=utf-8 -*-
import random
import pygame
from pygame.locals import KEYDOWN,K_LEFT,K_RIGHT,K_UP,K_DOWN
pygame.init()
screencaption = pygame.display.set_caption('first pygame')
screen = pygame.display.set_mode((400,400)) #設(shè)置400*400窗口

snake_x = random.randint(0,9)*40+20
snake_y = random.randint(0,9)*40+20

game_state = 1 # 游戲狀態(tài)1.表示正常 2.表示失敗
def get_bean_pos():
 return random.randint(0,9)*40+20,random.randint(0,9)*40+20 

yellow = 255,255,0 

bean_x,bean_y = get_bean_pos()

diff_ticks = 300 # 移動(dòng)一次蛇頭的事件,單位毫秒
ticks = pygame.time.get_ticks()
ticks += diff_ticks

#dire = random.randint(0,3) # 假設(shè)0、1、2、3分別代表方向左、右、上、下
if snake_x < 200:
 dire = 1 # 往右移動(dòng)
else: 
 dire = 0 # 往左移動(dòng) 

body_y = snake_y
if dire == 0: # 向左移動(dòng)
 if snake_x + 40 < 400: 
  body_x = snake_x + 40
 else: # 身體不能放右側(cè)了,只能往上下方向放
  if snake_y > 200:
   body_x = snake_x
   body_y -= 40
  else:
   body_x = snake_x
   body_y += 40
else: # 向右移動(dòng)
 if snake_x - 40 > 0:
  body_x = snake_x - 40
 else: # 身體不能放左側(cè)了,只能往上下方向放
  if snake_y > 200:
   body_x = snake_x
   body_y -= 40
  else:
   body_x = snake_x
   body_y += 40
body_arr = [(body_x,body_y)]

def set_snake_next_pos(snake_x, snake_y):
 if dire == 0:
  if snake_x - 40 > 0:
   snake_x -= 40
 if dire == 1:
  if snake_x + 40 < 400:
   snake_x += 40
 if dire == 2:
  if snake_y - 40 > 0:
   snake_y -= 40
 if dire == 3:
  if snake_y + 40 < 400:
   snake_y += 40
 return snake_x,snake_y

while True:
 for event in pygame.event.get():
   if event.type == pygame.QUIT:
    pygame.quit()
    exit()
   if event.type == KEYDOWN:
    if event.key == K_LEFT:
     if dire!=0 and dire!=1 and snake_x - 40 > 0: # 和當(dāng)前方向不是同方向或反方向并且可以左移
      dire = 0
    if event.key == K_RIGHT:
     if dire!=0 and dire!=1 and snake_x + 40 < 400: # 和當(dāng)前方向不是同方向或反方向并且可以右移
      dire = 1
    if event.key == K_UP:
     if dire!=2 and dire!=3 and snake_y - 40 > 0: # 和當(dāng)前方向不是同方向或反方向并且可以上移
      dire = 2
    if event.key == K_DOWN:
     if dire!=2 and dire!=3 and snake_y + 40 < 400: # 和當(dāng)前方向不是同方向或反方向并且可以下移
      dire = 3

 screen.fill((0,0,255)) # 將界面設(shè)置為藍(lán)色

 #for x in range(0,400,40):
 # pygame.draw.line(screen,(255,255,255),(x,0),(x,400),1)
 #for y in range(0,400,40):
 # pygame.draw.line(screen,(255,255,255),(0,y),(400,y),1)

 pygame.draw.circle(screen,yellow,[snake_x,snake_y],20,2)
 for body_x,body_y in body_arr:
  pygame.draw.rect(screen,yellow,[body_x-20,body_y-20,40,40],5) 
 
 pygame.draw.circle(screen,yellow,[bean_x,bean_y],10,10)
 
 if game_state == 2:
  myfont = pygame.font.Font(None,30)
  white = 255,255,255
  textImage = myfont.render("Game over", True, white)
  screen.blit(textImage, (160,190))

 
 pygame.display.update() # 必須調(diào)用update才能看到繪圖顯示

 if game_state == 1 and pygame.time.get_ticks() >= ticks:
  last_body_x,last_body_y = body_arr[-1]
  body_arr = [(snake_x,snake_y)]+body_arr[:-1]
  snake_x,snake_y = set_snake_next_pos(snake_x,snake_y)
  ticks += diff_ticks
  #if snake_x == bean_x and snake_y == bean_y:
  # bean_x,bean_y = get_bean_pos()
  # body_arr.append((last_body_x,last_body_y))
  for body_x,body_y in body_arr:
   if snake_x == body_x and snake_y == body_y: # 判斷下蛇頭和身體是否有重合
    game_state = 2
    break
  for i in range(len(body_arr)-1):
   for j in range(i+1,len(body_arr)):
    if body_arr[i][0] == body_arr[j][0] and body_arr[i][1] == body_arr[j][1]: # 判斷下身體每節(jié)是否有重合
     game_state = 2
     break
 
 if snake_x == bean_x and snake_y == bean_y:
  bean_x,bean_y = get_bean_pos()
  body_arr.append((last_body_x,last_body_y))

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Windows系統(tǒng)下pycharm中的pip換源

    Windows系統(tǒng)下pycharm中的pip換源

    這篇文章主要介紹了Windows系統(tǒng)下pycharm中的pip換源,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python 處理表格進(jìn)行成績(jī)排序的操作代碼

    Python 處理表格進(jìn)行成績(jī)排序的操作代碼

    這篇文章主要介紹了Python 處理表格進(jìn)行成績(jī)排序,也就是說(shuō)將學(xué)生從按照學(xué)號(hào)排序變?yōu)榘凑粘煽?jī)從高到低進(jìn)行排序,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧
    2021-07-07
  • flask操作數(shù)據(jù)庫(kù)插件Flask-SQLAlchemy的使用

    flask操作數(shù)據(jù)庫(kù)插件Flask-SQLAlchemy的使用

    Python?中最廣泛使用的ORM框架是SQLAlchemy,它是一個(gè)很強(qiáng)大的關(guān)系型數(shù)據(jù)庫(kù)框架,本文就來(lái)介紹一下flask操作數(shù)據(jù)庫(kù)插件Flask-SQLAlchemy的使用,感興趣的可以了解一下
    2023-09-09
  • 對(duì)numpy數(shù)據(jù)寫入文件的方法講解

    對(duì)numpy數(shù)據(jù)寫入文件的方法講解

    今天小編就為大家分享一篇對(duì)numpy數(shù)據(jù)寫入文件的方法講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Python報(bào)錯(cuò):OSError:?[Errno?22]?Invalid?argument解決方案及應(yīng)用實(shí)例

    Python報(bào)錯(cuò):OSError:?[Errno?22]?Invalid?argument解決方案及應(yīng)用實(shí)例

    最近跑別人的項(xiàng)目遇到一個(gè)這樣的問(wèn)題一開始以為是沒有用管理員的權(quán)限運(yùn)行,導(dǎo)致創(chuàng)建不了日志文件后來(lái)發(fā)現(xiàn)是和windows的命名規(guī)則沖突了,這篇文章主要給大家介紹了關(guān)于Python報(bào)錯(cuò):OSError:?[Errno?22]?Invalid?argument的解決方案及應(yīng)用實(shí)例,需要的朋友可以參考下
    2024-07-07
  • python函數(shù)默認(rèn)參數(shù)使用避坑指南

    python函數(shù)默認(rèn)參數(shù)使用避坑指南

    這篇文章主要為大家介紹了python函數(shù)默認(rèn)參數(shù)使用的踩雷避坑詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Anaconda配置各版本Pytorch的實(shí)現(xiàn)

    Anaconda配置各版本Pytorch的實(shí)現(xiàn)

    本文是整理目前全版本pytorch深度學(xué)習(xí)環(huán)境配置指令,以下指令適用Windows操作系統(tǒng),在Anaconda Prompt中運(yùn)行,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Django框架組成結(jié)構(gòu)、基本概念與文件功能分析

    Django框架組成結(jié)構(gòu)、基本概念與文件功能分析

    這篇文章主要介紹了Django框架組成結(jié)構(gòu)、基本概念與文件功能,簡(jiǎn)單分析了Django框架的基本架構(gòu)、組成、項(xiàng)目創(chuàng)建方法、模塊組成以及相關(guān)文件功能,需要的朋友可以參考下
    2019-07-07
  • python os庫(kù)使用示例教程

    python os庫(kù)使用示例教程

    這篇文章主要介紹了python os庫(kù)使用示例教程,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 用Pytorch訓(xùn)練CNN(數(shù)據(jù)集MNIST,使用GPU的方法)

    用Pytorch訓(xùn)練CNN(數(shù)據(jù)集MNIST,使用GPU的方法)

    今天小編就為大家分享一篇用Pytorch訓(xùn)練CNN(數(shù)據(jù)集MNIST,使用GPU的方法),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08

最新評(píng)論