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

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值