python实现五子棋小程序

时间:2022-10-30 16:26:58

本文实例为大家分享了python实现五子棋小程序的具体代码,供大家参考,具体内容如下

一、结合书上例子,分三段编写:

wuziqi.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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("斜向五子相连,胜利")

二、下面的代码没有验证

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#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()

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

原文链接:https://blog.csdn.net/zbl1243/article/details/82313013