遊戲介面
貪吃蛇小遊戲是一代人的夢,本期文章我們簡單製作一個貪吃蛇小遊戲import cv2import numpy as npfrom random import randintfrom random import choice
程式碼截圖
首先匯入我們需要的第三方庫,然後定義一個貪吃蛇的類來定義貪吃蛇的運動,頭部等資訊
class SnakePart: def __init__(self, front, x, y): self.front = front self.x = x self.y = y def move(self): self.x = self.front.x self.y = self.front.y
程式碼截圖
此類我們定義貪吃蛇的身體以及運動等
class Head: def __init__(self, direction, x, y): self.direction = direction self.x = x self.y = y 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
程式碼截圖
然後我們定義貪吃蛇的頭部以及運動資訊,這裡我們控制鍵盤的W\S\A\D四個鍵來控制貪吃蛇頭部的運動方向
def display(): 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)) return key
程式碼截圖
Display類來顯示貪吃蛇的顏色以及要吃的蘋果的顏色
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)
程式碼截圖
Win_focus 類函式來顯示遊戲畫面
1. cv2.VideoCapture(0) #構建影片抓捕器
引數說明:0表示需要啟動的攝像頭,這裡也可以寫影片的路徑
2. cv2.nameWindow(name, cv2.WINDOW_NORMAL) # 構建影片的視窗
引數說明: 表示視窗的名字, cv2.WINDOW_NORMAL表示視窗的大小,這裡視窗的大小是正常,
3.cv2.setWindowProperty(name, cv2.WND_PROP_FULLSCREEN, cv2.WND_PROP_FULLSCREEN)
引數說明: name表示需要更改畫素的視窗名字, cv2.WND_PROP_FULLSCREEN表示全屏
4. video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) 對視窗畫素進行設定
引數說明: cv2.CAP_PROP_FRAME_WIDTH 表示設定其寬的大小, 1920表示設定的畫素
以上引數類設定後,我們開始主函式的部分
if __name__ == '__main__' : # 每個cell的大小 CELL_SIZE = 20 # cell的數量 BOARD_SIZE = 45 # 遊戲中貪吃蛇的執行速度 SPEED = 6 # 貪吃蛇成長的速度 GROWTH = 3 eaten = True quit = False grow = 0 snake = [] #遊戲中從螢幕中間開始執行 head = Head(0, int((BOARD_SIZE - 1)/2), int((BOARD_SIZE - 1)/2)) snake.append(head) # 設定鍵盤 print('w = top, a = left, s = down, d = right') win_focus() while True: if eaten: s = list(range(0, BOARD_SIZE ** 2)) for part in snake: s.remove(part.x * BOARD_SIZE + part.y) a = choice(s) applex = int(a/BOARD_SIZE) appley = a % BOARD_SIZE eaten = False
程式碼截圖
接下來,我們設定一下貪吃蛇的鍵盤移動設定,W/A/S/D,分別代表貪吃蛇的移動方向,這個跟普通遊戲設定的一樣,由於opencv不能設定箭頭,這裡只能設定為W/A/S/D
key = display()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
程式碼截圖
設定完成後,就可以進行貪吃蛇的移動控制,以及貪吃蛇的遊戲規則,當貪吃蛇吃過一個蘋果後,其身體要增加一個大小尺寸
# 移動貪吃蛇for part in snake[::-1]: part.move()# 設定遊戲規則if head.x < 0 or head.x > BOARD_SIZE - 1 or head.y < 0 or head.y > BOARD_SIZE - 1: breakfor part in snake[1:]: if head.x == part.x and head.y == part.y: quit = True breakif quit: break# 設定貪吃蛇if grow > 0: snake.append(SnakePart(snake[-1], subx, suby)) grow -= 1# 當吃過一個蘋果後,增加貪吃蛇的長度if applex == head.x and appley == head.y: subx = snake[-1].x suby = snake[-1].y eaten = True grow += GROWTH
Ok,所有設定完成後,便可以進行遊戲了,當然這裡只是設定了基本的貪吃蛇規格,你也可以在程式碼裡面增加分數設定,看看你能跑多少分吧
遊戲截圖