围棋qingGo_0_0

yizhihongxing

qingGo_0_0需求:

1,设计一个9路棋盘,对弈双方轮流落子
2,已落子的点不能再落子
3,棋盘上没有空点时,统计双方棋子数量,多的一方赢

设计:

1,使用QipanModel类建立棋盘模型
围棋qingGo_0_0

 1 class QipanModel():
 2     def __init__(self,n=9):
 3         self.n = n #棋盘路数,默认9路棋盘
 4         #棋盘点位,从(1,1)开始,(9,9)结束
 5         #用字典表示,例"1_1":0,  0空,1黑,-1白,初始所有点为空
 6         self.dot = {f'{i}_{j}':0 for i in range(1,self.n+1) for j in range(1,self.n+1)}
 7         #棋子数量,黑子白子初始为0
 8         self.black_num = 0
 9         self.white_num = 0
10         
11     #更改点位状态,(x,y)是要更改的点位
12     def update_dot_status(self,x:int,y:int,color:str):
13         if color == 'black':
14             self.dot[f'{x}_{y}'] = 1
15             self.black_num+=1
16         elif color == "white":
17             self.dot[f'{x}_{y}'] = -1
18             self.white_num+=1
19             
20     #查看点位状态
21     def select_dot_status(self,x,y):
22         print(f'点({x},{y})为{self.dot[f"{x}_{y}"]}')
23         
24     #获取所有空的点位
25     def empty_dot(self):
26         return [k for k in self.dot if self.dot[k] == 0]

QipanModel


2,用继承Tk类的QipanView实现界面
围棋qingGo_0_0

 1 from tkinter import *
 2 
 3 class QipanView(Tk):
 4     def __init__(self,n=9):
 5         print("qingGo棋盘开始绘制!!!")
 6         Tk.__init__(self)  ###父类必须初始化
 7         self.n = n  #9路棋盘
 8         self.title("围棋qingGo_0_0")
 9 
10 
11         # 创建画布
12         self.canvas = Canvas(self, width=600, height=500, bg='red')
13         self.canvas.pack()
14         # 画棋盘
15         self.size = 40  #围棋每小格的长度,每小格长度(单位是像素)
16         # 画外框线
17         # 起点start_dot(sx,sy) 终点end_dot(ex,ey)
18         sx = self.canvas.winfo_x() + 20
19         sy = self.canvas.winfo_y() + 20
20         ex = sx + self.size * (self.n - 1)
21         ey = sy + self.size * (self.n - 1)
22         self.canvas.create_rectangle(sx, sy, ex, ey, fill='')
23         # 画竖线
24         # 外框线画好因此只需画n-2条线
25         # 竖线起点每条线x递增size,y不变
26         for i in range(1, self.n - 1):
27             self.canvas.create_line(sx + self.size * i, sy, sx + self.size * i, ey)
28         # 画横线,每条线y递增size,x不变
29         for i in range(1, self.n - 1):
30             self.canvas.create_line(sx, sy + self.size * i, ex, sy + self.size * i)
31             self.wm_attributes('-topmost', 1)  # 确保窗口在最上层
32 
33         print("qingGo棋盘绘制完成!!!")
34 
35 
36     # x,y是坐标,从1开始,(1,1)开始,(9,9)结束,棋手落子时,传入坐标点,棋手颜色
37     def luozi(self, x: int, y: int,color='black'):
38         # sx,sy是绘制棋盘外框线时左上角的坐标
39         sx = self.canvas.winfo_x() + 20
40         sy = self.canvas.winfo_y() + 20
41         # 棋子左上角和右下角的坐标分别如下,加2减2为了让棋子小一点
42         x1 = sx + (x - 1) * self.size - self.size / 2 + 2
43         y1 = sy + (y - 1) * self.size - self.size / 2 + 2
44         x2 = sx + (x - 1) * self.size + self.size / 2 - 2
45         y2 = sy + (y - 1) * self.size + self.size / 2 - 2
46         self.canvas.create_oval(x1, y1, x2, y2, fill=color)  # 画棋子
47         self.update() #更新画布,不然画不了

QipanView


3,创建棋手类,用于作为对弈双方的抽象
围棋qingGo_0_0

 1 import random
 2 from qingGo.qingGo0_0.caipan import Caipan
 3 from qingGo.qingGo0_0.qipan_model import QipanModel
 4 from qingGo.qingGo0_0.qipan_view import QipanView
 5 
 6 class Qishou():
 7     def __init__(self,color='black'):
 8         self.color = color
 9         print(self.color+"方就位!")
10 
11     #下棋
12     def xiaqi(self, qipan_model:QipanModel, qing_view:QipanView, caipan:Caipan):
13         # 获取空点
14         empty_dot = qipan_model.empty_dot()
15         l = len(empty_dot)
16         if l == 0:
17             print("棋盘满了!请裁判判定胜负!!!")
18             caipan.who_win(qipan_model)
19             return "棋盘满了!"
20 
21         #用随机函数,选择一个点
22         dot = empty_dot[random.randint(0,l-1)]
23         x = int(dot[0])
24         y = int(dot[2])
25         #更改棋盘中点状态
26         qipan_model.update_dot_status(x, y, color=self.color)
27         #落子,界面展示
28         qing_view.luozi(x,y,color=self.color)
29         #落子后裁判报位置
30         caipan.luozi_place(x, y, self.color)

Qishou


4,裁判类,棋手落子后播报位置,判断胜负
围棋qingGo_0_0

 1 from qingGo.qingGo0_0.qipan_model import QipanModel
 2 class Caipan():
 3     def __init__(self):
 4         print("裁判上场!")
 5 
 6     #棋手下棋后裁判报位置
 7     def luozi_place(self,x,y,color):
 8         print(f"{color} 落子在({x},{y})")
 9     # 判断胜负
10     def who_win(self,qipan_model:QipanModel):
11         print(f"黑子:{qipan_model.black_num},白子:{qipan_model.white_num}")
12         if qipan_model.black_num>qipan_model.white_num:
13             print("黑方获得胜利!")
14         else:
15             print("白方获得胜利!")

Caipan


5,创建run.py实现功能
围棋qingGo_0_0

 1 import random
 2 import time
 3 
 4 from qingGo.qingGo0_0.caipan import Caipan
 5 from qingGo.qingGo0_0.qipan_model import QipanModel
 6 from qingGo.qingGo0_0.qipan_view import QipanView
 7 from qingGo.qingGo0_0.qishou import Qishou
 8 
 9 if __name__ == '__main__':
10     #绘制棋盘
11     qv = QipanView()
12 
13     #初始化模型
14     qm = QipanModel()
15     #白方上场
16     w = Qishou("white")
17     #黑方上场
18     b = Qishou("black")
19     #裁判上场
20     cp = Caipan()
21 
22     #下棋次数为9*9,加1是为了看棋盘满了后的效果
23     i = qm.n**2+1
24     while i>0:
25         if i%2 == 1:
26             w.xiaqi(qm, qv,cp)
27         else:
28             b.xiaqi(qm, qv,cp)
29         i-=1
30         time.sleep(0.05)
31 
32     # 画画功能
33     qv.mainloop()

run.py

 

效果图:

围棋qingGo_0_0

 

简单的目录结构,其中的Pictures文件夹是其他项目的,与此无关

围棋qingGo_0_0

 总结:

    忽略美观程度,可以看到,效果已经有了,毕竟是初代程序,等后续升级.

    至此,我们可以得出结论,在这个版本中,想要赢的胜利,只需要先下棋就行了,毕竟需求没有提到要吃子

 

 

 

 

 

 

 

 


原文链接:https://www.cnblogs.com/qingGo/p/17322464.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:围棋qingGo_0_0 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • Python 3.8正式发布重要新功能一览

    下面是详细的Python 3.8正式发布重要新功能一览攻略: 1. 字符串格式化语法的改进 Python 3.8中对字符串格式化语法进行了改进,增加了f-strings,可以更方便地将表达式嵌入到字符串中去。示例代码如下: x = 3 y = 4 print(f'{x} + {y} = {x+y}’) # 输出:3 + 4 = 7 这样可以在字符串中直接嵌入…

    python 2023年5月20日
    00
  • Python使用Web框架Flask开发项目

    下面是Python使用Web框架Flask开发项目的完整攻略,我们会分为以下几个步骤来说明。 步骤1:安装Flask 首先需要安装Flask,可以使用以下命令进行安装: pip install Flask 步骤2:创建Flask应用 接下来我们需要创建一个Flask应用,打开编辑器或者IDE,创建一个.py文件,最简单的Flask应用如下: from fla…

    python 2023年5月13日
    00
  • Python实现定时发送监控邮件

    让我为你详细讲解Python实现定时发送监控邮件的完整攻略。 1.准备工作 在开始之前,我们需要准备以下工具和环境: Python编程环境。最好安装Python3,并安装相关的第三方库(如smtplib、email等)。 定时任务工具。可以选择系统自带的crontab(Linux/MacOS)或者Windows Scheduler(Windows)。 2.编…

    python 2023年5月18日
    00
  • 制作Python数字华容道的实现(可选择关卡)

    下面是关于“制作Python数字华容道的实现(可选择关卡)”的完整攻略。 确定程序需求 首先,我们需要明确这个程序需要实现的功能:1. 可以生成不同难度的数字华容道关卡,即4×4, 5×5或者6×6的游戏盘面;2. 游戏盘面上的数字需要随机打乱,形成初始状态,玩家需要通过移动数字将它们恢复到有序状态;3. 程序需要显示当前盘面和移动后的新盘面,以及一些提示信…

    python 2023年6月13日
    00
  • python读取并定位excel数据坐标系详解

    下面我将详细讲解一下“python读取并定位excel数据坐标系详解”的完整实例教程。 标题 介绍 本文主要介绍如何使用Python读取和定位Excel数据,并对Excel数据坐标系进行详细说明。 实现步骤 安装必要的Python库 本例中需要使用openpyxl库来读取并定位Excel中的数据,可以使用pip命令来安装该库。 pip install ope…

    python 2023年5月13日
    00
  • 基于wxPython的GUI实现输入对话框(1)

    “基于wxPython的GUI实现输入对话框(1)”是一篇关于用wxPython实现GUI输入对话框的教程。它的完整攻略可以分为以下几个步骤: 1. 安装wxPython wxPython是一个开源的Python库,可以用于创建GUI应用程序。你需要先安装wxPython库才能开始创建GUI输入对话框。你可以使用 pip 命令进行安装: pip instal…

    python 2023年5月18日
    00
  • Python第三方库的安装方法总结

    以下是Python第三方库的安装方法总结: 简介 Python是一门高效、优雅、易学、易懂、易用的编程语言,它可以通过第三方库来扩展其功能。因此,学会安装第三方库是Python开发的必备技能之一。Python第三方库的安装方法多种多样,本文将总结几种常用的方法。 方法一:使用pip命令 pip是Python的包管理工具,使用pip可以方便地安装、卸载、更新P…

    python 2023年5月13日
    00
  • Python返回数组/List长度的实例

    在Python编程中,数组和列表是两种常用的数据类型,它们都是用于表示一个有序的、可变的序列。在实际编程中,我们经常需要获取数组或列表的长度,以便进行相关的操作。Python提供了len()函数来获取数组或列表的长度。下面将详细讲解如何使用len()函数来获取数组或列表的长度,包括语法、参数、返回值以及示例说明。 len()函数的语法 len()函数是Pyt…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部