玩转Python字典、列表,Python版五子棋
2019-05-12 本文已影响11人
请叫我雯子小姐的小爷
本脚本没有使用任何Python的第三方模块,仅使用Python的字典以及列表完成。
脚本设计环境:Python3,Mac
注意:如需在Windows上运行,请做以下几处修改:
os.system('cls') #Windows上不识别clear,改为cls
'੦' --> 'O' '◉'-->'E' #Windows上不能正确显示这两个符号,可以修改为你认为
draw_line = {} # 将init()的第一行改为这样,会取消列号,可以手动加在draw()模块中,否则会有行显示错乱现象
项目预览
image.png
设计思路,使用字典嵌套列表完成
draw_line = {'line0':[...],
'line1':[...],
...
}
主要包含6个主要模块,分别为
init() # 初始化棋盘及参数
change(x, y, res, make) #将棋子放于棋盘中
victory(res) #判断是否有一方胜利
ishave(x, y, res) #判断所下棋子位置是否已经有棋子
pvp(w, b) #人人对战主程序
draw(res,white,blank,number=0) # 将棋盘打印出来
主程序如下
# @Author : Rui Ma
# @e-Mail : marui_06@outlook.com
import os
def init(): ### use now
draw_line = {'x':['1 ','2 ','3 ','4 ','5 ','6 ','7 ','8 ','9 ','10 ','11 ','12 ','13 ','14 ','15 ','16 ','17 ','18 ','19']}
for i in range(37):
if i % 2 == 0 or i == 37:
x_line = []
for j in range(37):
if j % 2 == 0:
x_line.append('+')
if j % 2 == 1:
x_line.append('---')
x_line.append(' '+str(int(i/2+1)))
draw_line[i]=x_line
if i % 2 == 1:
x_line = []
for j in range(37):
if j % 2 == 0:
x_line.append('|')
if j % 2 == 1:
x_line.append(' ')
draw_line[i]=x_line
i = 0
return i,draw_line
def draw(res,white,blank,number=0):
os.system("clear")
print("\n")
if number%2 == 0:
str1 = "-- 第{0}手,{1} 出手 --".format(number+1,'੦')
else:
str1 = "-- 第{0}手,{1} 出手 --".format(number+1,'◉')
print(str1.center(68, '*'))
for i in res:
result = ''
for j in res[i]:
result += j
print(result)
strv = "'੦' 胜{0}局, '◉' 胜{1}局, 共{2}局".format(white,blank,white+blank)
str2 = "-- 'q' to quit --"
str3 = "-- 输入两个数字,以空格分隔 --"
print(str2.center(73, '*'))
print("\n")
print(strv.center(67,'*'))
print(str3.center(61, '*'))
print("\n")
def change(x, y, res, make):
res[int(x)*2-2][int(y)*2-2]=make
return res
def victory(res):
col = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28]
def isvictory(a, b, c, d, e):
if a != '+' and a != '|' and a == b and b == c and c == d and d == e:
return 1
else:
return 0
#横向判断
for i in res:
if i == 'x':
pass
else:
for k in col:
if isvictory(res[i][k],res[i][k+2],res[i][k+4],res[i][k+6],res[i][k+8]) == 1:
return 1
#纵向判断
row = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36]
for i in col:
for j in row:
if isvictory(res[i][j],res[i+2][j],res[i+4][j],res[i+6][j],res[i+8][j]) == 1:
return 1
#右斜方向判断
for i in col:
for j in col:
if isvictory(res[i][j],res[i+2][j+2],res[i+4][j+4],res[i+6][j+6],res[i+8][j+8]) == 1:
return 1
#左斜方向判断
col_z = [36,34,32,30,28,26,24,22,20,18,16,14,12,10,8]
for i in col_z:
for j in col_z:
if isvictory(res[i][36-j],res[i-2][36-j+2],res[i-4][36-j+4],res[i-6][36-j+6],res[i-8][36-j+8]) == 1:
return 1
def ishave(x, y, res):
if res[int(x)*2-2][int(y)*2-2] == '+':
return 1
else:
return 0
def pvp(w, b):
i,res = init()
draw(res,w,b)
while True:
try:
y, x = input("输入坐标: ").split()
except:
os.system("clear")
exit()
if int(x) > 19 or int(y) > 19:
print("超出棋盘范围,重新输入坐标")
elif i % 2 == 0:
if ishave(x,y,res) == 1:
res = change(x,y,res,'੦')
draw(res,w,b,number=i+1)
i += 1
if victory(res) == 1:
print('Game Over ੦ victory')
return 0
break
else:
print("已有棋子,重新输入坐标")
else:
if ishave(x,y,res) == 1:
res = change(x,y,res,'◉')
draw(res,w,b,number=i+1)
i += 1
if victory(res) == 1:
print('Game Over ◉ victory')
return 1
break
else:
print("已有棋子,重新输入坐标")
def main():
os.system("clear")
str1 = ' -- Choose Mode -- '
str2 = ' 1 -- PvP -- 1 '
str3 = ' 2 -- PvE -- 2 '
print(str1.center(80, '*'))
print(str2.center(80, '*'))
print(str3.center(80, '*'))
choose = input("\n'1' or '2': ")
if int(choose) == 1:
white, blank = 0, 0
while True:
result = pvp(white,blank)
if result == 0:
white += 1
ifcontinue = input("是否继续(1: 是 2: 否): ")
if int(ifcontinue) == 1 :
continue
else:
break
else:
blank += 1
ifcontinue = input("是否继续(1: 是 2: 否): ")
if int(ifcontinue) == 1 :
continue
else:
break
if __name__ == "__main__":
main()
由于时间原因,目前只写了pvp部分,还没有加入人工智能算法,以后慢慢添加,欢迎提供意见或者建议