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读取注册表中值的方法
Apr 08 Python
Python 2.7.x 和 3.x 版本的重要区别小结
Nov 28 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
python:socket传输大文件示例
Jan 18 Python
基于Python函数的作用域规则和闭包(详解)
Nov 29 Python
Python找出最小的K个数实例代码
Jan 04 Python
Django使用HttpResponse返回图片并显示的方法
May 22 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
Apr 01 Python
Python基于百度AI实现OCR文字识别
Apr 02 Python
Python中的整除和取模实例
Jun 03 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
Python 如何安装Selenium
May 06 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中var_export与var_dump的区别分析
2010/08/21 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
图文详解vue框架安装步骤
2019/02/12 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
go和python调用其它程序并得到程序输出
2014/02/10 Python
python实现文件名批量替换和内容替换
2014/03/20 Python
python中dir函数用法分析
2015/04/17 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
Python实战之制作天气查询软件
2019/05/14 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
普通PHP程序员笔试题
2016/01/01 面试题
外贸业务员求职自荐信分享
2013/09/21 职场文书
关于工资低的辞职信
2014/01/14 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
先进个人自荐书
2015/03/06 职场文书
入党积极分子党支部意见
2015/06/02 职场文书