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

歡迎訪問 生活随笔!

生活随笔

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

python

贪吃蛇python小白_面向 python 小白的贪吃蛇游戏

發布時間:2024/7/5 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贪吃蛇python小白_面向 python 小白的贪吃蛇游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼和教程詳見微信公眾號:Python高效編程

效果圖

圖片

代碼和教程詳見微信公眾號:Python高效編程

文字部分:

引言

作為python 小白,總是覺得自己要做好百分之二百的準備,才能開始寫程序。以至于常常整天在那看各種語法教程,學了幾個月還是只會print('hello world')。

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

小時候,我們或多或少會沉迷于一款經久不衰的游戲------貪吃蛇。或許我們玩過各式各樣的貪吃蛇游戲,卻沒有自己動手編寫屬于自己的貪吃蛇游戲。今天就讓我們走進貪吃蛇的世界,用 python 實現簡易版的貪吃蛇游戲。

游戲簡介

首先是游戲效果圖:效果圖

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

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

安裝:

1 pip install -U pygame

接下來讓我們介紹下實現貪吃蛇的關鍵邏輯:

貪吃蛇的身體是由list構成的,list中每一個元組代表貪吃蛇在棋盤上的坐標,我們只需在這些位置畫上圖案,就能制作出一條圓滾滾的貪吃蛇來。但是如果想讓貪吃蛇活蹦亂跳,我們就要寫一個move函數。

那么貪吃蛇怎么移動呢?

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

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

如果貪吃蛇蛇頭的坐標與食物的坐標重合的話,貪吃蛇就吃到了食物。如果貪吃蛇吃到了食物,就在棋盤上隨機更新食物。如果隨機生成的食物的坐標,恰好與貪吃蛇的位置重合的話,就繼續隨機產生坐標,直到確保與貪吃蛇的坐標不同的時候。

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

如果貪吃蛇蛇頭的坐標與邊框的坐標重合的話,蛇卒。如果貪吃蛇各個部分的坐標有重合的話,就說明貪吃蛇咬到了自己,游戲結束。

接下來是各個部分的具體代碼實現:

下圖為主要需要的幾個函數:代碼結構

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

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

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

1# 貪吃蛇

2class Snack(object):

3 ? ?def __init__(self):

4 ? ? ? ?# self.item = [(3, 25), (2, 25), (1, 25), (1,24), (1,23),

5 ? ? ? ?# (1,22), (1,21), (1,20), (1,19), (1,18), (1,17), (1,16)]

6 ? ? ? ?# x 水平方向 y 豎直方向

7 ? ? ? ?# 初始方向豎直向上

8 ? ? ? ?self.item = [(3, 25), (2, 25), (1, 25), (1, 24), ]

9 ? ? ? ?self.x = 0

10 ? ? ? ?self.y = -1

11

12 ? ?def move(self, enlarge):

13 ? ? ? ?# enlarge 標記貪吃蛇有沒有吃到食物

14 ? ? ? ?if not enlarge:

15 ? ? ? ? ? ?# 吃到食物刪除尾部元素

16 ? ? ? ? ? ?self.item.pop()

17 ? ? ? ?# 新蛇頭的坐標為舊蛇頭坐標加上移動方向的位移

18 ? ? ? ?head = (self.item[0][0] + self.x, self.item[0][1] + self.y)

19 ? ? ? ?# 將新的蛇頭坐標插入在 list 最前面

20 ? ? ? ?self.item.insert(0, head)

21

22 ? ?def eat_food(self, food):

23 ? ? ? ?global score

24 ? ? ? ?# snack_x,snack_y 蛇頭坐標

25 ? ? ? ?# food_x, food_y 食物坐標

26 ? ? ? ?snack_x, snack_y = self.item[0]

27 ? ? ? ?food_x, food_y = food.item

28 ? ? ? ?# 比較蛇頭坐標與食物坐標

29 ? ? ? ?if (food_x == snack_x) and (food_y == snack_y):

30 ? ? ? ? ? ?score += 100

31 ? ? ? ? ? ?return 1

32 ? ? ? ?else:

33 ? ? ? ? ? ?return 0

34

35 ? ?def toward(self, x, y):

36 ? ? ? ?# 改變蛇頭朝向

37 ? ? ? ?if self.x * x >= 0 and self.y * y >= 0:

38 ? ? ? ? ? ?self.x = x

39 ? ? ? ? ? ?self.y = y

40

41 ? ?def get_head(self):

42 ? ? ? ?# 獲取蛇頭坐標

43 ? ? ? ?return self.item[0]

44

45 ? ?def draw(self, screen):

46 ? ? ? ?# 畫出貪吃蛇

47 ? ? ? ?# 蛇頭為半徑為 15 的紅色實心圓

48 ? ? ? ?radius = 15

49 ? ? ? ?width = 15

50 ? ? ? ?# i:1---34 ? j:1---25

51 ? ? ? ?color = 255, 0, 0

52 ? ? ? ?# position 為圖形的坐標

53 ? ? ? ?position = 10 + 20 * self.item[0][0], 10 + 20 * self.item[0][1]

54 ? ? ? ?pygame.draw.circle(screen, color, position, radius, width)

55 ? ? ? ?# 蛇身為半徑為 10 的黃色實心圓

56 ? ? ? ?radius = 10

57 ? ? ? ?width = 10

58 ? ? ? ?color = 255, 255, 0

59 ? ? ? ?for i, j in self.item[1:]:

60 ? ? ? ? ? ?position = 10 + 20 * i, 10 + 20 * j

61 ? ? ? ? ? ?pygame.draw.circle(screen, color, position, radius, width)

其次是食物模塊:

np.random.randint用于產生邊界之內的坐標,如果與貪吃蛇的坐標重合,那么就繼續生成新的隨機坐標。

1# 食物

2class Food(object):

3 ? ?def __init__(self):

4 ? ? ? ?self.item = (4, 5)

5

6 ? ?# 畫出食物

7 ? ?def _draw(self, screen, i, j):

8 ? ? ? ?color = 255, 0, 255

9 ? ? ? ?radius = 10

10 ? ? ? ?width = 10

11 ? ? ? ?# i:1---34 ? j:1---25

12 ? ? ? ?position = 10 + 20 * i, 10 + 20 * j

13 ? ? ? ?# 畫出半徑為 10 的粉色實心圓

14 ? ? ? ?pygame.draw.circle(screen, color, position, radius, width)

15

16 ? ?# 隨機產生食物

17 ? ?def update(self, screen, enlarge, snack):

18 ? ? ? ?if enlarge:

19 ? ? ? ? ? ?self.item = np.random.randint(1, BOARDWIDTH - 2), np.random.randint(1, BOARDHEIGHT - 2)

20 ? ? ? ? ? ?while self.item in snack.item:

21 ? ? ? ? ? ? ? ?self.item = np.random.randint(1, BOARDWIDTH - 2), np.random.randint(1, BOARDHEIGHT - 2)

22 ? ? ? ?self._draw(screen, self.item[0], self.item[1])

然后是init_board函數:

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

1# 初始界面

2def init_board(screen):

3 ? ?board_width = BOARDWIDTH

4 ? ?board_height = BOARDHEIGHT

5 ? ?color = 10, 255, 255

6 ? ?width = 0

7 ? ?# width:x, height:y

8 ? ?# 左右邊框占用了 X: 0 35*20

9 ? ?for i in range(board_width):

10 ? ? ? ?pos = i * 20, 0, 20, 20

11 ? ? ? ?pygame.draw.rect(screen, color, pos, width)

12 ? ? ? ?pos = i * 20, (board_height - 1) * 20, 20, 20

13 ? ? ? ?pygame.draw.rect(screen, color, pos, width)

14 ? ?# 上下邊框占用了 Y: 0 26*20

15 ? ?for i in range(board_height - 1):

16 ? ? ? ?pos = 0, 20 + i * 20, 20, 20

17 ? ? ? ?pygame.draw.rect(screen, color, pos, width)

18 ? ? ? ?pos = (board_width - 1) * 20, 20 + i * 20, 20, 20

19 ? ? ? ?pygame.draw.rect(screen, color, pos, width)

接著是game_over模塊:

如何判斷誰咬到自身呢?可以利用python內置數據結構set:set這種數據結構中不能有重復元素。如果將list變成set之后,長度變短了,就說明list中有重復元素,即貪吃蛇咬到自己了。

1# 游戲失敗

2def game_over(snack):

3 ? ?broad_x, broad_y = snack.get_head()

4 ? ?flag = 0

5 ? ?old = len(snack.item)

6 ? ?new = len(set(snack.item))

7 ? ?# 游戲失敗的兩種可能

8 ? ?# 咬到自身

9 ? ?if new < old:

10 ? ? ? ?flag = 1

11 ? ?# 撞到邊框

12 ? ?if broad_x == 0 or broad_x == BOARDWIDTH - 1:

13 ? ? ? ?flag = 1

14 ? ?if broad_y == 0 or broad_y == BOARDHEIGHT - 1:

15 ? ? ? ?flag = 1

16

17 ? ?if flag:

18 ? ? ? ?return True

19 ? ?else:

20 ? ? ? ?return False

接下來是游戲初始化模塊:

使用pygame模塊需要使用pygame.init進行初始化。pygame.display.set_mode用來設置游戲界面的大小。pygame.display.set_caption用來顯示游戲標題。

1# 游戲初始化

2def game_init():

3 ? ?# pygame 初始化

4 ? ?pygame.init()

5 ? ?# 設置游戲界面大小

6 ? ?screen = pygame.display.set_mode((BOARDWIDTH * 20, BOARDHEIGHT * 20))

7 ? ?# 設置游戲標題

8 ? ?pygame.display.set_caption('貪吃蛇游戲')

9 ? ?# sound = pygame.mixer.Sound(AUDIONAME)

10 ? ?# channel = pygame.mixer.find_channel(True)

11 ? ?# channel.play(sound)

12 ? ?return screen

最后是游戲主函數:

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

1# 開始游戲

2def game(screen):

3 ? ?snack = Snack()

4 ? ?food = Food()

5 ? ?# 設置中文字體和大小

6 ? ?font = pygame.font.SysFont('SimHei', 20)

7 ? ?is_fail = 0

8 ? ?while True:

9 ? ? ? ?for event in pygame.event.get():

10 ? ? ? ? ? ?if event.type == QUIT:

11 ? ? ? ? ? ? ? ?exit()

12 ? ? ? ?# 填充屏幕

13 ? ? ? ?screen.fill((0, 0, 100))

14 ? ? ? ?init_board(screen=screen)

15 ? ? ? ?# 獲得用戶按鍵命令

16 ? ? ? ?keys = pygame.key.get_pressed()

17 ? ? ? ?press(keys, snack)

18 ? ? ? ?# 游戲失敗打印提示

19 ? ? ? ?if is_fail:

20 ? ? ? ? ? ?font2 = pygame.font.Font(None, 40)

21 ? ? ? ? ? ?print_text(screen, font, 0, 0, text)

22 ? ? ? ? ? ?print_text(screen, font2, 400, 200, "GAME OVER")

23 ? ? ? ?# 游戲主進程

24 ? ? ? ?if not is_fail:

25 ? ? ? ? ? ?enlarge = snack.eat_food(food)

26 ? ? ? ? ? ?text = u"score: {} ?更多精彩關注微信公眾號:python高效編程".format(score)

27 ? ? ? ? ? ?print_text(screen, font, 0, 0, text)

28 ? ? ? ? ? ?food.update(screen, enlarge, snack)

29 ? ? ? ? ? ?snack.move(enlarge)

30 ? ? ? ? ? ?is_fail = game_over(snack=snack)

31 ? ? ? ? ? ?snack.draw(screen)

32 ? ? ? ?# 游戲刷新

33 ? ? ? ?pygame.display.update()

34 ? ? ? ?time.sleep(0.1)

好了,我們的貪吃蛇教程就這樣結束了,其他零碎的知識點都在源碼中。大家可以自己嘗試編寫自己的第一個貪吃蛇游戲了,還可以給自己的貪吃蛇擴展各種各樣的功能。比如一邊播放音樂,一邊開始游戲,或者編寫個更加美觀的貪吃蛇界面。源碼在微信公眾號:Python高效編程。

總結

以上是生活随笔為你收集整理的贪吃蛇python小白_面向 python 小白的贪吃蛇游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。