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

在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="")passelif [i+1,j+1] in user2:print("e ", end="")pass# else:#     print("  ",end="")else:print("+ ",end="")passprint()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,lieelse:print("你输入的数值不再棋盘范围内,重新输入")passelse: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 Truepass# 横着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 Truepass# 斜着\这么斜的情况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 Truepass# 斜着/这么斜的情况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 Truepasspassreturn Falsepass# 定义逻辑控制方法
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 = wanjia1else:yonghu = wanjia2print("请玩家%s输入" %yonghu)    #用于提示哪个用户输入posi = ini()    # 调用输入校正方法,防止用户下到已经下的位置上hang = posi[0]  # 将输入校正方法返回的返回值元祖拆开lie = posi[1]if yonghu == wanjia1:user1.append([hang, lie])   # 将坐标信息添加到对应用户的列表passelse: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="")passelif [i+1,j+1] in user2:print("e ", end="")passelse:print("+ ",end="")passprint()passdef 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,lieelse:print("你输入的数值不再棋盘范围内,重新输入")passelse:print("你这输入的也不是数字啊,逗我玩呢啊")print("赶紧的,重新输入")passdef 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 Truepass# 横着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 Truepass# 斜着\这么斜的情况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 Truepass# 斜着/这么斜的情况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 Truepasspassreturn Falsepassdef main_logic(self):'''主要执行逻辑包括循环调用输入方法,显示方法,判断验证方法更新用户列表的数据:return: '''i = 0  # 用于记录下子的次数,若超出这个范围,即下满棋盘,则和棋while i <= 225:  # 死循环 输入 其实用不着死循环,一共就那么多下i += 1  # 累加if i % 2:  # 判断出当前的用户yonghu = self.player1else:yonghu = self.player2print("请玩家%s输入" % yonghu)  # 用于提示哪个用户输入posi = self.input_check()  # 调用输入校正方法,防止用户下到已经下的位置上hang = posi[0]  # 将输入校正方法返回的返回值元祖拆开lie = posi[1]if yonghu == self.player1:self.user1.append([hang, lie])  # 将坐标信息添加到对应用户的列表passelse: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相关练习,宝宝们可以关注小编:秋叶夏风的博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Principle of Computing (Python)学习笔记(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/principlescomputing-001/wiki/view?pagetrees 1.2 CODE无parent域的树 http://www.codeskulptor.org/#poc_tree.py class Tree:"""Recursive definition for tree…

C#线程篇---Task(任务)和线程池不得不说的秘密

我们要知道的是&#xff0c;QueueUserWorkItem这个技术存在许多限制。其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成&#xff0c;也没有一个机制在操作完成是获得一个返回值&#xff0c;这些问题使得我们都不敢启用这个技术。 Microsoft为了克服这些限制&…

关于编译FFMPEG的初级教程

关于编译FFMPEG的初级教程1.首先我们要下载相关工具&#xff0c;这里不多说&#xff0c;大家按照我的地址去下载文件就好了 MINGW下载地址&#xff1a;http://prdownloads.sourceforge.net/mingw/MinGW-3.1.0-1.exe?download 然后在下载MSYS &#xff1a;http://prdownloads.…

电子科学与技术相关索引汇总

电子科学与技术相关索引汇总 关于安装deepinwindow10双系统有时没有声音的问题关于deepin系统安装design compiler的问题解答基于51单片机的交通灯控制设计基于物联网的智能垃圾桶设计基于FPGA 的8b10b编解码电路前端电路设计金属磁记忆传感器封装集成电路版图与工艺课程设计之…

【百度面试】闸机测试场景

面试被问到这一题思路想法&#xff1a; 自己找了相关内容充实自我。内容分享如下&#xff1a; 随着人脸识别技术的成熟&#xff0c;闸机行业大量应用人脸识别算法&#xff0c;只因现今的人脸识别算法也已经能够保证识别率、识别速度、误识率和拒识率等各项指标的优异性&#x…

前后端分离项目如何部署_前后端分离项目,如何解决跨域问题?

跨域资源共享(CORS)是前后端分离项目很常见的问题&#xff0c;本文主要介绍当SpringBoot应用整合SpringSecurity以后如何解决该问题。01 什么是跨域问题&#xff1f;CORS全称Cross-Origin Resource Sharing&#xff0c;意为跨域资源共享。当一个资源去访问另一个不同域名或者同…

使用模板引擎artTemplate的几个问题总结

一、Template not found 有的时候模板写的并没有问题&#xff0c;可就是找不到。这时候可能是<script>加载顺序问题&#xff0c;模板渲染在模板加载完成之前先执行了&#xff0c;调整<script>的顺序。 二、模板中将字符串转化成数字 利用html中的表单来转化&#x…

Android报“android.content.res.Resources$NotFoundException: String resource ID #0x2”错误

Android报“android.content.res.Resources$NotFoundException: String resource ID #0x2”错误 当调用setText()方法时如果传入int型是不会被当成内容而是resourceID来使用&#xff01; 所以报错&#xff01; 解决方法&#xff1a;TextView.setText("" arg) 转为St…

时间戳问题汇总

大家好 我刚接触流媒体不久&#xff0c; 现在遇到一个非常奇怪的问题&#xff0c;向各位大侠请假&#xff0c;请你们指点。 问题是这样的 用一个 VLC(流媒体客户端) 去请求流媒体服务器上的数据&#xff0c; 但是获得的数据播放速度明显快于1倍速&#xff0c;大概是 timest…

如何实现 C/C++ 与 Python 的通信?

如何实现 C/C 与 Python 的通信&#xff1f; 想在 C 中用 Python 进行数值计算&#xff0c;Python 需要访问 C 的变量并计算后返回数值。有什么好办法呢&#xff1f; 参考https://www.zhihu.com/question/23003213

前端相关索引汇总

前端相关索引汇总 HTML相关 HTML概述和基本结构HTML中Head头HTML标题 HTML段落,换行,字符实体HTML块,含样式的标签HTML中的图片HTML中的链接HTML中的列表HTML中的表格HTML中的表单 CSS相关 Css基本语法及页面引用Css中的选择器Css颜色和文本字体CSS边框,背景,边距,溢出CSS中的…

nginx反向代理配置 多个_实例分享:Nginx学习之反向代理WebSocket配置实例

写在开始去年&#xff0c;做过一款竞赛打分的APP。具体需求&#xff0c;同组教师之间可以相互通信&#xff0c;及时通知同组人员&#xff0c;其他组员做了那些操作(当然&#xff0c;这只是针对特定操作)。实现方案采用目前比较成熟的WebSocket技术&#xff0c;WebSocket协议为创…

性能测试总结(一)---基础理论篇

随着软件行业的快速发展&#xff0c;现代的软件系统越来越复杂&#xff0c;功能越来越多&#xff0c;测试人员除了需要保证基本的功能测试质量&#xff0c;性能也随越来越受到人们的关注。但是一提到性能测试&#xff0c;很多人就直接连想到Loadrunner。认为LR就等于性能测试&a…

Makefile 7——自动生成依赖关系 三颗星

后面会介绍gcc获得源文件依赖的方法&#xff0c;gcc这个功能就是为make而存在的。我们采用gcc的-MM选项结合sed命令。使用sed进行替换的目的是为了在目标名前加上“objs/”前缀。gcc的-E选项&#xff0c;预处理。在生成依赖关系时&#xff0c;其实并不需要gcc编译源文件&#x…

JavaScript使用场景

JavaScript嵌入页面的方式 1、行间事件&#xff08;主要用于事件&#xff09; <input type"button" name"" onclick"alert(ok&#xff01;);">2、页面script标签嵌入 <script type"text/javascript">var a 你好&#…

集合添加元素python_Python 集合(Set)

Python 集合&#xff08;Set&#xff09; 在本文中&#xff0c;您将学习关于Python集的所有内容;如何创建它们、添加或删除其中的元素&#xff0c;以及在Python中对集合执行的所有操作。 Python中的集合是什么&#xff1f; 集合是项目的无序集合。每个元素都是唯一的&#xff0…

一个极其高效的虚拟机内存冗余消除机制:UKSM

Linux内核机制KSM(Kernel Samepage Merging)能合并KVM虚拟机之间相同内存的页面&#xff0c;被CentOS, RHEL之类的服务器内核广泛采用&#xff0c;但是其速度很慢。UKSM(Ultra KSM)是国人在此基础上的极大改进。通过使用了更高级的算法&#xff0c;UKSM的新特性包括&#xff1a…

【分享】 codeReview 的重要性

研发都知道代码 Review 的重要性&#xff0c;在代码 Review 也越来越受大家重视&#xff0c;我参与了大量的代码 Review&#xff0c;明显地感受到有效的代码 Review 不但能提高代码的质量&#xff0c;更能促进团队沟通协作&#xff0c;建立更高的工程质量标准&#xff0c;无论对…

FFMPEG功能

FFMPEG功能1&#xff0e; 视频音频格式转换Ffmpeg能使用任何支持的格式和协议作为输入&#xff1a;*比如你可以输入YUV文件&#xff1a;ffmpeg -i /tmp/test%d.Y /tmp/out.mpg 它将要使用如下文件&#xff1a; /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,/tmp/test1.Y, /tmp…