亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python實現五子棋小程序

系統 1821 0

本文實例為大家分享了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
            
              =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()
            
          

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 男人手机天堂 | 日本久久免费 | 福利视频在线免费观看 | 农村苗族一级特黄a大片 | 成人综合久久精品色婷婷 | 一区精品视频 | 精品在线一区二区三区 | 国产理论视频在线观看 | 亚洲一区二区三区高清视频 | 伊人久久综合影院 | 亚洲精品宾馆在线精品酒店 | 亚洲一级毛片免费看 | 五月天婷婷在线视频国产在线 | 成年女人免费看 | 欧美成人欧美激情欧美风情 | 亚洲一区二区精品 | 亚洲操操操 | 亚洲精品资源在线 | 日韩天天摸天天澡天天爽视频 | 亚洲伊人久久综合一区二区 | 日本黄色不卡视频 | 国产一区二区三区视频在线观看 | 一a一片一级一片啪啪 | 久久精品免费大片国产大片 | 中文字幕在线观看一区二区三区 | 日本aⅴ在线不卡免费观看 日本aaaa | 欧美视频一区二区三区在线观看 | 国产精品成人一区二区1 | 香蕉tv亚洲专区在线观看 | 快射影院 | 国产欧美一区二区三区视频 | 99热爱| 久久人视频 | 国产欧美日韩综合精品一区二区 | 俄罗斯一级成人毛片 | 精品成人免费视频 | 亚洲国产婷婷综合在线精品 | 久草高清视频 | 久久这里有精品 | 国产色婷婷视频在线观看 | 欧美精品 在线播放 |