前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >四连环游戏-Python实现

四连环游戏-Python实现

作者头像
K同学啊
发布2020-06-28 11:12:44
1.3K0
发布2020-06-28 11:12:44
举报
文章被收录于专栏:明天依旧可好的专栏

题目: 用Python实现四连环游戏

  1. 四连环是一个双人游戏,两位玩家轮流将自己的棋子放在一个8列6行的筒状棋盘上。游戏的目标是在对手之前将自己的4个相邻棋子放在一行、一列或一条斜线上。
  2. 程序扮演一位玩家(劳拉),用户作为其对手。程序采用随机方式选择要放棋子的列,用户则是手工输入要放棋子的列。 假设用户输入的都是整数,当用户输入的列号不在1到8之间时,程序会提示用户,并让用户重新输入;当用户输入的列号已经放满了棋子时,程序也会提示用户,并让用户重新输入。而当程序自己在随机地选择要放棋子的列时,它会自动地忽略那些已经放满棋子的列。
  3. 由程序判断双方的胜负,分出胜负则程序结束。当出现棋盘满了而无法放棋子的时候,判为平局。
  4. 每局游戏时Python界面上所显示的内容均同步保存在当前文件夹下文件名为“四连环Log-XXXXX.txt”文件内,“XXXXX”表示一个5位的随机整数。

代码实现:

代码语言:javascript
复制
#-*-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)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档