#!/usr/bin/env python
# -*- coding:utf-8 -*-
# coding by 秋叶夏风
# 导入系统模块,用于保证程序结束后不退出终端
import os
class Chess():
def __init__(self):
'''
初始化魔术方法
用于设定初始的状态值
'''
# 定义两个数组
self.user1 = [] # 用于记录用户1的下子信息
self.user2 = [] # 用于记录用户2的下子信息
print("-------欢迎使用连珠五子棋程序-------")
print("本游戏需要两名玩家一起玩")
self.player1 = '1'
self.player2 = '2'
print("%s:o" % self.player1)
print("%s:e" % self.player2)
self.display(self.user1, self.user2) # 先显示一下原始状态
# 调用主逻辑函数
self.main_logic()
def display(self,user1,user2):
'''
更新显示的方法
:param user1: 用户1的数组
:param user2: 用户2的数组
:return: 无返回值
'''
print("\t1 2 3 4 5 6 7 8 9 101112131415")
for i in range(15):
print(i+1,end="")
print("\t",end="")
for j in range(15):
# 遍历所有位置,判断是否有下过子
if [i+1,j+1] in user1:
print("o ", end="")
pass
elif [i+1,j+1] in user2:
print("e ", end="")
pass
else:
print("+ ",end="")
pass
print()
pass
def input_check(self):
'''
定义输入校正方法
用于验证输入的数据的规范性
:return: 无返回值
'''
while True:
hang = input("行数:")
lie = input("列数:")
if hang.isdigit() and lie.isdigit():
hang = int(hang)
lie = int(lie) # 判断输入的字符是不是数字
# 判断输入的点位置有没有之前下过
if [hang,lie] in self.user1 or [hang,lie] in self.user2:
print("这个点已经下过了,请重新输入")
else:
# 判断输入的数字范围在不在 棋盘空间内
if hang in range(1,16) and lie in range(1,16):
return hang,lie
else:
print("你输入的数值不再棋盘范围内,重新输入")
pass
else:
print("你这输入的也不是数字啊,逗我玩呢啊")
print("赶紧的,重新输入")
pass
def choose_winner(self,user):
'''
# 定义判断方法,用于验证玩家的获胜一方
:param user: 当前用户
:return: bool
'''
# 遍历所有位置坐标
for hang in range(1,15):
for lie in range(1,15):
# 判断 有没有5连子的情况,要是有返回真
# 竖着5个子连上的情况
if [hang ,lie] in user and\
[hang+1,lie] in user and\
[hang+2,lie] in user and\
[hang+3,lie] in user and\
[hang+4,lie] in user :
# print("恭喜用户%s赢了,游戏结束"%yonghu)
return True
pass
# 横着5个子连接的情况
elif [hang ,lie] in user and\
[hang,lie+1] in user and\
[hang,lie+2] in user and\
[hang,lie+3] in user and\
[hang,lie+4] in user :
# print("恭喜用户%s赢了,游戏结束"%yonghu)
return True
pass
# 斜着\这么斜的情况
elif [hang ,lie] in user and\
[hang+1,lie+1] in user and\
[hang+2,lie+2] in user and\
[hang+3,lie+3] in user and\
[hang+4,lie+4] in user :
# print("恭喜用户%s赢了,游戏结束"%yonghu)
return True
pass
# 斜着/这么斜的情况
elif [hang ,lie] in user and\
[hang-1,lie+1] in user and\
[hang-2,lie+2] in user and\
[hang-3,lie+3] in user and\
[hang-4,lie+4] in user :
# print("恭喜用户%s赢了,游戏结束"%yonghu)
return True
pass
pass
return False
pass
def main_logic(self):
'''
主要执行逻辑
包括循环调用输入方法,显示方法,判断验证方法
更新用户列表的数据
:return:
'''
i = 0 # 用于记录下子的次数,若超出这个范围,即下满棋盘,则和棋
while i <= 225: # 死循环 输入 其实用不着死循环,一共就那么多下
i += 1 # 累加
if i % 2: # 判断出当前的用户
yonghu = self.player1
else:
yonghu = self.player2
print("请玩家%s输入" % yonghu) # 用于提示哪个用户输入
posi = self.input_check() # 调用输入校正方法,防止用户下到已经下的位置上
hang = posi[0] # 将输入校正方法返回的返回值元祖拆开
lie = posi[1]
if yonghu == self.player1:
self.user1.append([hang, lie]) # 将坐标信息添加到对应用户的列表
pass
else:
self.user2.append([hang, lie]) # 将坐标信息添加到对应用户的列表
pass
# 调用显示方法
self.display(self.user1, self.user2)
# 游戏胜负判断
if self.choose_winner(self.user1):
print("五子连珠")
print("恭喜玩家%s赢了,游戏结束" % yonghu)
os.system("pause")
break # 跳出循环终止程序
if self.choose_winner(self.user2):
print("五子连珠")
print("恭喜玩家%s赢了,游戏结束" % yonghu)
os.system("pause")
break
# print(user1) # 调试的时候用,游戏的时候可以隐藏了
# print(user2)
# 实例化对象
c = Chess()