继续介绍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游戏编程系列-五子棋相关推荐

  1. python游戏编程入门源代码_python游戏编程入门源代码

    [实例简介] <Python游戏编程入门>的源代码,作者Jonathan S.Harbour 很好的资源,希望对学习python的同学有帮助,代码都可以运行 [实例截图] [核心代码] p ...

  2. Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋

    Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋 写在前面 需要用到的工具包和参考 游戏设定 初始化 切换下棋方 判断五子连珠(核心) 鼠标点击流程事件 成品展示 打 ...

  3. easyx游戏编程:五子棋(C语言游戏开发)

    easyx游戏编程:五子棋(C语言游戏开发) 五子棋: 本游戏用到了图形界面库graphics.h,图形界面库下载安装: 下载链接: https://easyx.cn/downloads/. 下方有源 ...

  4. python游戏编程书_Python游戏编程快速上手 第4版 (斯维加特著) 中文pdf扫描版[41MB]...

    Python是一种高级程序设计语言,因其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言. Python游戏编程快速上手 (第4版)通过编写一个个小巧.有趣的游戏来教授Python编程,并且采用 ...

  5. python游戏使用教程_PYTHON游戏编程入门_IT教程网

    资源名称:PYTHON游戏编程入门 内容简介: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Py ...

  6. python游戏编程入门免费_python游戏编程入门 python游戏编程入门课

    python游戏编程入门 python游戏编程入门课 什么是python游戏编程入门?首先我们需要认识什么是Python Python既是一个软件工具包,也是一种语言.Python软件包包含了一个名为 ...

  7. python并发编程之semaphore(信号量)_Python 并发编程系列之多线程

    Python 并发编程系列之多线程 2 创建线程 2.1 函数的方式创建线程 2.2 类的方式创建线程 3 Thread 类的常用属性和方法 3.1 守护线程: Deamon 3.2 join()方法 ...

  8. python五子棋界面_python实现的控制台五子棋

    教妹子怎么用python,自己随手写的一个五子棋,没有ai,双人对下,不需要界面,是学习入门必备佳品. 1.[代码][Python]代码 import os import pdb ''' @autho ...

  9. python大鱼吃小鱼_python 游戏编程 大鱼吃小鱼

    # 游戏编程:按照以下游戏编写一个乌龟类和鱼类,并尝试编写游戏. # 假设游戏场景(x,y)为0<=x<=10,0<=y<=10 # 游戏生成1只乌龟和10只鱼 # 他们的移动 ...

最新文章

  1. 用计算机对音频信息进行处理 要将模拟信号,第五章 练习题
  2. 有道精品课python-Python:7行代码爬取有道词典
  3. 怎么将零件整合到一起_Fraunhofer ILT用于大型零件3D打印的“边飞行边加工”的LPBF概念...
  4. MySQL配置主从同步过程记录
  5. Condition接口详解
  6. 或有资产(contingent asset)
  7. github操作命令
  8. Python基本语法,python入门到精通
  9. python课设答辩问题及答案_HTML5网站前端开发设计答辩问题及答案
  10. 跨浏览器实现等高栏 Equal Height Columns with Cross-Browser CSS
  11. apache FilesMatch
  12. React 折腾记 - (4) 侧边栏联动Tabs菜单-增强版(结合Mobx)
  13. 定时关机 v1.0(autoshut v1.0)
  14. 【动态规划】subsequence 1
  15. 曝华为新成立10大预备军团;被罚2500万欧元,苹果开放第三方支付;GitLab 14.8发布 | 极客头条...
  16. Facebook内布拉斯加州数据中心将扩建100万平方英尺
  17. 台达plc编程支持c语言吗,台达plc编程软件有哪些
  18. 上证指数ARIMA模型预测(R软件)
  19. MT4跟单软件的API跟单模式有多少种?
  20. Xshell安装宝塔Linux面板教程

热门文章

  1. JS 数组添加元素、删除元素、数组去重
  2. 绕过限制,在PC上调试微信手机页面
  3. 人脸识别体温仪,红外测温,加入了疫情防控战
  4. [转载]urllib.parse.urlencode转换get请求参数(resquest中带中文的情况)
  5. 【文末福利】什么是 Adobe Creative Cloud 创意应用软件?
  6. 计算机非线编辑配置,非线性编辑系统配置 剪辑台式电脑 图形工作站 视频剪辑机...
  7. 海贼班 胡船长 第三次直播笔记 快排 虚函数
  8. 小米推送php文档,利用php重载和curl的并行方式优雅的封装小米推送sdk
  9. 【分布式事务】分布式事务
  10. Python爬虫-股票数据定向爬虫(东方财富网)