微信小程序> python之用循环实现五子棋小程序

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

浏览量:2926 时间: 来源:秋叶夏风

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

游戏规则

五子棋的规则如下:

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

实现过程

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

  • python中的流程控制
  • python中列表操作

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

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

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

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

代码实现

具体代码如下

#!/usr/bin/env python# -*- coding:utf-8 -*-# coding by 秋叶夏风# 定义显示方法def dis(user1,user2):    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="")            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 osclass 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
            
            

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎