婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > pygame開發(fā):馬賽邏輯小游戲的代碼實現(xiàn)

pygame開發(fā):馬賽邏輯小游戲的代碼實現(xiàn)

熱門標簽:鄭州智能外呼系統(tǒng)運營商 佛山防封外呼系統(tǒng)收費 南昌辦理400電話怎么安裝 電話機器人適用業(yè)務(wù) 湛江電銷防封卡 獲客智能電銷機器人 不錯的400電話辦理 哈爾濱外呼系統(tǒng)代理商 徐州天音防封電銷卡

一、游戲簡介

馬賽邏輯,是一個類似數(shù)獨和掃雷的邏輯小游戲,根據(jù)棋盤周圍的數(shù)據(jù)提示點亮方格,因外形像馬賽克而得名。在手機游戲中有多款 APP 可以體驗該游戲,如 Peak、Nonogram、Crossme 等。但在 PC 端,筆者暫時還未發(fā)現(xiàn)復(fù)刻版,于是打算自己動手實現(xiàn)一番。

馬賽邏輯的基本玩法如下圖所示,上側(cè)橫向的各組數(shù)字為:對每一列中存在的目標方格的標注,如 2 表示該列有 2 個連續(xù)的目標,1 2 表示該列有 1 個獨立的目標 + 2 個連續(xù)的目標。左側(cè)縱向的各組數(shù)據(jù)為對每一行的標注。通過上、左兩側(cè)的提示,將所有目標方格點亮即為通關(guān)。

二、核心代碼解析

在正式開始游戲開發(fā)之前,我們可以先想想實現(xiàn)這個項目的關(guān)鍵點在哪。首先,方格有選中和未選中兩種狀態(tài),那可以用 1 表示選中、0 表示未選中。要判斷玩家點亮的方格是否正確,只需將方塊矩陣映射成 01 矩陣,再與答案矩陣對比即可。如此一來,出題也很容易,隨機生成一串 01 組合即可。

而最重要的地方在于,如何生成提示數(shù)值?我們需要分別對每行每列進行遍歷,找出單獨的 1 和連續(xù)的 1。下面以棋盤的一行為例進行說明。

首先,準備一個列表類型的變量 remind 用于儲存多個提示數(shù)值,并準備一個位移標記 flag 用于記錄當前是在答案陣列的哪一位進行判斷,以及一個數(shù)值記錄 num ,再將答案陣列 [0, 1, 1, 0, 1, 0, 0, 1] 傳入計數(shù)器。

當傳入陣列長度大于 1 時有四種情況,分別是:①當前位 0 ,次位 1;②當前位 1,次位 0;③連續(xù)多位 1;④連續(xù)多位 0。根據(jù)不同情況進行位移,將新的陣列傳入計數(shù)器,并在 1 換 0 的時候記錄數(shù)值。

當傳入陣列等于 1 時有兩種情況,分別是:①上位 0;②上位 1。根據(jù)不同的情況記錄數(shù)值。

按照這個思路,我們可以用一個簡單的遞歸來實現(xiàn)這個提示算法,代碼如下:

def get_line_remind(_line):  # 輸出一行或一列的提示
    remind = []  # 一行或一列的提示記錄
    num = 0  # 提示值
    def fun(line):
        nonlocal remind, num
        flag = 0  # 位移
        if len(line) > 1:
            if line[0] == 0 and line[1] == 1:
                flag += 1
            elif line[0] == line[1] == 0:
                flag += 2
            elif line[0] == 1 and line[1] == 0:
                num += 1
                remind.append(num)
                num = 0
                flag += 2
            elif line[0] == line[1] == 1:
                num += 1
                flag += 1
            fun(line[flag:])
        elif len(line) and line[0]:
            if num:
                remind.append(num + 1)
            else:
                remind.append(1)
    fun(_line)
    return remind

三、pygame開發(fā)流程

1、從創(chuàng)建窗口到棋盤繪制

棋盤的設(shè)計及玩法已經(jīng)初具雛形了,可以正式開始制作游戲了啦!~筆者采用了有超過 20 年歷史的游戲制作庫 pygame,該游戲庫包含了用于制作簡單 2D 游戲的基本套件,python 及游戲愛好者們已經(jīng)用它制作了成千上萬的小游戲,使用 pip 安裝即可使用。

第一步,對各類游戲元素的顏色、位置、尺寸等必要參數(shù)做一些設(shè)置。接著,初始化 pygame,繪制一個指定大小的窗口,使用 pygame.font.Font() 加載指定的字體文件,以防游戲打包后運行出錯。
需要注意的是,pygame 的所有視覺元素都建立在不斷地重新繪制上,利用 pygame.display.flip() 進行整體更新。因為后期需要在白色背景中添加動態(tài)元素,所以將背景繪制放入主循環(huán)的首位。
在主循環(huán)中,通過遍歷事件來獲取玩家的操作,當前僅追蹤了一個退出事件。

import pygame
import sys
# 參數(shù)設(shè)置 ----------------------------------
blue = (159, 197, 232)  # 被選中方格的顏色
gray = (217, 217, 217)  # 棋盤網(wǎng)格線顏色
gold = (255, 215, 0)  # 游戲記錄文字顏色
black = (0, 0, 0)
white = (255, 255, 255)
start_x = 240  # 棋盤左上角位置
start_y = 150
size = 2  # 一行/列的方塊個數(shù)
square = 320  # 棋盤邊長
length = int(square / size)  # 每個方塊的邊長
# 游戲初始化 ----------------------------------
pygame.init()
screen = pygame.display.set_mode((780, 520))  # 創(chuàng)建窗口
font = pygame.font.Font(r'./data/msyh.ttf', 20)  # 提示字體
# 主循環(huán) ----------------------------------
while True:
    screen.fill(white)  # 背景填充
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()  # 退出pygame
            sys.exit()  # 安全退出系統(tǒng)
    pygame.display.flip()  # 更新全部顯示

運行以上代碼可以得到一片空白(霧)。

下一步,我們來想想怎么繪制棋盤。首先,棋盤本身的尺寸是固定的,我們只需修改棋盤中的方格數(shù)量和大小,來改變棋局。因此,在第一步的參數(shù)設(shè)置中,使用 start_xstart_y 來確定棋盤的位置,并設(shè)置棋盤的邊長 square = 320,以及一行中方塊的個數(shù) size 和方塊邊長 length
因為方塊是可以被點擊而改變顏色的,所以我們要先自定義一個方塊類。機制比較簡單,初始化即傳入坐標和邊長,調(diào)用 pygame.draw.rect() 來繪制矩形。

class Item:  # 自定義方塊類
    def __init__(self, pos_x, pos_y, leng):
        self.rect = pygame.draw.rect(screen, gray, [pos_x, pos_y, leng, leng], 0)
        self.state = False

再定義一個繪制棋盤的方法,從棋盤左上角開始,橫豎各畫 size 個方塊,返回方塊對象列表。

def create_chessboard():  # 創(chuàng)建棋盤
    item_lst = []
    for v in range(size):
        for h in range(size):
            rect = Item(start_x + h*length, start_y + v*length, length)
            item_lst.append(rect)
    return item_lst

由于方塊初始顏色和背景色一樣是白色,還需要加上網(wǎng)格線,橫豎各畫 size+1 條線,調(diào)用 pygame.draw.line() 繪制線條。

def draw_line():  # 繪制網(wǎng)格線
    for n in range(size+1):
        start = (start_x, start_y + n * length)
        end = (start_x + square, start_y + n * length)
        pygame.draw.line(screen, gray, start, end, 2)
    for n in range(size+1):
        start = (start_x + n * length, start_y)
        end = (start_x + n * length, start_y + square)
        pygame.draw.line(screen, gray, start, end, 2)

將主循環(huán)代碼修改如下,注意:網(wǎng)格線是繪制在整個圖層組的最上層,才不會被方格和背景覆蓋掉。運行即可繪制出初始棋盤,如圖為 4X4 的規(guī)格。

## 前文參數(shù)、初始化略
......
items = create_chessboard()  # 創(chuàng)建棋盤
while True:
    screen.fill(white)  # 背景填充
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()  # 退出pygame
            sys.exit()  # 安全退出系統(tǒng)
    draw_line()  # 繪制棋盤網(wǎng)格線
    pygame.display.flip()  # 更新全部顯示

2、點擊方格改變顏色

2.1、點擊事件

在事件遍歷中添加對鼠標點擊事件的追蹤,并獲取點擊坐標,之后通過判斷點擊的位置是否在某個方格中,即可得知是哪個方格被點擊了,并作出顏色修改。

 if event.type == pygame.MOUSEBUTTONDOWN:  # 鼠標點擊事件
        x, y = event.pos

2.2、碰撞檢測

那么來寫一個判斷方法,將之前創(chuàng)建棋盤時得到的方塊對象列表,和鼠標坐標傳入,遍歷方塊并通過矩形的 collidepoint() 方法進行碰撞檢測,若鼠標碰撞到了矩形區(qū)域,就對方塊的狀態(tài)取反。

def check_click(item_lst, pos_x, pos_y):  # 更新每個方塊的點擊狀態(tài)
    for i in item_lst:
        if i.rect.collidepoint(pos_x, pos_y):
            i.state = bool(1 - i.state)

2.3、方格變色

def change_color(item_lst):  # 根據(jù)狀態(tài)改變方塊顏色
    for i in item_lst:
        if i.state:
            pygame.draw.rect(screen, blue, i.rect, 0)
        else:
            pygame.draw.rect(screen, white, i.rect, 0)

2.4、陣列轉(zhuǎn)換

再來寫一個獲取玩家操作陣列的方法,利用列表生成式將方塊狀態(tài)轉(zhuǎn)換為 01 列表。

def create_answer_array():  # 創(chuàng)建答案矩陣
    lst = [1 if random() > 0.5 else 0 for _ in range(size*size)]
    if list(set(lst))[0] == 0:
        lst[0] = 1
    return lst

并通過隨機生成的方式來創(chuàng)建答案,之后通過比較兩個列表即可判斷游戲是否通關(guān)。別忘了,答案陣列中不能全都是 0。

def create_answer_array():  # 創(chuàng)建答案矩陣
    lst = [1 if random() > 0.5 else 0 for _ in range(size*size)]
    if list(set(lst))[0] == 0:
        lst[0] = 1
    return lst

2.5、效果初見

修改主循環(huán)代碼如下,運行后嘗試點擊可見效果。

## 前文參數(shù)、初始化略
......
answer = create_answer_array()  # 創(chuàng)建答案矩陣
# 主循環(huán) ----------------------------------
while True:
    screen.fill(white)  # 背景填充
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()  # 退出pygame
            sys.exit()  # 安全退出系統(tǒng)
        if event.type == pygame.MOUSEBUTTONDOWN:  # 鼠標點擊事件
            x, y = event.pos
            check_click(items, x, y)  # 檢查選中的方格,修改狀態(tài)
            result = get_player_array(items)  # 獲取方格操作矩陣
            print(result)
            if result == answer:
            	print("YOU WIN!")
    change_color(items)  # 根據(jù)方格狀態(tài)修改顏色
    draw_line()  # 繪制棋盤網(wǎng)格線
    pygame.display.flip()  # 更新全部顯示

3、顯示提示信息

沒有提示只能盲點怎么玩呀!趕緊把提示信息搞出來 (ε(#)☆╰╮o(皿///)
前文我們已經(jīng)了解了提示算法,接下來就根據(jù)答案矩陣來整理兩側(cè)的提示信息。

def get_w_remind(answer_lst):  # 根據(jù)答案矩陣輸出提示列表
    h_remind = []
    v_remind = []
    h_array = [answer_lst[i: i+size] for i in range(0, len(answer_lst), size)]  # 橫向矩陣
    for h in h_array:
        h_remind.append(get_line_remind(h))
    v_array = list(map(list, zip(*h_array)))  # 縱向矩陣
    for v in v_array:
        v_remind.append(get_line_remind(v))
    return h_remind, v_remind

由于筆者是直接使用一維列表來代替矩陣的,因此如果要獲取每一行的提示,則需要按照 size 將將答案陣列分割成多份。而要獲取每一列的提示時,則需要對分割好的橫向矩陣進行行列轉(zhuǎn)置。

之后,通過億點點數(shù)學(xué)計算得到兩側(cè)信息的顯示坐標,利用窗口對象的 blit() 方法將渲染好的文本對象貼上去。對橫/縱陣列逆序的目的是,將多個提示數(shù)值從外到內(nèi)顯示,以符合閱讀習(xí)慣。

def show_remind(answer_lst):  # 在棋盤兩側(cè)對應(yīng)位置顯示每行/列的提示
    h_remind, v_remind = get_w_remind(answer_lst)
    for i, h in enumerate(h_remind):
        for j, num in enumerate(h[::-1]):
            text = font.render(f"{num}", True, black)
            screen.blit(text, (start_x - 20 * (j + 1), start_y + i * length + length / 2 - 10))
    for i, v in enumerate(v_remind):
        for j, num in enumerate(v[::-1]):
            text = font.render(f"{num}", True, black)
            screen.blit(text, (start_x + i * length + length / 2 - 5, start_y - 30 * (j + 1)))

終于可以玩啦,來瞅瞅。

至此,馬賽邏輯的核心玩法已經(jīng)實現(xiàn),之后再完善一下游戲機制和體驗效果,例如:修改難度、添加音效等,就可以打造一個相對完備的小游戲啦!(為了偷懶 )限于篇幅,在此不作贅述,可通過文末的方式獲取帶注釋的最終版源碼參考學(xué)習(xí)。

四、游戲演示視頻

最終打包的游戲演示見下方視頻,完整源碼及打包后的游戲文件可通過以下方式獲取(exe 文件可能會被誤殺,需添加信任),感謝各位的閱讀。
源碼及游戲戳:http://xiazai.jb51.net/202109/yuanma/mosailogic_jb51.rar

以上就是pygame開發(fā):馬賽邏輯小游戲的代碼實現(xiàn)的詳細內(nèi)容,更多關(guān)于pygame開發(fā):馬賽邏輯小游戲的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • python+pygame實現(xiàn)坦克大戰(zhàn)小游戲的示例代碼(可以自定義子彈速度)
  • 使用pygame編寫Flappy bird小游戲
  • pygame實現(xiàn)彈球游戲
  • pygame庫實現(xiàn)俄羅斯方塊小游戲

標簽:蘭州 懷化 紹興 吉安 廣西 安康 蕪湖 呂梁

巨人網(wǎng)絡(luò)通訊聲明:本文標題《pygame開發(fā):馬賽邏輯小游戲的代碼實現(xiàn)》,本文關(guān)鍵詞  pygame,開發(fā),馬賽,邏輯,小游,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《pygame開發(fā):馬賽邏輯小游戲的代碼實現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于pygame開發(fā):馬賽邏輯小游戲的代碼實現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲免费av高清| 一区二区三区 在线观看视频 | 亚洲综合无码一区二区| 一个色在线综合| 国产亚洲欧美在线| 亚洲欧美国产77777| 久久久久亚洲蜜桃| 国产网红主播福利一区二区| 欧美久久久久久久久中文字幕| 99re视频精品| 国产99久久久精品| 欧美日韩一区二区三区在线| 色偷偷88欧美精品久久久| 日韩在线一二三区| 久久久久久久网| 色呦呦一区二区三区| 99久久久久免费精品国产| 欧美日韩dvd在线观看| 一区二区久久久久| 成人午夜视频福利| 久久伊99综合婷婷久久伊| 亚洲成人免费电影| 99国产精品一区| 亚洲国产精品一区二区尤物区| 亚洲大片精品永久免费| 欧美午夜影院一区| 亚洲综合在线第一页| 欧美日韩一区二区三区高清| 国产三级精品视频| youjizz久久| 亚洲日穴在线视频| 成人av在线影院| 色综合久久久久久久久| 一区二区三区.www| 91麻豆精品国产自产在线| 国产精品一区二区黑丝| 亚洲人吸女人奶水| 日韩高清在线电影| 精品美女一区二区| 91在线视频18| 日本不卡在线视频| 最新日韩在线视频| 欧美一区二区三区系列电影| 国产在线精品一区在线观看麻豆| 精品成人私密视频| 91久久一区二区| 国产一区二区三区综合| 亚洲国产一区二区视频| 久久久久国产精品厨房| 欧美亚洲精品一区| 国产精品久久一卡二卡| 欧美日韩日日摸| 不卡av在线网| 国产剧情一区二区| 激情小说亚洲一区| 制服.丝袜.亚洲.另类.中文 | 国产福利一区二区三区| 免费av成人在线| 婷婷久久综合九色国产成人 | 国产精品丝袜91| 亚洲精品一区二区三区四区高清| 欧美专区在线观看一区| 色先锋久久av资源部| 国产精品福利电影一区二区三区四区| www欧美成人18+| 2020国产精品| 国产亚洲欧美色| 国产色产综合产在线视频| 亚洲日本乱码在线观看| 不卡高清视频专区| heyzo一本久久综合| 国产精品中文字幕日韩精品| 国产一区二区三区久久悠悠色av| 日韩中文字幕亚洲一区二区va在线| 性感美女久久精品| 轻轻草成人在线| 成人小视频免费观看| 国产一区二区91| 成人午夜在线视频| 色噜噜狠狠成人中文综合| 欧美日韩三级一区| 日韩欧美国产电影| 久久久久久免费毛片精品| 久久久久国产精品麻豆ai换脸 | 亚洲成av人片在线| 免费观看日韩av| 成人中文字幕合集| 毛片av一区二区| 9色porny自拍视频一区二区| 欧洲一区二区三区免费视频| 欧美日韩精品福利| 精品国产一区二区在线观看| 久久综合国产精品| 国产精品久久久一本精品 | 日韩一区二区高清| 久久婷婷国产综合国色天香| 国产欧美一区二区精品性色| 久久综合久久综合久久| av在线不卡免费看| 欧美精品日日鲁夜夜添| 中文字幕欧美一| 激情久久五月天| 91精品视频网| 亚洲免费观看视频| 激情久久五月天| 91国产免费看| 国产欧美精品区一区二区三区 | 亚洲小说欧美激情另类| 国产综合色精品一区二区三区| 成人不卡免费av| 久久婷婷成人综合色| 亚洲成精国产精品女| 色88888久久久久久影院野外| 欧美综合欧美视频| 亚洲男人的天堂在线aⅴ视频| 狠狠色丁香婷婷综合| 日本高清无吗v一区| 国产做a爰片久久毛片| 91极品视觉盛宴| 综合久久综合久久| 99久久国产综合精品女不卡| 国产视频一区二区三区在线观看| 国产精品123区| 日韩亚洲国产中文字幕欧美| 国产精品国产三级国产普通话99| 蜜臀99久久精品久久久久久软件| 欧美中文一区二区三区| 亚洲二区在线视频| 欧美日韩在线免费视频| 亚洲制服欧美中文字幕中文字幕| 国产91精品精华液一区二区三区 | 中文久久乱码一区二区| 国产麻豆91精品| 欧美一区二区久久久| 国产精品资源在线| 亚洲欧洲国产日韩| 色综合一个色综合亚洲| 亚洲综合免费观看高清在线观看| 欧美美女一区二区三区| 久久99精品久久久久久国产越南 | 亚洲高清视频的网址| 欧美日韩激情一区二区| 国产精品亚洲一区二区三区妖精 | 久久激五月天综合精品| 日本一区二区不卡视频| 国产成人aaa| 国产女人18水真多18精品一级做| 中文字幕中文在线不卡住| 婷婷亚洲久悠悠色悠在线播放| 91老师国产黑色丝袜在线| 一区二区三区在线观看视频| 成人午夜在线播放| 久久久久久一二三区| 91精品一区二区三区久久久久久| 91精品国产综合久久精品| 2023国产精华国产精品| 青青青爽久久午夜综合久久午夜| 国产精品综合一区二区三区| 在线一区二区视频| 成人av网站免费观看| 欧美一三区三区四区免费在线看| 欧美一区二区在线免费观看| 国产福利不卡视频| 日本亚洲最大的色成网站www| 欧美日韩国产美| 久久精品99国产精品| **性色生活片久久毛片| 日韩精品中文字幕在线不卡尤物| 色av综合在线| 国产成a人亚洲| 激情亚洲综合在线| 天天综合色天天综合| 欧美激情资源网| 欧美v国产在线一区二区三区| 欧美日韩国产区一| 欧美精品第1页| 欧美性受极品xxxx喷水| 91色在线porny| 国产成人综合在线观看| 久久99国产精品久久99果冻传媒| 亚洲黄一区二区三区| 欧美高清在线视频| 欧美激情在线看| 国产视频亚洲色图| ●精品国产综合乱码久久久久| 中文av一区特黄| 亚洲精品欧美激情| 亚洲成a人片在线不卡一二三区 | 高清beeg欧美| 丁香婷婷综合网| 成人国产精品免费观看视频| 99亚偷拍自图区亚洲| 91蜜桃免费观看视频| 色诱视频网站一区| 色菇凉天天综合网| 欧美日韩精品一区视频| 亚洲色图19p| 亚洲综合在线电影| 日本国产一区二区| 在线播放国产精品二区一二区四区|