python实现五子棋小程序


Posted in Python onJune 18, 2019

本文实例为大家分享了python实现五子棋小程序的具体代码,供大家参考,具体内容如下

一、结合书上例子,分三段编写:

wuziqi.py

#coding:utf-8
from win_notwin import *
from show_qipan import *
 
maxx=10 #10行10列
maxy=10
qipan=[[0,0,0,0,1,0,0,2,0,0],[0,1,2,1,1,0,2,0,0,0],[0,0,0,0,1,1,0,2,0,0],[0,0,0,0,2,0,0,1,0,0],
 [0,0,0,1,1,1,2,0,0,0],[0,0,0,2,0,0,0,2,0,0],[0,0,1,2,0,2,2,0,1,0],[0,0,0,2,0,0,0,1,0,0],[0,0,0,0,0,0,1,1,0,0],
 [0,0,0,0,0,0,0,0,0,0]]
sqipan(qipan) #显示初始化的棋盘
 
 
who=True
while True:
 t=input("请输入棋子的位置(x,y),现在由"+("O" if who else "X")+"方下子:").split(",")
 #输入坐标
 if len(t)==2:
 x=int(t[0])
 y=int(t[1])
 if qipan[x][y]==0:
  qipan[x][y]=1 if who else 2
  who=not who
 
  sqipan(qipan) #显示当前棋盘
 
  win_not(qipan,x,y) #判断有没有人赢
 else:
  print("当前位置已有棋子,请重新下子")
 else :
 print("输入位置有误,请输入要下的位置,如1,1")

show_qipan.py

def sqipan(qipan):
 maxx=10
 maxy=10
 print(" O 一 二 三 四 五 六 七 八 九")
 for i in range(maxx):
 print(i, " ", end="")
 for j in range(maxy):
  if qipan[i][j] == 0:
  print("+", " ", end="") # 无棋子
  elif qipan[i][j] == 1:
  print("O", " ", end="") # 白色
  elif qipan[i][j] == 2:
  print("X", " ", end="") # 黑色
 print("\n")

win_notwin.py

def win_not(qipan,x,y):
 maxx=10
 maxy=10
 flag=qipan[x][y]
 xPoint = x
 yPoint = y
 # 横向
 count = 0
 # x=xPoint
 # y=yPoint
 while (x >= 0 and flag == qipan[x][y]): # 向左统计连续棋子数
 count += 1
 x -= 1
 x = xPoint
 y = yPoint
 while (x >= 0 and flag == qipan[x][y]):
 count += 1
 x += 1
 if (count > 5): print("纵向五子棋相连,胜利!")
 
 count = 0
 x = xPoint
 y = yPoint
 while (y >= 0 and flag == qipan[x][y]):
 count += 1
 y -= 1
 y = yPoint
 while (y <= maxy and flag == qipan[x][y]):
 count += 1
 y += 1
 if (count > 5): print("横向五子相连,胜利")
 
 # 斜向
 # 左下
 count = 0
 x = xPoint
 y = yPoint
 while (x >= 0 and y < maxy and flag == qipan[x][y]):
 count += 1
 x -= 1
 y += 1
 x = xPoint
 y = yPoint
 # 右上
 while (x < maxx and y >= 0 and flag == qipan[x][y]):
 count += 1
 x += 1
 y -= 1
 if (count > 5): print("斜向五子棋相连,胜利")
 
 # 斜上
 count = 0
 x = xPoint
 y = yPoint
 # 左上
 while (x >= 0 and y >= 0 and flag == qipan[x][y]):
 count += 1
 x -= 1
 y -= 1
 x = xPoint
 y = yPoint
 while (x < maxx and y < maxy and flag == qipan[x][y]):
 count += 1
 x += 1
 y += 1
 if (count > 5):
 print("斜向五子相连,胜利")

二、下面的代码没有验证

#coding:utf-8
import os
import pdb
import pickle
 
class Player(object):
 number=0
 def __init__(self,name=''):
 """
  玩家类构造方法
  """
 if not name:
  Player.number+=1
  name='Player%d'% Player.number
 self.name=name
 def play(self):
 """
  玩家输入下一步落子位置
  """
 t=input('Please input(x,y),now is'+self.name+':')
 
 return t
 
 
#棋盘类
class Board(object):
 class Status(object):
 """
  状态量,提供转态常量
  """
 NONE=0
 WHITE=1
 BLACK=2
 
 def __init__(self,maxx=10,maxy=10):
 """
  棋盘类构造方法 确定尺寸,以及创建棋盘成员对象
  """
 self.maxx,self.maxy=maxx,maxy
 self.qipan=[[0]*maxy for i in range(maxx)]
 
 def hasChaessman(self,xPoint,yPoint):
 """
  判断是否有棋子存在
  """
 return self.qipan[xPoint][yPoint]!=Board.Status.NONE
 def downPawn(self,xPoint,yPoint,who):
 """
  玩家在某个位置落子
  """
 if self.hasChaessman(xPoint,yPoint):
  return False
 else:
  self.qipan[xPoint][yPoint]=Board.Status.WHITE if who else Board.Status.BLACK
  return True
 
 def inRange(self,xPoint,yPoint):
 """
 玩家在某个位置落子
 """
 return xPoint<self.maxx and\
  yPoint<self.maxy and\
  xPoint>=0 and\
  yPoint>=0
 
 def checkFiveInRow(self,xPoint,yPoint,xDir,yDir):
 """
 判断以(xpoint,ypoiny)点(xDir,yDir)方向上是否五子连珠
 """
 count = 0
 t=self.qipan[xPoint][yPoint]
 x,y=xPoint,yPoint
 while (self.inRange(x,y) and t==self.qipan[x][y]):
  count += 1
  x+=yDir
  y+=yDir
 x, y = xPoint, yPoint
 while (self.inRange(x, y) and t == self.qipan[x][y]):
  count += 1
  x -= yDir
  y -= yDir
 return count>5
 
 def isWin(self,xPoint,yPoint):
 """
 以(xpoint,ypoiny)点为中心在四个方向分别判断五子连珠
 """
 pdb.set_trace()#####################
 return self.checkFiveInRow(xPoint,yPoint,1,0) or \
  self.checkFiveInRow(xPoint, yPoint, 0,1) or \
  self.checkFiveInRow(xPoint, yPoint, 1,1) or \
  self.checkFiveInRow(xPoint, yPoint, 1,-1)
 
 def printQp(self):
 """
 打印棋盘
 """
 qiType=["十","O","X"]
 print(' O 一 二 三 四 五 六 七 八 九')
 for i in range(self.maxx):
  print(i," ",end='')
  print(' '.join(qiType[x] for x in self.qipan[i]))
 
#文件存读档类
class FileStatus(object):
 def save(self):
 """
 存档方法
 """
 fpath=input("请输入保持文件的路径:")
 file=open(fpath,'w')
 pickle.dump(self,file)
 file.close()
 
 def load(self):
 """
 读档方法
 """
 pass
 
 
#游戏类
class GoBang(FileStatus):
 
 def __init__(self,qipan,white,black):
 """
 游戏类构造方法
 创建成员变量
 """
 self.qipan=qipan
 self.white=white
 self.black=black
 self.who=True
 
 def start(self):
 """
 游戏主流方法
 """
 os.system('cls')
 self.printQp()
 while True:
  t=(self.white if self.who else self.black).play()
  if t=='S':
  self.save()
  continue
  if t=='L':
  self.load()
  continue
  t.split(',')
  if len(t)==2:
  x,y=int(t[0]).int(t[1])
  if self.qipan.downPawn(x,y,self.who):
   os.system('cls')
   self.printQp()
   if self.qipan.isWin(x,y):#判断游戏是否结束
   print(self.white.name if\
    self.who else self.black.name)+'Win'
   break
   self.who=not self.who #切换游戏角色
 os.system('pause')
 
 def load(self):
 """
 重写读档方法
 """
 fpath=input("请输入读取文件的路径")
 file=open(fpath,'r')
 status=pickle.load(file)
 file.close()
 #读档 拷贝
 self.qipan=status.qipan
 self.white=status.white
 self.black=status.black
 self.who=status.who
 os.system('cls')
 self.printQp()
 
 def printQp(self):
 """
 打印
 """
 self.qipan.printQp()
 print("按L读取,S保存")
 
if __name__=='__main__':
 t=GoBang(Board(),Player(),Player())
 t.start()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅析Python中的join()方法的使用
May 19 Python
python tensorflow基于cnn实现手写数字识别
Jan 01 Python
PyQt5每天必学之事件与信号
Apr 20 Python
Tensorflow 查看变量的值方法
Jun 14 Python
python得到qq句柄,并显示在前台的方法
Oct 14 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
Nov 23 Python
python 用opencv调用训练好的模型进行识别的方法
Dec 07 Python
python 自定义对象的打印方法
Jan 12 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
python numpy 反转 reverse示例
Dec 04 Python
Python 实现还原已撤回的微信消息
Jun 18 #Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 #Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 #Python
python实现五子棋游戏
Jun 18 #Python
解决python中使用PYQT时中文乱码问题
Jun 17 #Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 #Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 #Python
You might like
php实现mysql同步的实现方法
2009/10/21 PHP
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2016/01/12 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
Javascript模块化编程(一)AMD规范(规范使用模块)
2013/01/17 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
CSS3结合jQuery实现动画效果及回调函数的实例
2017/12/27 jQuery
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
Python 创建子进程模块subprocess详解
2015/04/08 Python
Django 路由控制的实现代码
2018/11/08 Python
python的turtle库使用详解
2019/05/10 Python
python实现五子棋小程序
2019/06/18 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
Python实现字符串中某个字母的替代功能
2019/10/21 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
技校个人求职信范文
2014/01/25 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
python垃圾回收机制原理分析
2022/04/13 Python
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android