最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用python實(shí)現(xiàn)簡(jiǎn)易版的貪吃蛇游戲(面向python小白)

 更新時(shí)間:2018年12月30日 11:20:24   作者:python高效編程  
這篇文章主要給大家介紹了關(guān)于如何利用python實(shí)現(xiàn)簡(jiǎn)易版的貪吃蛇游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

引言

作為python 小白,總是覺(jué)得自己要做好百分之二百的準(zhǔn)備,才能開(kāi)始寫(xiě)程序。以至于常常整天在那看各種語(yǔ)法教程,學(xué)了幾個(gè)月還是只會(huì)print('hello world')。

這樣做效率太低,正確的做法,是到身邊找問(wèn)題,然后編程實(shí)現(xiàn)。比如說(shuō),我學(xué)了高等數(shù)學(xué),我是不是應(yīng)該考慮下如何去用編程實(shí)現(xiàn)求導(dǎo)或者積分操作,如果想不出怎么辦,是不是應(yīng)該 baidu 一下,別人是如何實(shí)現(xiàn)數(shù)值積分或是符號(hào)積分的。我們每天買(mǎi)東西都要用到加減甚至乘除,那么我是否能編寫(xiě)個(gè)簡(jiǎn)單的計(jì)算器,如果命令行太丑的話,我是否能夠快速地學(xué)一學(xué) pyqt5或是其他 gui來(lái)實(shí)現(xiàn)精致些的應(yīng)用程序。凡事用編程思維考慮一下,對(duì)于從編程小白進(jìn)階為編程入門(mén)是大有裨益的。

小時(shí)候,我們或多或少會(huì)沉迷于一款經(jīng)久不衰的游戲------貪吃蛇?;蛟S我們玩過(guò)各式各樣的貪吃蛇游戲,卻沒(méi)有自己動(dòng)手編寫(xiě)屬于自己的貪吃蛇游戲。今天就讓我們走進(jìn)貪吃蛇的世界,用 python 實(shí)現(xiàn)簡(jiǎn)易版的貪吃蛇游戲。

游戲簡(jiǎn)介

首先是游戲效果圖:

用戶通過(guò)操控貪吃蛇,去吃到盡可能多的食物。其中貪吃蛇不能碰到墻壁,也不能咬到自身。

本教程借助 pygame實(shí)現(xiàn)游戲界面,所以下面稍稍介紹一下 pygame的安裝,用法就在下面連同函數(shù)一起講了:

安裝:

pip install -U pygame

接下來(lái)讓我們介紹下實(shí)現(xiàn)貪吃蛇的關(guān)鍵邏輯:

貪吃蛇的身體是由list構(gòu)成的,list中每一個(gè)元組代表貪吃蛇在棋盤(pán)上的坐標(biāo),我們只需在這些位置畫(huà)上圖案,就能制作出一條圓滾滾的貪吃蛇來(lái)。但是如果想讓貪吃蛇活蹦亂跳,我們就要寫(xiě)一個(gè)move函數(shù)。

那么貪吃蛇怎么移動(dòng)呢?

如果貪吃蛇沒(méi)吃到食物,那么我們就刪除list中最后一個(gè)坐標(biāo),再在蛇頭部分插入新的位置。如何確定新的位置呢,我們就要設(shè)定貪吃蛇移動(dòng)的方向(x,y),將原蛇頭位置的坐標(biāo)在移動(dòng)方向上進(jìn)行加減操作。這樣貪吃蛇就實(shí)現(xiàn)了向前移動(dòng)的目標(biāo)。如果貪吃蛇恰好吃到了食物,唯一的不同就是不需要?jiǎng)h除貪吃蛇尾部的元素。其中需要注意的是,貪吃蛇不能朝著當(dāng)前移動(dòng)方向的反方向移動(dòng)。體現(xiàn)在代碼中,就是當(dāng)前方向與改變方向的乘積不能為負(fù)值。

那么如何知道貪吃蛇吃到了食物呢?

如果貪吃蛇蛇頭的坐標(biāo)與食物的坐標(biāo)重合的話,貪吃蛇就吃到了食物。如果貪吃蛇吃到了食物,就在棋盤(pán)上隨機(jī)更新食物。如果隨機(jī)生成的食物的坐標(biāo),恰好與貪吃蛇的位置重合的話,就繼續(xù)隨機(jī)產(chǎn)生坐標(biāo),直到確保與貪吃蛇的坐標(biāo)不同的時(shí)候。

那么如何知道游戲失敗了呢?

如果貪吃蛇蛇頭的坐標(biāo)與邊框的坐標(biāo)重合的話,蛇卒。如果貪吃蛇各個(gè)部分的坐標(biāo)有重合的話,就說(shuō)明貪吃蛇咬到了自己,游戲結(jié)束。

接下來(lái)是各個(gè)部分的具體代碼實(shí)現(xiàn):

下圖為主要需要的幾個(gè)函數(shù):

首先來(lái)看貪吃蛇模塊:

首先__init__初始化貪吃蛇的位置,初始方向豎直向上。toward函數(shù)用于改變貪吃蛇的方向,(x,y)分別表示蛇頭在水平和豎直方向的朝向。朝左x=-1,朝右x=1,朝上y=-1,朝下y=1。move函數(shù),使用標(biāo)志enlarge來(lái)判斷蛇是否吃到了食物,并進(jìn)行相應(yīng)的操作。eat_food函數(shù)判斷蛇是否吃到食物,吃到的話,分?jǐn)?shù)加 100,并返回True。toward函數(shù),用于改變蛇頭的方向,但如果改變方向與當(dāng)前方向相反,就什么操作都不執(zhí)行。draw函數(shù)用于畫(huà)出貪吃蛇的模樣,蛇頭是略大一點(diǎn)的紅心,蛇身是小一點(diǎn)的黃心。

我們?cè)趺串?huà)出這條蛇呢?這就要借助函數(shù)pygame.draw.circle,這個(gè)函數(shù)的主要參數(shù)有screen:就是你要在其中畫(huà)出貪吃蛇的游戲界面,color:圖案的顏色(RGB), position:圖案在屏幕上的位置, radius:的半徑,width:內(nèi)部填色的大小,如果為零,圖案就是空心圓;如果與半徑大小相同,圖案就是實(shí)心圓。

下面是貪吃蛇的代碼部分,大家可以結(jié)合注釋閱讀:

# 貪吃蛇
class Snack(object):
 def __init__(self):
 # self.item = [(3, 25), (2, 25), (1, 25), (1,24), (1,23),
 # (1,22), (1,21), (1,20), (1,19), (1,18), (1,17), (1,16)]
 # x 水平方向 y 豎直方向
 # 初始方向豎直向上
 self.item = [(3, 25), (2, 25), (1, 25), (1, 24), ]
 self.x = 0
 self.y = -1

 def move(self, enlarge):
 # enlarge 標(biāo)記貪吃蛇有沒(méi)有吃到食物
 if not enlarge:
  # 吃到食物刪除尾部元素
  self.item.pop()
 # 新蛇頭的坐標(biāo)為舊蛇頭坐標(biāo)加上移動(dòng)方向的位移
 head = (self.item[0][0] + self.x, self.item[0][1] + self.y)
 # 將新的蛇頭坐標(biāo)插入在 list 最前面
 self.item.insert(0, head)

 def eat_food(self, food):
 global score
 # snack_x,snack_y 蛇頭坐標(biāo)
 # food_x, food_y 食物坐標(biāo)
 snack_x, snack_y = self.item[0]
 food_x, food_y = food.item
 # 比較蛇頭坐標(biāo)與食物坐標(biāo)
 if (food_x == snack_x) and (food_y == snack_y):
  score += 100
  return 1
 else:
  return 0

 def toward(self, x, y):
 # 改變蛇頭朝向
 if self.x * x >= 0 and self.y * y >= 0:
  self.x = x
  self.y = y

 def get_head(self):
 # 獲取蛇頭坐標(biāo)
 return self.item[0]

 def draw(self, screen):
 # 畫(huà)出貪吃蛇
 # 蛇頭為半徑為 15 的紅色實(shí)心圓
 radius = 15
 width = 15
 # i:1---34 j:1---25
 color = 255, 0, 0
 # position 為圖形的坐標(biāo)
 position = 10 + 20 * self.item[0][0], 10 + 20 * self.item[0][1]
 pygame.draw.circle(screen, color, position, radius, width)
 # 蛇身為半徑為 10 的黃色實(shí)心圓
 radius = 10
 width = 10
 color = 255, 255, 0
 for i, j in self.item[1:]:
  position = 10 + 20 * i, 10 + 20 * j
  pygame.draw.circle(screen, color, position, radius, width)

其次是食物模塊:

np.random.randint用于產(chǎn)生邊界之內(nèi)的坐標(biāo),如果與貪吃蛇的坐標(biāo)重合,那么就繼續(xù)生成新的隨機(jī)坐標(biāo)。

# 食物
class Food(object):
 def __init__(self):
  self.item = (4, 5)

 # 畫(huà)出食物
 def _draw(self, screen, i, j):
  color = 255, 0, 255
  radius = 10
  width = 10
  # i:1---34 j:1---25
  position = 10 + 20 * i, 10 + 20 * j
  # 畫(huà)出半徑為 10 的粉色實(shí)心圓
  pygame.draw.circle(screen, color, position, radius, width)

 # 隨機(jī)產(chǎn)生食物
 def update(self, screen, enlarge, snack):
  if enlarge:
   self.item = np.random.randint(1, BOARDWIDTH - 2), np.random.randint(1, BOARDHEIGHT - 2)
   while self.item in snack.item:
    self.item = np.random.randint(1, BOARDWIDTH - 2), np.random.randint(1, BOARDHEIGHT - 2)
  self._draw(screen, self.item[0], self.item[1])

然后是init_board函數(shù):

board_width、board_height分別為游戲界面的寬度和高度,根據(jù)計(jì)算得出邊框占據(jù)的位置,然后打印出正方形來(lái)。pygame.draw.rect和pygame.draw.circle用法類似,區(qū)別就是rect四個(gè)參數(shù)分別為screen:屏幕,color:顏色,pos:橫坐標(biāo) x,縱坐標(biāo) y,矩形的長(zhǎng),矩形的寬。這里我設(shè)置矩形長(zhǎng)寬都為 20 。width和circle中width用法相同,都是填充大小的意思。

# 初始界面
def init_board(screen):
 board_width = BOARDWIDTH
 board_height = BOARDHEIGHT
 color = 10, 255, 255
 width = 0
 # width:x, height:y
 # 左右邊框占用了 X: 0 35*20
 for i in range(board_width):
  pos = i * 20, 0, 20, 20
  pygame.draw.rect(screen, color, pos, width)
  pos = i * 20, (board_height - 1) * 20, 20, 20
  pygame.draw.rect(screen, color, pos, width)
 # 上下邊框占用了 Y: 0 26*20
 for i in range(board_height - 1):
  pos = 0, 20 + i * 20, 20, 20
  pygame.draw.rect(screen, color, pos, width)
  pos = (board_width - 1) * 20, 20 + i * 20, 20, 20
  pygame.draw.rect(screen, color, pos, width)

接著是game_over模塊:

如何判斷誰(shuí)咬到自身呢?可以利用python內(nèi)置數(shù)據(jù)結(jié)構(gòu)set:set這種數(shù)據(jù)結(jié)構(gòu)中不能有重復(fù)元素。如果將list變成set之后,長(zhǎng)度變短了,就說(shuō)明list中有重復(fù)元素,即貪吃蛇咬到自己了。

# 游戲失敗
def game_over(snack):
 broad_x, broad_y = snack.get_head()
 flag = 0
 old = len(snack.item)
 new = len(set(snack.item))
 # 游戲失敗的兩種可能
 # 咬到自身
 if new < old:
  flag = 1
 # 撞到邊框
 if broad_x == 0 or broad_x == BOARDWIDTH - 1:
  flag = 1
 if broad_y == 0 or broad_y == BOARDHEIGHT - 1:
  flag = 1

 if flag:
  return True
 else:
  return False

接下來(lái)是游戲初始化模塊:

使用pygame模塊需要使用pygame.init進(jìn)行初始化。pygame.display.set_mode用來(lái)設(shè)置游戲界面的大小。pygame.display.set_caption用來(lái)顯示游戲標(biāo)題。

# 游戲初始化
def game_init():
 # pygame 初始化
 pygame.init()
 # 設(shè)置游戲界面大小
 screen = pygame.display.set_mode((BOARDWIDTH * 20, BOARDHEIGHT * 20))
 # 設(shè)置游戲標(biāo)題
 pygame.display.set_caption('貪吃蛇游戲')
 # sound = pygame.mixer.Sound(AUDIONAME)
 # channel = pygame.mixer.find_channel(True)
 # channel.play(sound)
 return screen

最后是游戲主函數(shù):

首先實(shí)例化貪吃蛇和食物。其次設(shè)置字體為SimHei,如果使用默認(rèn)字體對(duì)中文的支持很不好。其次顯示游戲界面,判斷游戲是否失敗。如果失敗的話,就打印GAME OVER。否則就一直執(zhí)行主函數(shù)。其中 pygame.event.get從隊(duì)列中獲取事件,也就是說(shuō)必須先獲取事件,才能得到用戶的鍵盤(pán)輸入和其他操作,screen.fill用于填充屏幕,pygame.key.get_pressed用于獲取用戶的鍵盤(pán)輸入,pygame.display.update用來(lái)刷新到之前的圖案,time.sleep用于控制刷新的頻率。

# 開(kāi)始游戲
def game(screen):
 snack = Snack()
 food = Food()
 # 設(shè)置中文字體和大小
 font = pygame.font.SysFont('SimHei', 20)
 is_fail = 0
 while True:
  for event in pygame.event.get():
   if event.type == QUIT:
    exit()
  # 填充屏幕
  screen.fill((0, 0, 100))
  init_board(screen=screen)
  # 獲得用戶按鍵命令
  keys = pygame.key.get_pressed()
  press(keys, snack)
  # 游戲失敗打印提示
  if is_fail:
   font2 = pygame.font.Font(None, 40)
   print_text(screen, font, 0, 0, text)
   print_text(screen, font2, 400, 200, "GAME OVER")
  # 游戲主進(jìn)程
  if not is_fail:
   enlarge = snack.eat_food(food)
   text = u"score: {} 更多精彩關(guān)注微信公眾號(hào):python高效編程".format(score)
   print_text(screen, font, 0, 0, text)
   food.update(screen, enlarge, snack)
   snack.move(enlarge)
   is_fail = game_over(snack=snack)
   snack.draw(screen)
  # 游戲刷新
  pygame.display.update()
  time.sleep(0.1)

好了,我們的貪吃蛇教程就這樣結(jié)束了,其他零碎的知識(shí)點(diǎn)都在源碼中。大家可以自己嘗試編寫(xiě)自己的第一個(gè)貪吃蛇游戲了,還可以給自己的貪吃蛇擴(kuò)展各種各樣的功能。比如一邊播放音樂(lè),一邊開(kāi)始游戲,或者編寫(xiě)個(gè)更加美觀的貪吃蛇界面。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • python正則表達(dá)式實(shí)現(xiàn)自動(dòng)化編程

    python正則表達(dá)式實(shí)現(xiàn)自動(dòng)化編程

    這篇文章主要介紹了python正則表達(dá)式實(shí)現(xiàn)自動(dòng)化編程,re模塊的compile()方法是構(gòu)成正則表達(dá)式的方法,向compile()傳入一個(gè)字符串表示正則表達(dá)式,該方法返回一個(gè)Regex模式的對(duì)象,需要的朋友可以參考下
    2023-01-01
  • python包相關(guān)知識(shí)點(diǎn)之包的導(dǎo)入、相對(duì)路徑以及絕對(duì)路徑

    python包相關(guān)知識(shí)點(diǎn)之包的導(dǎo)入、相對(duì)路徑以及絕對(duì)路徑

    Python的好處在于你不需要懂很多概念,你就有機(jī)會(huì)投入工作,同樣問(wèn)題也有機(jī)會(huì)隨時(shí)發(fā)生,下面這篇文章主要給大家介紹了關(guān)于python包相關(guān)知識(shí)點(diǎn)之包的導(dǎo)入、相對(duì)路徑以及絕對(duì)路徑的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • PyTorch搭建CNN實(shí)現(xiàn)風(fēng)速預(yù)測(cè)

    PyTorch搭建CNN實(shí)現(xiàn)風(fēng)速預(yù)測(cè)

    PyTorch是一個(gè)開(kāi)源的Python機(jī)器學(xué)習(xí)庫(kù),基于Torch,用于自然語(yǔ)言處理等應(yīng)用程序。它不僅能夠?qū)崿F(xiàn)強(qiáng)大的GPU加速,同時(shí)還支持動(dòng)態(tài)神經(jīng)網(wǎng)絡(luò)。本文將介紹PyTorch搭建CNN如何實(shí)現(xiàn)風(fēng)速預(yù)測(cè),感興趣的可以學(xué)習(xí)一下
    2021-12-12
  • python PIL模塊與隨機(jī)生成中文驗(yàn)證碼

    python PIL模塊與隨機(jī)生成中文驗(yàn)證碼

    今天我們要學(xué)習(xí)的內(nèi)容是如何利用Python生成一個(gè)隨機(jī)的中文驗(yàn)證碼,并將圖片保存為.jpeg格式,需要的朋友可以參考下
    2016-02-02
  • Python中如何向函數(shù)傳遞列表

    Python中如何向函數(shù)傳遞列表

    本文主要介紹了Python中如何向函數(shù)傳遞列表,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 基于pycharm 項(xiàng)目和項(xiàng)目文件命名規(guī)則的介紹

    基于pycharm 項(xiàng)目和項(xiàng)目文件命名規(guī)則的介紹

    這篇文章主要介紹了基于pycharm 項(xiàng)目和項(xiàng)目文件命名規(guī)則的介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • np.newaxis 實(shí)現(xiàn)為 numpy.ndarray(多維數(shù)組)增加一個(gè)軸

    np.newaxis 實(shí)現(xiàn)為 numpy.ndarray(多維數(shù)組)增加一個(gè)軸

    今天小編就為大家分享一篇np.newaxis 實(shí)現(xiàn)為 numpy.ndarray(多維數(shù)組)增加一個(gè)軸,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • 基于keras中import keras.backend as K的含義說(shuō)明

    基于keras中import keras.backend as K的含義說(shuō)明

    這篇文章主要介紹了keras中import keras.backend as K的含義說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python爬蟲(chóng)中g(shù)et和post方法介紹以及cookie作用

    python爬蟲(chóng)中g(shù)et和post方法介紹以及cookie作用

    本篇文章通過(guò)爬取163郵箱實(shí)例介紹了python爬蟲(chóng)中g(shù)et和post方法介紹以及cookie作用,對(duì)此有興趣的朋友學(xué)習(xí)下。
    2018-02-02
  • python hash每次調(diào)用結(jié)果不同的原因

    python hash每次調(diào)用結(jié)果不同的原因

    這篇文章主要介紹了python hash每次調(diào)用結(jié)果不同的原因,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論

泽库县| 铁岭市| 龙岩市| 岱山县| 上高县| 长汀县| 英山县| 南平市| 邢台县| 新余市| 和硕县| 庐江县| 石嘴山市| 河北省| 丹阳市| 黄平县| 汪清县| 青神县| 灵台县| 闻喜县| 莱州市| 讷河市| 新蔡县| 临澧县| 金沙县| 垣曲县| 城固县| 西林县| 永仁县| 根河市| 桦甸市| 政和县| 海原县| 黄大仙区| 兴隆县| 离岛区| 左贡县| 英山县| 宁陕县| 崇义县| 安平县|