欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python实现五子棋小程序

程序员文章站 2023-12-12 16:03:40
本文实例为大家分享了python实现五子棋小程序的具体代码,供大家参考,具体内容如下 一、结合书上例子,分三段编写: wuziqi.py #coding:...

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

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

上一篇:

下一篇: