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中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
python中如何使用朴素贝叶斯算法
Apr 06 Python
基于Python中capitalize()与title()的区别详解
Dec 09 Python
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
python 巧用正则寻找字符串中的特定字符的位置方法
May 02 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
Python登录系统界面实现详解
Jun 25 Python
python实现网站用户名密码自动登录功能
Aug 09 Python
PYTHON发送邮件YAGMAIL的简单实现解析
Oct 28 Python
QML实现钟表效果
Jun 02 Python
Python APScheduler执行使用方法详解
Dec 10 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
Jan 28 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
flash用php连接数据库的代码
2011/04/21 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
JavaScript 学习点滴记录
2009/04/24 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
python监控文件或目录变化
2016/06/07 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
python如何制作英文字典
2019/06/25 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
FOREO官方网站:LUNA露娜洁面仪
2016/11/28 全球购物
国际书籍零售商:Wordery
2017/11/01 全球购物
北大自主招生自荐信
2013/10/19 职场文书
汽车驾驶求职信
2013/10/25 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
行政主管岗位职责
2015/02/03 职场文书
反腐倡廉观后感
2015/06/08 职场文书
无房证明样本
2015/06/17 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
小学作文之描写天气
2019/08/15 职场文书