python五子棋源代码_python游戏编程系列-五子棋
继续介绍python游戏编程,仍然是基于pgzero。关于该软件包的基础使用技巧可参考本人专栏文章:老娄:python游戏编程之pgzero使用介绍zhuanlan.zhihu.com
思考绘制棋盘。五子棋的棋盘是15*15的表格,所以就是画交叉的直线即可。可以使用screen.draw.line来实现,它接受3个参数:起点坐标、终点坐标、线的颜色。
def draw():
screen.fill((210,180,140))
for i in range(15):
screen.draw.line((20,20+SIZE*i),(20+SIZE*14,20+SIZE*i),(0,0,0)) #周边稍有留白
for i in range(15):
screen.draw.line((20+SIZE*i, 20), (20+SIZE*i,20 + SIZE * 14), (0, 0, 0))
显示的效果如下图所示:关于走棋。鼠标可以在任何位置单击,所以不是一个精准的事件,我们已经知道def on_mouse_down(pos): 这个方法的参数pos可以返回坐标位置,那么就可以用于判断属于哪个落棋点。这里使用以交叉点为中心的正方形区域,作为该点的归属区域,如果鼠标点击落在此范围内,则棋子就出现在本交叉点上。
同时,在落棋时,还要判断是否本点上已经有其它棋子。这里想到可以用一个0,1的二维矩阵来刻画每个位置上是否有棋子。这里使用的逻辑是:
chess_black = []
chess_white = []
def on_mouse_down(pos):
# print("Mouse button clicked at", pos)
click_x, click_y = pos
#计算落在第几行、第几列的交叉点上
xs,zs = math.modf((click_x - 20) / SIZE) #获取小数、整数部分
if xs > 0.5:
x = int(zs + 1)
else:
x = int(zs)
xs_y,zs_y = math.modf((click_y - 20) / SIZE)
if xs_y > 0.5:
y = int(zs_y + 1)
else:
y = int(zs_y)
if matrix[y][x] != 1:
chess = Actor("gobang_black")
chess.x = x * SIZE + 20
chess.y = y * SIZE + 20
matrix[y][x] = 1
chess_black.append(chess)
到这里可以实现的效果如下视频所示:知乎视频www.zhihu.com
事实上,我们需要轮流走黑、白两种颜色的棋子,可以通过一个全局变量来实现,当黑棋走过后,手工将该全局变量置为另一种颜色即可。是否结束。当落一子的时候,就要判断一下是否游戏可以结束了:横、竖、斜有5个同色棋子。
完整代码
import pgzrun
import pgzero
import math
import numpy
SIZE = 40
WIDTH = 15 * SIZE
HEIGHT = 15 * SIZE
#初始化每个坐标位,0表示没有棋子
matrix = [[0]*15 for i in range(15)]
chess_black = []
chess_white = []
global turn
turn = "black"
global FINISH
FINISH = False
def draw():
screen.fill((210,180,140))
for i in range(15):
screen.draw.line((20,20+SIZE*i),(20+SIZE*14,20+SIZE*i),(0,0,0)) #周边稍有留白
for i in range(15):
screen.draw.line((20+SIZE*i, 20), (20+SIZE*i,20 + SIZE * 14), (0, 0, 0))
for b in chess_black:
b.draw()
for b in chess_white:
b.draw()
if FINISH:
screen.draw.text("GAME OVER", topleft=(20, 100), color="green", fontsize=80)
return
def on_mouse_down(pos):
global turn
# print("Mouse button clicked at", pos)
click_x, click_y = pos
#计算落在第几行、第几列的交叉点上
xs,zs = math.modf((click_x - 20) / SIZE) #获取小数、整数部分
if xs > 0.5:
x = int(zs + 1)
else:
x = int(zs)
xs_y,zs_y = math.modf((click_y - 20) / SIZE)
if xs_y > 0.5:
y = int(zs_y + 1)
else:
y = int(zs_y)
if matrix[y][x] == 0:
if turn == "black":
chess = Actor("gobang_black")
chess.x = x * SIZE + 20
chess.y = y * SIZE + 20
matrix[y][x] = 1
chess_black.append(chess)
turn = "white"
check_finish(y, x)
print(FINISH)
elif turn == "white":
chess = Actor("gobang_white")
chess.x = x * SIZE + 20
chess.y = y * SIZE + 20
matrix[y][x] = -1
chess_black.append(chess)
turn = "black"
check_finish(y, x)
# print(FINISH)
else:
pass
def check_finish(i,j):
# i,j 表示 matrix的第i行,第j列
global FINISH
#判断横向
if [1,1,1,1,1] in [matrix[i][j:j+5], matrix[i][j-1:j+4],matrix[i][j-2:j+3],matrix[i][j-3:j+2],matrix[i][j-4:j+1],matrix[i][j-5:j]] or [-1,-1,-1,-1,-1] in [matrix[i][j:j+5], matrix[i][j-1:j+4],matrix[i][j-2:j+3],matrix[i][j-3:j+2],matrix[i][j-4:j+1]]:
FINISH = True
return
#判断纵向
mat = numpy.mat(matrix)
for x in range(-5,1):
y = 5 - abs(x)
col = mat[i+x:i+y,j]
col_list = [i[0] for i in col.tolist()]
if col_list == [1,1,1,1,1] or col_list == [-1,-1,-1,-1,-1]:
FINISH = True
return
#判断斜向
col_list = []
for x in range(-4,5):
if i + x >= 0 and i + x < 15 and j + x >= 0 and j + x < 15:
col_list.append(mat[i+x,j+x])
if col_list == [1,1,1,1,1] or col_list == [-1,-1,-1,-1,-1]:
FINISH = True
return
col_list = []
for x in range(-4,5):
if i + x >= 0 and i+x < 15 and j - x >= 0 and j-x < 15:
col_list.append(mat[i+x,j-x])
if col_list == [1,1,1,1,1] or col_list == [-1,-1,-1,-1,-1]:
FINISH = True
return
pgzrun.go()
效果知乎视频www.zhihu.com
参考资料
《趣学python游戏编程》何青 著
python五子棋源代码_python游戏编程系列-五子棋相关推荐
- python游戏编程入门源代码_python游戏编程入门源代码
[实例简介] <Python游戏编程入门>的源代码,作者Jonathan S.Harbour 很好的资源,希望对学习python的同学有帮助,代码都可以运行 [实例截图] [核心代码] p ...
- Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋
Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋 写在前面 需要用到的工具包和参考 游戏设定 初始化 切换下棋方 判断五子连珠(核心) 鼠标点击流程事件 成品展示 打 ...
- easyx游戏编程:五子棋(C语言游戏开发)
easyx游戏编程:五子棋(C语言游戏开发) 五子棋: 本游戏用到了图形界面库graphics.h,图形界面库下载安装: 下载链接: https://easyx.cn/downloads/. 下方有源 ...
- python游戏编程书_Python游戏编程快速上手 第4版 (斯维加特著) 中文pdf扫描版[41MB]...
Python是一种高级程序设计语言,因其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言. Python游戏编程快速上手 (第4版)通过编写一个个小巧.有趣的游戏来教授Python编程,并且采用 ...
- python游戏使用教程_PYTHON游戏编程入门_IT教程网
资源名称:PYTHON游戏编程入门 内容简介: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Py ...
- python游戏编程入门免费_python游戏编程入门 python游戏编程入门课
python游戏编程入门 python游戏编程入门课 什么是python游戏编程入门?首先我们需要认识什么是Python Python既是一个软件工具包,也是一种语言.Python软件包包含了一个名为 ...
- python并发编程之semaphore(信号量)_Python 并发编程系列之多线程
Python 并发编程系列之多线程 2 创建线程 2.1 函数的方式创建线程 2.2 类的方式创建线程 3 Thread 类的常用属性和方法 3.1 守护线程: Deamon 3.2 join()方法 ...
- python五子棋界面_python实现的控制台五子棋
教妹子怎么用python,自己随手写的一个五子棋,没有ai,双人对下,不需要界面,是学习入门必备佳品. 1.[代码][Python]代码 import os import pdb ''' @autho ...
- python大鱼吃小鱼_python 游戏编程 大鱼吃小鱼
# 游戏编程:按照以下游戏编写一个乌龟类和鱼类,并尝试编写游戏. # 假设游戏场景(x,y)为0<=x<=10,0<=y<=10 # 游戏生成1只乌龟和10只鱼 # 他们的移动 ...
最新文章
- 用计算机对音频信息进行处理 要将模拟信号,第五章 练习题
- 有道精品课python-Python:7行代码爬取有道词典
- 怎么将零件整合到一起_Fraunhofer ILT用于大型零件3D打印的“边飞行边加工”的LPBF概念...
- MySQL配置主从同步过程记录
- Condition接口详解
- 或有资产(contingent asset)
- github操作命令
- Python基本语法,python入门到精通
- python课设答辩问题及答案_HTML5网站前端开发设计答辩问题及答案
- 跨浏览器实现等高栏 Equal Height Columns with Cross-Browser CSS
- apache FilesMatch
- React 折腾记 - (4) 侧边栏联动Tabs菜单-增强版(结合Mobx)
- 定时关机 v1.0(autoshut v1.0)
- 【动态规划】subsequence 1
- 曝华为新成立10大预备军团;被罚2500万欧元,苹果开放第三方支付;GitLab 14.8发布 | 极客头条...
- Facebook内布拉斯加州数据中心将扩建100万平方英尺
- 台达plc编程支持c语言吗,台达plc编程软件有哪些
- 上证指数ARIMA模型预测(R软件)
- MT4跟单软件的API跟单模式有多少种?
- Xshell安装宝塔Linux面板教程
热门文章
- JS 数组添加元素、删除元素、数组去重
- 绕过限制,在PC上调试微信手机页面
- 人脸识别体温仪,红外测温,加入了疫情防控战
- [转载]urllib.parse.urlencode转换get请求参数(resquest中带中文的情况)
- 【文末福利】什么是 Adobe Creative Cloud 创意应用软件?
- 计算机非线编辑配置,非线性编辑系统配置 剪辑台式电脑 图形工作站 视频剪辑机...
- 海贼班 胡船长 第三次直播笔记 快排 虚函数
- 小米推送php文档,利用php重载和curl的并行方式优雅的封装小米推送sdk
- 【分布式事务】分布式事务
- Python爬虫-股票数据定向爬虫(东方财富网)