1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        使用Opencv和Python構(gòu)建貪吃蛇小游戲

        共 4094字,需瀏覽 9分鐘

         ·

        2021-02-23 11:41

        點(diǎn)擊上方AI算法與圖像處理”,選擇加"星標(biāo)"或“置頂”

        重磅干貨,第一時(shí)間送達(dá)

        來源丨h(huán)ttps://blog.csdn.net/ZeroSwift/article/details/112172663
        編輯丨AI算法與圖像處理

        導(dǎo)讀

        ?

        本文詳細(xì)介紹貪吃蛇小游戲,主要是使用方向鍵來控制小蛇的移動(dòng),并讓小蛇盡可能多的吃到地圖中的小蘋果,變得更長(zhǎng)。

        基礎(chǔ)工作

        導(dǎo)入基礎(chǔ)程序庫(kù)

        首先需要導(dǎo)入我們所需要的各種程序庫(kù)。

        import cv2import numpy as npform random import randintform?random?import?choice


        定義小蛇的基礎(chǔ)構(gòu)成

        在這個(gè)程序中,我們的小蛇由頭部和身體組成。

        • 頭部:使用Head類來表示蛇頭,即蛇頭是整條蛇的最開始部分。

        • 身體:對(duì)于一條小蛇,除了蛇頭外,都是身體。

        具體如下圖所示。


        接下來,我們分別定義小蛇的頭部類和身體類。

        頭部類

        因?yàn)檎麄€(gè)小蛇是二維平面的小蛇,因此,確定一個(gè)蛇頭的位置需要xy兩個(gè)值。此外,對(duì)于蛇頭的移動(dòng)方向,需要一個(gè)direction變量來確定。具體代碼如下。

        class Head:  def __init__(self, direction, x, y):    # 蛇頭運(yùn)動(dòng)的方向    self.direction = direction    # 蛇頭在二維平面的坐標(biāo)    self.x = x    self.y = y
        # 移動(dòng)函數(shù),通過不同的方向來對(duì)蛇頭的位置進(jìn)行更新 def move(self): # 右 if self.direction == 0: self.x += 1 # 下 elif self.direction == 1: self.y += 1 # 左 elif self.direction == 2: self.x -= 1 # 上 elif self.direction == 3: self.y -= 1


        身體類

        身體類也需要使用xy來確定位置,但由于每個(gè)身體但小塊的運(yùn)動(dòng)均依賴于前一個(gè)小塊的運(yùn)動(dòng),因此,身體類沒有direction變量,有的只是front變量,用來讓身體知道自己的上一塊的位置。具體代碼如下。

        class SnakePart:  def __init__(self, front, x, y):    self.front = front    self.x = x    self.y = y
        # 移動(dòng)函數(shù),當(dāng)前小塊的下一個(gè)位置為當(dāng)前小塊的前一個(gè)小塊的當(dāng)前位置 def move(self): self.x = self.front.x????self.y?=?self.front.y


        定義游戲變量

        • CELL_SIZE:每個(gè)單元格的寬度。

        • BOARD_SIZE:每一行有多少個(gè)單元格。

        • SPEED:小蛇運(yùn)動(dòng)的速度。

        • GROWTH:小蛇每吃掉一個(gè)蘋果后,蘋果出現(xiàn)的速度。

        • 等等。。。

          # 每個(gè)單元格的寬度  CELL_SIZE = 20  # 每一行有多少個(gè)單元格  BOARD_SIZE = 45  # 小蛇運(yùn)動(dòng)的速度。  SPEED = 12  # 小蛇每吃掉一個(gè)蘋果后,小蛇增長(zhǎng)的速度。  GROWTH = 3

        # 判斷蘋果是否被吃了 eaten = True # 判斷是否推出游戲 quit = False # 變量增長(zhǎng). grow = 0
        # 使用數(shù)組來儲(chǔ)存小蛇 snake = [] # 初始化小蛇的頭部并放在中間 head = Head(0, int((BOARD_SIZE - 1)/2), int((BOARD_SIZE - 1)/2))??snake.append(head)

        編寫游戲

        初始化opencv窗口

        除了初始化窗口外,這個(gè)函數(shù)還可以讓用戶的焦點(diǎn)自動(dòng)到該貪吃蛇游戲中。

        # 構(gòu)建窗口并獲取焦點(diǎn)def win_focus():  cv2.namedWindow("Snake Game", cv2.WINDOW_AUTOSIZE);  board = np.zeros([BOARD_SIZE * CELL_SIZE, BOARD_SIZE * CELL_SIZE, 3])  cv2.imshow("Snake Game", board);  cv2.setWindowProperty("Snake Game", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN);  cv2.waitKey(2000)??cv2.setWindowProperty("Snake?Game",?cv2.WND_PROP_FULLSCREEN,?cv2.WINDOW_AUTOSIZE)

        展現(xiàn)游戲

        這個(gè)函數(shù)需要完成的功能如下。

        • 創(chuàng)建一個(gè)用于給小蛇活動(dòng)的黑色背景板。

        • 把蛇的身體(包括頭部)設(shè)置為綠色。

        • 把蘋果設(shè)置成紅色。

        • 監(jiān)聽鍵盤按鍵信息。

        具體代碼如下。

        def display():  # 創(chuàng)建黑色背景板  board = np.zeros([BOARD_SIZE, BOARD_SIZE, 3])  # 讓小蛇變成綠色  for part in snake:    board[part.y, part.x] = [0, 255, 0]  # 讓蘋果變成紅色  board[appley, applex] = [0, 0, 255]
        # 顯示背景板,刷新,返回鍵盤按鍵信息 cv2.imshow("Snake Game", np.uint8(board.repeat(CELL_SIZE, 0).repeat(CELL_SIZE, 1))) key = cv2.waitKey(int(1000/SPEED))
        # 沒有任何按鍵被按下時(shí)返回-1??return?key

        游戲主循環(huán)

        在游戲主循環(huán)中,主要完成兩件事

        • 檢查地圖中的蘋果是否被吃了。

        • 如果被吃,需要增長(zhǎng)小蛇長(zhǎng)度,并重新生成一個(gè)新的不被小蛇覆蓋的蘋果。

        # 判斷蘋果是否被吃if eaten:  # 將二維地圖轉(zhuǎn)換為一維序列  s = list(range(0, BOARD_SIZE ** 2))  # 將序列中被小蛇占有的值給剔除  for part in snake:      s.remove(part.x * BOARD_SIZE + part.y)
        # 隨機(jī)生成一個(gè)不被小蛇覆蓋的新蘋果 a = choice(s) applex = int(a/BOARD_SIZE) appley = a % BOARD_SIZE
        ??eaten?=?False

        刷新屏幕并更新移動(dòng)方向


        # 刷新屏幕key = display()
        # 根據(jù)按鍵的信息來控制小蛇的運(yùn)動(dòng)方向if key == 8 or key == 27: breakelif key == ord("d") : head.direction = 0elif key == ord("s") : head.direction = 1elif key == ord("a") : head.direction = 2elif key == ord("w") : head.direction = 3
        # 移動(dòng)小蛇# 從后往前移動(dòng),因?yàn)楹笠粋€(gè)小塊使用的是前一個(gè)小塊的位置for part in snake[::-1]: part.move()

        小蛇吃到蘋果后長(zhǎng)大

        # 當(dāng)小蛇吃到蘋果后的生長(zhǎng)代碼   if grow > 0:  # 在蛇身的后尾添加上新的蛇身塊  snake.append(SnakePart(snake[-1], subx, suby))  grow -= 1
        # 當(dāng)蛇頭碰到蘋果,更新變量if applex == head.x and appley == head.y: subx = snake[-1].x suby = snake[-1].y eaten = True??grow?+=?GROWTH

        游戲失敗的判斷


        # 碰撞墻壁規(guī)則if head.x < 0 or head.x > BOARD_SIZE - 1 or head.y < 0 or head.y > BOARD_SIZE - 1:  break
        # 蛇頭碰撞蛇身規(guī)則for part in snake[1:]: if head.x == part.x and head.y == part.y: quit = True break
        if quit:??break


        小結(jié)

        這只是一個(gè)小的Demo,大家感興趣可以去下載源代碼,并讓這個(gè)游戲變得更加的具有可玩性。

        代碼:https://github.com/spmallick/learnopencv/tree/master/SnakeGame

        英文原文:https://learnopencv.com/snake-game-with-opencv-python/



        個(gè)人微信(如果沒有備注不拉群!
        請(qǐng)注明:地區(qū)+學(xué)校/企業(yè)+研究方向+昵稱



        下載1:何愷明頂會(huì)分享


        AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析


        下載2:終身受益的編程指南:Google編程風(fēng)格指南


        AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):c++,即可下載。歷經(jīng)十年考驗(yàn),最權(quán)威的編程規(guī)范!



        下載3 CVPR2020

        AI算法與圖像處公眾號(hào)后臺(tái)回復(fù):CVPR2020,即可下載1467篇CVPR?2020論文


        覺得不錯(cuò)就點(diǎn)亮在看吧


        瀏覽 71
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产精品自拍啪啪 | 日本日韩中文字幕波多野吉衣 | 夜夜高潮久久做爽久久 | 日韩有码视频在线 | 青青草视频免费在线观看 | 91人人| 男的和女的搞鸡 | 凯莎雪乳轻颤娇羞流白浆 | 黄色99视频 | 狼友视频首页 |