基于Python实现五子棋

了解游戏的规则是我们首先需要做的事情,如果不知晓规则,那么我们肯定寸步难行。
五子棋游戏规则:

  1. 对局双方各执一色棋子。
  2. 空棋盘开局。
  3. 黑先、白后,交替下子,每次只能下一子。
  4. 棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
  5. 黑方的第一枚棋子可下在棋盘任意交叉点上。
  6. 轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)。
           五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。整个对局过程中黑方有禁手,白方无禁手。黑方禁手有三三禁手、四四禁手和长连禁手三种。

在这篇博客中我们只实现了较为简单的规则,不考虑规则6以及禁手的相关规定(个人能力有限,如果有愿意研究的朋友,我们可以一起研究研究 /抱拳)。
       设计思路:
1、首先我们需要使用到界面,我们先分析界面上需要实现什么画面,也就是我们要进行这个五子棋游戏要看到什么。要看到:棋盘,棋子(棋子要分颜色,黑色和白色),这些是进行游戏的必需看到的。
2、外表做好以后我们需要去思考内部代码的填充,思考:
①棋子如何落到指定的位置,
②如何实现交替落子,实现颜色交替变换,并且做好记录方便计算棋子排布情况。
③如何计算四个方位上的同色棋子达到获胜的数量。
       首先把窗口调出来,实现代码:

from tkinter import *#导入窗口第三方库
root = Tk()                                    #创建窗口
root.title("憨憨制作的五子棋")                  #窗口名字
w1 = Canvas(root, width=600,height=600,background='lightcyan')#在窗口中央创建一个画布,root是窗口,宽度600,高度600,背景色为lightcyan
w1.pack()                                       #布局方式,全局需要统一。
mainloop()


五子棋棋盘是由15条横线15条竖线组成的。
画出棋盘:

for i in range(0, 15):w1.create_line(i * 40 + 20, 20, i * 40 + 20, 580)w1.create_line(20, i * 40 + 20, 580, i * 40 + 20)
w1.create_oval(135, 135, 145, 145,fill='black')
w1.create_oval(135, 455, 145, 465,fill='black')
w1.create_oval(465, 135, 455, 145,fill='black')
w1.create_oval(455, 455, 465, 465,fill='black')
w1.create_oval(295, 295, 305, 305,fill='black')

窗口的左上角坐标为(0,0),通过调试,我们得出起始位置为(20,20)较为合适,多次调试进行对比,我选择线间距为40比较不错。当然线宽,圆的大小,棋盘线的间距这些都是可以进行调整的,大家可以慢慢试探(h_h)。棋盘中的五个黑点需要我们通过计算得出位置。
create_line(起点,终点):画直线
create_oval(x1,y1,x2,y2,fill=‘颜色’)这个是画一个内切圆,矩形左上角(x1,y1),右下角(x2,y2)fill为填充色,我们可以从网上找到turtle颜色库,顺便帮大家找了一个,自行选择自己喜欢的颜色。

效果图:

       棋盘做好了,我们开始设计落子,这里需要交替进行颜色的改变,那我们就需要去通过一个判断方法来进行改变棋子的颜色。我想了两种:①一种是用字符标记当前鼠标上棋子的颜色,改变为另一种。②另一种是用计数的方式来进行改变。除此之外我们要规定已经放了棋子的位置不能再放棋子,也就是在落子前先判断当前位置是否有棋子。

num=0                        #计算棋盘上有几个棋子,用来判断下一颗棋子颜色
A=np.full((15,15),0    )       #储存位置已有棋子的矩阵
B=np.full((15,15),'')        #用来记录每个位置棋子的颜色
def callback(event):        #输入的是点击事件,event.x和event.y是鼠标点击事件的位置global num ,A         #全局变量可以全局使用for j in range (0,15):   #双重循环定位点击位置最近的网格线交点(i,j),保证棋子落在线的交点处。for i in range (0,15):if (event.x - 20 - 40 * i) ** 2 + (event.y - 20 - 40 * j) ** 2 <= 2 * 20 ** 2:breakif (event.x - 20 - 40 * i) ** 2 + (event.y - 20 - 40 * j) ** 2 <= 2*20 ** 2:breakif num % 2 == 0 and A[i][j] != 1:#判断现在这颗棋子的颜色。w1.create_oval(40*i+5, 40*j+5, 40*i+35, 40*j+35,fill='black')A[i][j] = 1B[i][j] = 'b'num += 1if num % 2 != 0 and A[i][j] != 1 :w1.create_oval(40*i+5, 40*j+5, 40*i+35, 40*j+35,fill='white')A[i][j] = 1B[i][j] = 'w'num += 1

落子以后需要计算是否五子连珠,每个棋子的计算方向有八个形成四条线,那么就是从落子处算先向一端算,直到遇到另一种颜色的棋子,反向查询遇到另一个颜色棋处出停止,当达到五颗棋子时即代表一方获胜,否则循环下一条线。当四条线结束未达到胜利条件,即可继续落子。

f = [[-1, 0], [-1, 1], [0, 1], [1, 1]] #四条线其中一个方向的坐标变化规律for z in range(0, 4):               #循环方向a, b = f[z][0], f[z][1]count1, count2 = 0, 0x, y = i, jwhile B[x][y] == B[i][j]:#当颜色相同即可进行计算count1 += 1if x + a > 0 and y + b > 0 and x + a < 15 and y + b < 15 and B[x + a][y + b] == B[i][j]:#保证不超出矩阵的边界,否则会报错[x, y] = np.array([x, y]) + np.array([a, b])else:x, y = i, j     breakwhile B[x][y] == B[i][j]:#从落子处反向计算同色棋子个数。count2 += 1if x - a < 15 and y - b < 15 and x - a > 0 and y - b > 0 and B[x - a][y - b] == B[i][j]:[x, y] = np.array([x, y]) - np.array([a, b])else:breakif count1 + count2 == 6:            #计算了两次落子处if B[i][j] == 'b':tkinter.messagebox.showinfo('提示', '黑棋获胜')else:tkinter.messagebox.showinfo('提示', '白棋获胜')

点击事件,每次点击以后都需要进行一次落子和游戏结束判断。调用函数进行落子,判断是否结束游戏。

w1.bind("<Button -1>",callback)
w1.pack()

设置退出按钮:

u=Button(root,text="退出",width=10,height=1,command=quit,font=('楷体',15))
u.pack()

完整代码:

from tkinter import *
import tkinter.messagebox  # 弹窗库
import numpy as nproot = Tk()                                 #创建窗口
root.title("憨憨制作的五子棋")                  #窗口名字
w1 = Canvas(root, width=600,height=600,background='lightcyan')
w1.pack()for i in range(0, 15):w1.create_line(i * 40 + 20, 20, i * 40 + 20, 580)w1.create_line(20, i * 40 + 20, 580, i * 40 + 20)
w1.create_oval(135, 135, 145, 145,fill='black')
w1.create_oval(135, 455, 145, 465,fill='black')
w1.create_oval(465, 135, 455, 145,fill='black')
w1.create_oval(455, 455, 465, 465,fill='black')
w1.create_oval(295, 295, 305, 305,fill='black')num=0
A=np.full((15,15),0)
B=np.full((15,15),'')
def callback(event):global num ,Afor j in range (0,15):for i in range (0,15):if (event.x - 20 - 40 * i) ** 2 + (event.y - 20 - 40 * j) ** 2 <= 2 * 20 ** 2:breakif (event.x - 20 - 40 * i) ** 2 + (event.y - 20 - 40 * j) ** 2 <= 2*20 ** 2:breakif num % 2 == 0 and A[i][j] != 1:w1.create_oval(40*i+5, 40*j+5, 40*i+35, 40*j+35,fill='black')A[i][j] = 1B[i][j] = 'b'num += 1if num % 2 != 0 and A[i][j] != 1 :w1.create_oval(40*i+5, 40*j+5, 40*i+35, 40*j+35,fill='white')A[i][j] = 1.B[i][j] = 'w'num += 1f = [[-1, 0], [-1, 1], [0, 1], [1, 1]]for z in range(0, 4):a, b = f[z][0], f[z][1]count1, count2 = 0, 0x, y = i, jwhile B[x][y] == B[i][j]:count1 += 1if x + a >= 0 and y + b >= 0 and x + a < 15 and y + b < 15 and B[x + a][y + b] == B[i][j]:[x, y] = np.array([x, y]) + np.array([a, b])else:x, y = i, jbreakwhile B[x][y] == B[i][j]:count2 += 1if x - a < 15 and y - b < 15 and x - a >= 0 and y - b >= 0 and B[x - a][y - b] == B[i][j]:[x, y] = np.array([x, y]) - np.array([a, b])else:breakif count1 + count2 == 6:if B[i][j] == 'b':tkinter.messagebox.showinfo('提示', '黑棋获胜')else:tkinter.messagebox.showinfo('提示', '白棋获胜')w1.bind("<Button -1>",callback)
w1.pack()
def quit():root.quit()u=Button(root,text="退出",width=10,height=1,command=quit,font=('楷体',15))
u.pack()mainloop()

技术不精,但是喜欢做点小研究,从学习中找到玩耍的快乐,愿意和大家一起学习玩耍。文章较为粗糙, 还望包涵。

基于Python实现五子棋相关推荐

  1. 基于Python的五子棋人机对战

    文章目录 人机对战 计算机算法 源码 运行结果 引用 人机对战 在之前的博文基于tkinter的五子棋游戏中使用tkinter做了一个简单的五子棋游戏,只能实现人人对战,后来想着加上人机对战的功能. ...

  2. 03基于python实现五子棋小程序(完整运行代码+文档说明)

    <五子棋(控制台版)>程序使用说明 在PyCharm中运行<五子棋(控制台版)>即可进入如图1所示的系统主界面. 具体的操作步骤如下: 五子棋(控制台版)游戏的功能都体现在控制 ...

  3. 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战

    基于python的socket实现单机五子棋到双人对战,供大家参考,具体内容如下 本次实验使用python语言.通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSock ...

  4. 基于python的AI五子棋实现(极大极小值搜索和alpha beta剪枝)

    1.极大极小值搜索介绍 人机博弈是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化极大算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出. M ...

  5. 基于Python实现的五子棋游戏设计

    一.设计目的: 1.1 课程设计教学目的 本课程设计是本专业的一门重要实践性教学环节.在学习了专业基础课和<Python程序设计>课程的基础上,本课程设计旨在加深对Python程序设计的认 ...

  6. 基于python的socket实现单机五子棋到双人对战

    基于python的socket实现单机五子棋到双人对战 本次实验使用python语言.通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSocket和Socket:2.打 ...

  7. 基于Python的Pygame带背景音乐的五子棋游戏的设计与实现

    源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ 基于Python的Pygame带背景音乐的五子棋游戏的设计与实现 用户需求分析 通过软件功能的分析, ...

  8. 基于flask的五子棋小游戏

    基于flask的五子棋小游戏 前言 ​ 首先说明一下,本人方向是java后端,只因老师布置了一个作业,要用flask来做一个五子棋,没办法被逼上梁山,程序不太美观,但是应付作业还是够了的. ​ 废话不 ...

  9. 【CV】OpenCV(基于Python)学习笔记

    以下内容中的页码均来自<OpenCV 4详解 : 基于Python> 目录 第2章 载入.显示与保存数据 2.2 图像的读取与显示 2.2.1 图像读取函数 cv.imread() 2.2 ...

最新文章

  1. 基于Struts2框架的名片管理系统
  2. 手持发光棒的结构解析
  3. (转)Android SharedPreferences的使用
  4. php 折叠菜单,SlashdotMenu 折叠菜单
  5. 发布一个自己开发的网站
  6. 虚拟研讨会:.NET的未来在哪里?
  7. 51nod1238. 最小公倍数之和 V3(数论)
  8. vnc远程桌面_手机vnc远程桌面,手机vnc远程桌面,使用配置详解
  9. 基金回撤越大收益越高吗?
  10. 批量执行定时任务_执行批量维护任务安全策略
  11. java 常用习惯用法总结
  12. 英文版的java项目简历_java开发英文简历范文
  13. Hbuilder:实现阴影透明背景特效
  14. 如何读懂3GPP协议
  15. HTML5期末大作业:商城网站设计——小米商城官网首页(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 web学生网页设计作业源码...
  16. 华为手机安装GMS服务
  17. 携程机票业务数据仓库实践
  18. 剑桥禁书与一个自由的灵魂
  19. 图像处理学习笔记2.0
  20. Form表单提交方法method

热门文章

  1. CDH6.3.3 paywall版之前自定义http服务器放置parcels安装数据
  2. 华为认证是什么?这个证值得考吗?网工深思……
  3. HI3861学习笔记(12)——GPIO输入接口使用
  4. Vue引用百度地图API
  5. mysql安装教程 mac_Mac下MySQL安装配置教程
  6. wordpress网站单页模板主题开发制作
  7. 学习方法论与相关建议
  8. 使用Python对GIF读取、生成、压缩和加水印
  9. java matlab 遗传算法_简单遗传算法MATLAB实现
  10. 清华计算机考研报考人数,2020部分院校考研报考人数统计