python编写程序求棋盘博弈_python实现五子棋小程序

本文实例为大家分享了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

yPoint

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()

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

时间: 2019-06-16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值