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 相关文章推荐
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
Linux下用Python脚本监控目录变化代码分享
May 21 Python
详解Python Socket网络编程
Jan 05 Python
django传值给模板, 再用JS接收并进行操作的实例
May 28 Python
pandas.DataFrame选取/排除特定行的方法
Jul 03 Python
Python网络编程之使用TCP方式传输文件操作示例
Nov 01 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 Python
django正续或者倒序查库实例
May 19 Python
Python eval函数介绍及用法
Nov 09 Python
python利用后缀表达式实现计算器功能
Feb 22 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调用Oracle存储过程的方法
2008/09/12 PHP
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
php mail to 配置详解
2014/01/16 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
JS实现“全选”和&quot;全不选&quot;功能代码实例
2020/02/06 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
使用pdb模块调试Python程序实例
2015/06/02 Python
Python常用库推荐
2016/12/04 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
Python数据存储之 h5py详解
2019/12/26 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
期末总结的个人自我评价
2013/11/02 职场文书
任命书怎么写
2014/06/04 职场文书
培训督导岗位职责
2015/04/10 职场文书
六年级作文之关于梦
2019/10/22 职场文书
MySQL中一条SQL查询语句是如何执行的
2022/04/08 MySQL