题目: 用Python实现四连环游戏
- 四连环是一个双人游戏,两位玩家轮流将自己的棋子放在一个8列6行的筒状棋盘上。游戏的目标是在对手之前将自己的4个相邻棋子放在一行、一列或一条斜线上。
- 程序扮演一位玩家(劳拉),用户作为其对手。程序采用随机方式选择要放棋子的列,用户则是手工输入要放棋子的列。
假设用户输入的都是整数,当用户输入的列号不在1到8之间时,程序会提示用户,并让用户重新输入;当用户输入的列号已经放满了棋子时,程序也会提示用户,并让用户重新输入。而当程序自己在随机地选择要放棋子的列时,它会自动地忽略那些已经放满棋子的列。 - 由程序判断双方的胜负,分出胜负则程序结束。当出现棋盘满了而无法放棋子的时候,判为平局。
- 每局游戏时Python界面上所显示的内容均同步保存在当前文件夹下文件名为“四连环Log-XXXXX.txt”文件内,“XXXXX”表示一个5位的随机整数。
代码实现:
#-*-encoding:utf-8-*-
import sys
import random
random_=random.randint(1000,9999)
filename = '四连环Log-'+str(random_)+'.txt'
#日志记录
class Logger(object):
def __init__(self, filename="Default.log"):
self.terminal = sys.stdout
self.log = open(filename, 'a')
def write(self, message):
self.terminal.write(message)
self.log.write(message)
def flush(self):
pass
sys.stdout = Logger(filename)
import random,time,math
map_ = [[0 for x in range(8)] for y in range(6)]
list_8 = [0,0,0,0,0,0,0,0]
#打印地图
def print_map(map_):
print(' 1 2 3 4 5 6 7 8')
for i in range(5, -1, -1):
for j in range(8):
qz = map_[i][j]
if qz == 0 :
qz = ' '
print('|' + qz, end='')
print('|')
print('------------------')
#判断是否胜利
def IsWin(map_,row,col,piece):
countH=1
countS=1
countP=1
countN=1
# /*计算countH*/
# /*左边*/
i=col-1
row = row-1
while(i>=0):
if(map_[row][i]==piece):
countH+=1
else:
break
i-=1
# /*右边*/
i=col+1
while(i<=7):
if(map_[row][i]==piece):
countH+=1
else:
break
i+=1
# /*计算countS*/
# /*上边*/
i=row-1
while(i>=0):
if(map_[i][col]==piece):
countS+=1
else:
break
i-=1
# /*下边*/
i=row+1
while(i<=5):
if(map_[i][col]==piece):
countS+=1
else:
break
i++1
# /*计算countN*/
# /*左上*/
i=row-1
j=col-1
while(i>=0 and j>=0):
if(map_[i][j]==piece):
countN+=1
else:
break
i-=1
j-=1
i=row+1
j=col+1
while(i<=5 and j<=7):
if(map_[i][j]==piece):
countN+=1
else:
break
i+=1
j+=1
# /*计算countP*/
# /*右上*/
i=row-1
j=col+1
while(i>=0 and j<=7):
if(map_[i][j]==piece):
countP+=1
else:
break
i-=1
j+=1
# /*左下*/
i=row+1
j=col-1
while(i<=5 and j>=0):
if(map_[i][j]==piece):
countP+=1
else:
break
i+=1
j-=1
if(countH>=4 or countS>=4 or countP>=4 or countN>=4):
return piece
else:
return 0
#主函数
if __name__ == '__main__':
print("Hi,我是劳拉,我们来玩一局四连环。我用O型棋子,你用X型棋子。")
print("游戏规则:双方轮流选择棋盘的列号放进自己的棋子,")
print("若棋盘上有四颗相同型号的棋子在一行、一列或一条斜线上连接起来,")
print("则使用该型号棋子的玩家就赢了!")
print()
print("开始了!这是棋盘的初始状态:")
print_map(map_)
flag = ""
while(flag != "a"):
while True:
luraChess = random.randint(0,7)
if list_8[luraChess] < 6:
break
if math.fsum(list_8)==48:
print('地图已填满,你们是平局!')
flag = "a"
break
if(flag=="a"):
break
list_8[luraChess] += 1
for i in range(6):
if map_[i][luraChess] == 0:
map_[i][luraChess] = '0'
break
print('>>>轮到我了,我把O棋子放在第%d列' %(luraChess+1))
print_map(map_)
if(IsWin(map_,list_8[luraChess],luraChess,"0")):
print("劳拉胜利!")
break
print(">>>轮到你了,你放X棋子,请选择列号(1-8):")
yourChess = eval(input())
if(yourChess < 1 or yourChess > 8):
print(">>>输入错误,你放X棋子,请选择列号(1-8):")
yourChess = eval(input())
print()
yourChess -= 1
for i in range(6):
if map_[i][yourChess] == 0:
map_[i][yourChess] = 'X'
break
list_8[yourChess] += 1
print_map(map_)
if(IsWin(map_,list_8[yourChess],yourChess,"X")):
print("******* 好吧,你赢了!^_*")
break
time.sleep(1)