# 全网首发！你没玩过的pygame小游戏开发「马赛逻辑」

Python除了不能帮你生孩子，还真无所不能！今天给大家带来一个很有意思的python小游戏开发，文末提供源码，一起学习呀～

👆点击关注｜设为星标｜干货速递👆

## 核心代码解析

```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开发流程

### 1、从创建窗口到棋盘绘制

```import pygame
import sys

# 参数设置 ----------------------------------
blue = (159, 197, 232)  # 被选中方格的颜色
gray = (217, 217, 217)  # 棋盘网格线颜色
gold = (255, 215, 0)  # 游戏记录文字颜色
black = (0, 0, 0)
white = (255, 255, 255)
start_x = 240  # 棋盘左上角位置
start_y = 150
size = 2  # 一行/列的方块个数
square = 320  # 棋盘边长
length = int(square / size)  # 每个方块的边长
# 游戏初始化 ----------------------------------
pygame.init()
screen = pygame.display.set_mode((780, 520))  # 创建窗口
font = pygame.font.Font(r'./data/msyh.ttf', 20)  # 提示字体
# 主循环 ----------------------------------
while True:
screen.fill(white)  # 背景填充
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()  # 退出pygame
sys.exit()  # 安全退出系统
pygame.display.flip()  # 更新全部显示
```

```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
```

```def create_chessboard():  # 创建棋盘
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
```

```def draw_line():  # 绘制网格线
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)
```

```## 前文参数、初始化略
......
items = create_chessboard()  # 创建棋盘
while True:
screen.fill(white)  # 背景填充
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()  # 退出pygame
sys.exit()  # 安全退出系统
draw_line()  # 绘制棋盘网格线
pygame.display.flip()  # 更新全部显示
```

### 2、点击方格改变颜色

#### 2.1 点击事件

``` if event.type == pygame.MOUSEBUTTONDOWN:  # 鼠标点击事件
x, y = event.pos
```

#### 2.2 碰撞检测

```def check_click(item_lst, pos_x, pos_y):  # 更新每个方块的点击状态
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):  # 根据状态改变方块颜色
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 阵列转换

```def get_player_array(item_lst):  # 获取玩家操作矩阵
return [1 if i.state else 0 for i in item_lst]
```

```def create_answer_array():  # 创建答案矩阵
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 效果初见

```## 前文参数、初始化略
......
# 主循环 ----------------------------------
while True:
screen.fill(white)  # 背景填充
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()  # 退出pygame
sys.exit()  # 安全退出系统
if event.type == pygame.MOUSEBUTTONDOWN:  # 鼠标点击事件
x, y = event.pos
check_click(items, x, y)  # 检查选中的方格，修改状态
result = get_player_array(items)  # 获取方格操作矩阵
print(result)
if result == answer:
print("YOU WIN!")
change_color(items)  # 根据方格状态修改颜色
draw_line()  # 绘制棋盘网格线
pygame.display.flip()  # 更新全部显示
```

### 3、显示提示信息

```def get_w_remind(answer_lst):  # 根据答案矩阵输出提示列表
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
```

```def show_remind(answer_lst):  # 在棋盘两侧对应位置显示每行/列的提示
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)))
```

## 游戏演示视频

0 条评论

• ### 我们整理了20个Python项目，送给正在求职的你

职场中一贯有“金三银四”、“金九银十”的说法。如果你是一名正在求职或准备跳槽的程序员，不妨趁着这两个月时间好好准备一下。

• ### Python制作十款经典的童年游戏（附源码）

不知道行友们每年六一是怎么度过的，行哥的童年是在游戏世界里度过。这里行哥分享一下十个python可以制作的经典游戏，看看有没有你的菜，代码链接放在文末

• ### 从零开始学习PYTHON3讲义（十四）写一个mp3播放器

通常来说，Python解释执行，运行速度慢，并不适合完整的开发游戏。随着电脑速度的快速提高，这种情况有所好转，但开发游戏仍然不是Python的重点工作。 大多...

• ### 【人工智障入门实战1】无需公式或代码，用生活实例谈谈强化学习算法框架

战胜围棋高手李世石的 AlphaGo ，称霸星际争霸2的 AIphaStar...这些先进的自动控制技术都离不开“强化学习”这个算法框架。有人说，强化学习是一种...

• ### 一步步教你怎么用python写贪吃蛇游戏

前几天，星球有人提到贪吃蛇，一下子就勾起了我的兴趣，毕竟在那个Nokia称霸的年代，这款游戏可是经典中的经典啊！而用Python(蛇)玩Snake(贪吃蛇)，那...

• ### 用Python 优雅的打飞机

相信很多朋友都用java 写过飞机大战，在自己学完python基础以后就开始写python版飞机大战，今天把用pygame实现飞机大战的游戏分享给大家。

• ### 你的游戏开发第0课

电子游戏是许多人喜爱甚至沉迷的事情。尤其对于程序员来说，开发游戏是不少人最初学习编程的动力。在之前，我发过一些游戏开发的教程和案例：

• ### python---图形界面的2048

之前做了控制台版的2048，那样子玩着不爽，玩着没那么随意，于是把他做成带ui的2048。大部分的逻辑都是一样的，做这种小游戏，最难的就是的逻辑实现过程，一旦...

• ### 一步步教你怎么用python写贪吃蛇游戏

前几天，星球有人提到贪吃蛇，一下子就勾起了我的兴趣，毕竟在那个Nokia称霸的年代，这款游戏可是经典中的经典啊！而用Python(蛇)玩Snake(贪吃蛇)，那...

• ### 不就是小游戏嘛，分分钟给你写一个

前天有同学无意间把一个小游戏分享到了答疑群中，我看了一下，其实游戏的代码逻辑并不复杂（简化版的跳一跳，套上个吃鸡的主题），于是就随手立了一个FLAG：

• ### 自制街机游戏（2）：再次实现

在本节中，我不演示如何逐步设计和实现游戏，而在源代码中包含大量的注释和文档字符串。你可通过研究源代码来了解其工作原理，但这里还是简单地说说其中的要点（以及不那么...

• ### 手把手教你用python写游戏

最近python语言大火，除了在科学计算领域python有用武之地之外，在游戏、后台等方面，python也大放异彩，本篇博文将按照正规的项目开发流程，手把手教大...

• ### 手把手教你使用 Python 制作贪吃蛇游戏

贪吃蛇游戏是有史以来最受欢迎的街机游戏之一。在这个游戏中，玩家的主要目标是在不撞墙或不撞墙的情况下抓住最大数量的水果。在学习 Python 或 Pygame 时...

• ### python应用篇之外星人入侵项目——武装飞船(中)

从上篇文章，我们已经开始进入项目应用阶段，上篇文章给大家介绍了《外星人入侵》的基本玩法以及环境的安装，最后将游戏的背景设置出来；本文继续给大家介绍武装飞船的...

• ### 用 Python 实现打飞机，让子弹飞吧！

安装好 pygame 在第一次使用 pygame 的时候，pyCharm 会自动 install pygame。

• ### 7.10 VR扫描：VR恐怖游戏《Gates of Nowhere》已提前登陆Steam

微软系MR头显是微软和一众OEM大厂合作开发的，其即插即用性相比其HTC Vive等更加的平易近人。近日，亚马逊上大多数Windows MR头显正在大折扣促销中...

• ### 从零开始学习PYTHON3讲义（十五）让画面动起来

虽然看起来绘图和音乐并不相关，但是听过了上一讲的内容你一定知道，这是游戏编程中四个需要处理内容的两部分，这两部分必须同时、并行的处理，不能因为某一项计算的拖延，...

• ### 【参赛经验分享】分析js代码开启游玩新世界与Pierre Dellacherie算法本地验证

以下仅是我对于这个比赛的思考过程，可能是拿高分的技巧，但我并没有因此拿高分，本人算法水平有限大佬勿喷，对文章中的问题欢迎指出。

• ### 手游后台PVP系统网络同步方案总结

来源：游迅网 发布者：wuyu 概述 　　PVP系统俨然成为现在新手游的上线标配，手游Pvp系统体验是否优秀，很大程度上决定了游戏的品质。从最近半年上线的新...