• python之用循环实现五子棋小程序


    在python中我们学过流程控制中的循环结构,现在我们来进行一个小应用的练习
    本程序是通过循环控制结构来实现五子棋小程序的

    游戏规则

    五子棋的规则如下:

    • 对局双方各执一色棋子。
    • 空棋盘开局。
    • 黑先、白后,交替下子,每次只能下一子。
    • 棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
    • 黑方的第一枚棋子可下在棋盘任意交叉点上。
    • 轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)

    实现过程

    由于本程序较为简单,基础知识要求较低,通过观看本教程,大部分同学都能够理解和掌握.
    在这里需要提前了解的知识有:

    棋盘界面是通过我们利用循环打印出来的,棋子的两种是通过"e"和"o"两个字母打印出来的,其他地方用"+"填充出网格

    其中,用户通过输入棋子的横纵坐标来进行位置信息的输入,这里在输入后进行了一系列的验证,输入的内容是否为数值,数值是否超出范围,落子的位置是否为空等

    用于验证获胜者的模块,是通过循环遍历所有棋盘中的位置,判断相邻的位置的棋子是否同时存在于当前用户的列表中,若条件成立,则返回True,否则返回False

    主模块中是一个while循环,提示用户输入位置信息,并且加入用户列表数据存储,以便于计算棋子的位置信息以及数量,每次显示出新的界面,然后进入win模块进行获胜者的检验,若通过检验,循环终止,游戏结束.

    代码实现

    具体代码如下

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # coding by 秋叶夏风
    
    
    # 定义显示方法
    def dis(user1,user2):
        print("	1 2 3 4 5 6 7 8 9 101112131415")
        for i in range(15):
            print(i+1,end="")
            print("	",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="")
                else:
                    print("+ ",end="")
                pass
            print()
        pass
    
    # 定义输入校正方法
    def ini():
        while True:
            hang = input("行数:")
            lie = input("列数:")
    
            if hang.isdigit() and lie.isdigit():
                hang = int(hang)
                lie = int(lie) # 判断输入的字符是不是数字
                # 判断输入的点位置有没有之前下过
                if [hang,lie] in user1 or [hang,lie] in 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 win(user):
        # 遍历所有位置坐标
        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 logic_control():
        print("-------欢迎使用连珠五子棋程序-------")
        print("本游戏需要两名玩家一起玩")
    
        wanjia1 = input("请输入玩家1的名字:")
        wanjia2 = input("请输入玩家2的名字:")
    
        print("用户1:o")
        print("用户2:e")
        dis(user1,user2)    # 先显示一下原始状态
        
        i = 0  # 用于记录下子的次数
        while i<=225:   # 死循环 输入 其实用不着死循环,一共就那么多下
            i += 1      # 累加
            if i%2 :    # 判断出当前的用户
                yonghu = wanjia1
            else:
                yonghu = wanjia2
            print("请玩家%s输入" %yonghu)    #用于提示哪个用户输入
            posi = ini()    # 调用输入校正方法,防止用户下到已经下的位置上
            hang = posi[0]  # 将输入校正方法返回的返回值元祖拆开
            lie = posi[1]
    
            if yonghu == wanjia1:
                user1.append([hang, lie])   # 将坐标信息添加到对应用户的列表
                pass
            else:
                user2.append([hang, lie])   # 将坐标信息添加到对应用户的列表
                pass
            # 调用显示方法
            dis(user1, user2)
            # 游戏胜负判断
            if win(user1):
                print("五子连珠")
                print("恭喜玩家%s赢了,游戏结束" % yonghu)
                break   # 跳出循环终止程序
            if win(user2):
                print("五子连珠")
                print("恭喜玩家%s赢了,游戏结束" % yonghu)
                break
            # print(user1)  # 调试的时候用,游戏的时候可以隐藏了
            # print(user2)
    
    # 初始化两个列表,用于存储用户下子的信息
    user1 = []  #用于记录用户1的下子信息
    user2 = []  #用于记录用户2的下子信息
    # 执行主函数
    logic_control()
    '''
    
    

    上面的程序是用的面向过程的思维方式实现的,当然,你也可以使用面向对象的方式编写
    下面是经过封装后的程序代码

    #!/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("	1 2 3 4 5 6 7 8 9 101112131415")
            for i in range(15):
                print(i+1,end="")
                print("	",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()
    
    

    还想看更多python相关练习,宝宝们可以关注小编:秋叶夏风的博客

  • 相关阅读:
    BZOJ_3589_动态树_容斥原理+树链剖分
    吴裕雄--天生自然ORACLE数据库学习笔记:SQL语言基础
    吴裕雄--天生自然ORACLE数据库学习笔记:常用SQL*Plus命令
    吴裕雄--天生自然python数据清洗与数据可视化:MYSQL、MongoDB数据库连接与查询、爬取天猫连衣裙数据保存到MongoDB
    吴裕雄--天生自然PYTHON爬虫:使用Selenium爬取大型电商网站数据
    吴裕雄--天生自然PYTHON爬虫:使用Scrapy抓取股票行情
    吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据(效率优化以及代码容错处理)
    吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据(优化)
    吴裕雄--天生自然神经网络与深度学习实战Python+Keras+TensorFlow:从零开始实现识别手写数字的神经网络
    吴裕雄--天生自然神经网络与深度学习实战Python+Keras+TensorFlow:神经网络的理论基础
  • 原文地址:https://www.cnblogs.com/victorfengming/p/11930993.html
Copyright © 2020-2023  润新知