技术标签: python
本节开发的五子棋游戏为控制台版,因此要求游戏应该具有以下功能:
简易五子棋游戏(控制台版)业务流程如下图所示。
本游戏的开发及运行环境具体如下:
简易五子棋游戏(控制台版)只有一个gobang.py文件,表示该软件的代码文件,所有实现五子棋逻辑的代码都在该文件中。
棋盘设置实现流程及用到的关键技术如图所示。
开发五子棋游戏时,首先需要对棋盘进行初始化,五子棋的棋盘类似于一个二维的列表,因此,本程序中通过一个名称为checkboard的二维列表,来存储五子棋的棋盘,代码如下:
finish = False #游戏是否结束
flagNum = 1 #当前下棋者标记
flagch = 'a' #当前下棋者棋子
x = 0 #当前棋子的横坐标
y = 0 #当前棋子的纵坐标
print('\033[1;37;41m------------简易五子棋游戏(控制台版)---------\033[0m')
#棋盘初始化
checkerboard=[]
for i in range(10):
checkerboard.append([])
for j in range(10):
checkerboard[i].append('-')
用户要在五子棋游戏中下棋,首先需要显示五子棋的棋盘,由于本程序是控制台程序,因此直接在Pycharn中选中gobang,py文件,单击Pycharn界面右上角的按钮,即可在Pycharn的控制台中显示棋盘。
2.4.2小节已经初始化了五子棋的棋盘,接下来的工作只需要将其打印输出即可,这里使用一个嵌套的for循环,遍历存储五子棋棋盘的二维列表,然后将遍历到的元素的一次输出即可。代码如下:
#打印棋盘
print("\033[1;30;46m-----------------------")
print(" 1 2 3 4 5 6 7 8 9 10") #输出行标号
for i in range(len(checkerboard)):
print(chr(i+ord('A'))+"",end=''); #输出列标号
for j in range(len(checkerboard[i])):
print(checkerboard[i][j]+"",end='')
print() #换行
print("--------------------------------\033[0m")
玩五子棋游戏时,如果有一方胜利,则打印最终的棋盘,并输出赢家。
定义一个msg()函数,用来输出最后胜利的棋盘及赢家,该函数中,主要是使用嵌套的for循环输出最终胜利的五子棋棋盘,而输出赢家则通过判断变量flagNum的值来实现。msg()函数实现代码如下:
def mag():
#输出最后胜利的棋盘
print("\033[1;37;41m--------------------------")
print(" 1 2 3 4 5 6 7 8 9 10")
for i in range(len(checkerboard)):
print(chr(i+ord('A'))+"",end='')
for j in range(len(checkerboard[i])):
print(checkerboard[i][j]+"",end='')
print()
print("--------------------------\033[0m")
#输出赢家
if(flagNum == 1):
print('\033[32m*棋胜利!***\033[0m')
else:
print('\033[32mo棋胜利!***\033[0m')
五子棋的游戏规则是,以落棋点为中心,向八个方向查找同一类型的棋子,如果相同棋子数大于或等于5,则表示此类型棋子的玩家为赢家。五子棋棋子查找方向如图所示。
图1 判断一枚棋子在八个方向上摆出的棋型
判断棋子的上、下、左、右方向,主要是判断与棋子的X坐标或Y坐标相邻的4个棋子是不是同一个颜色的棋子,如果是,则将finish标识设置为True,即结束循环下棋,然后调用msg()函数打印胜利棋盘及赢家。代码如下:
#判断棋子左侧
if(y - 4 >= 0):
if(checkerboard[x][y-1] == flagch
and checkerboard[x][y-2] == flagch
and checkerboard[x][y-3] == flagch
and checkerboard[x][y-4] == flagch):
finish = True
msg()
#判断棋子右侧
if(y + 4 <= 9):
if(checkerboard[x][y+1] == flagch
and checkerboard[x][y+2] == flagch
and checkerboard[x][y+3] == flagch
and checkerboard[x][y+4] == flagch):
finish = True
msg()
#判断棋子上方
if(x - 4 >= 0):
if(checkerboard[x-1][y] == flagch
and checkerboard[x-2][y] == flagch
and checkerboard[x-3][y] == flagch
and checkerboard[x-4][y] == flagch):
finish = True
msg()
#判断棋子下方
if(x + 4 <= 9):
if(checkerboard[x+1][y] == flagch
and checkerboard[x+2][y] == flagch
and checkerboard[x+3][y] == flagch
and checkerboard[x+4][y] == flagch):
finish = True
msg()
判断棋子的对角线方向,主要是判断对角线上与棋子坐标相邻的4个棋子是不是同一个颜色棋子,如果是,则将finish标识设置为True,即结束循环下棋,然后调用msg()函数打印胜利棋盘及赢家。代码如下:
#判断棋子右上方向
if(x - 4 >= 0 and y-4 >=0):
if(checkerboard[x-1][y-1] == flagch
and checkerboard[x-2][y-2] == flagch
and checkerboard[x-3][y-3] == flagch
and checkerboard[x-4][y-4] == flagch):
finish = True
msg()
#判断棋子右下方向
if(x + 4 <= 9 and y-4 >=0):
if(checkerboard[x+1][y-1] == flagch
and checkerboard[x+2][y-2] == flagch
and checkerboard[x+3][y-3] == flagch
and checkerboard[x+4][y-4] == flagch):
finish = True
msg()
#判断棋子左上方向
if(x - 4 >= 0 and y + 4 <= 9):
if(checkerboard[x-1][y+1] == flagch
and checkerboard[x-2][y+2] == flagch
and checkerboard[x-3][y+3] == flagch
and checkerboard[x-4][y+4] == flagch):
finish = True
msg()
#判断棋子左上方向
if(x + 4 <= 9 and y + 4 <= 9):
if(checkerboard[x+1][y+1] == flagch
and checkerboard[x+2][y+2] == flagch
and checkerboard[x+3][y+3] == flagch
and checkerboard[x+4][y+4] == flagch):
finish = True
msg()
下棋设置实现流程及用到的关键技术如图所示。
在五子棋游戏下棋中时,有对战双方,具体体现在控制台中分别以不同的背景色和字体颜色来显示。
本程序中主要通过一个flagNum变量来判断对战双方的身份,如果该变量为1,则下棋方为“*”,否则,下棋方为“o”,实现代码如下:
#判断当前下棋者
if flagNum == 1:
flagch = '*'
print('\033[1;37;45m请*输入棋子坐标(例如A1):\033[0m',end='') # 粉字黑底
else:
flagch = '*'
print('\033[1;37;42m请o输入棋子坐标(例如J5):\033[0m',end='') # 黑字绿底
另外,在一方下完棋之后,需要改变flagNum变量的值,以便更换下棋者,代码如下:
flagNum *= -1; #更换下棋者标记
在五子棋游戏中实现下棋功能时,主要通过记录棋子的坐标,来确定放在哪个位置,这里首先使用input()函数记录输入的棋子坐标,坐标形式为“大写字母+1到10的数字”(例如A1,A为横坐标,1为纵坐标),然后需要将坐标转换为X、Y值,将首字母转换X坐标,需要使用ord()函数获取字母对应的ASCII码值,然后减去A字母的ASCII码值;而将第2个数字转换为Y坐标,只需要减去1即可,因为索引从0开始。实现记录棋子坐标的代码如下:
#输入棋子坐标
str = input()
ch = str[0] #获取第一个字符的大写形式
x = ord(ch) - 65
y = int(str[1]) - 1
在实现五子棋(控制台版)游戏时,设置的棋盘为1010的,因此输入的坐标一定要在棋盘范围内,如果超过范围,则打印相应的提示信息。
由于五子棋的棋盘是1010,而棋盘坐标索引是从0开始的,因此只要X坐标或Y坐标不在0~9的范围内,即可说明棋子坐标超出了棋盘的范围,实现代码如下:
#判断坐标是否在棋盘之内
if(x < 0 or x > 9 or y < 0 or y > 9 ):
print('\033[31m***您输入的坐标有误请重新输入!***\033[0m')
continue
在五子棋(控制台版)游戏中对战时,如果一方已经在一个坐标位置下了棋子,则另一方就不能再该位置下棋子,如果下了,则应该出现相应的提示信息。
五子棋棋盘每个坐标位置的默认值为“-”,而下棋之后,值会变为“*”或者“o”,因此,要判断指定坐标位置是否有棋子,只需要判断其值是否为“-”即可,如果为“-”,则可以下棋,否则,打印相应的提示信息,代码如下:
#判断坐标上是否有棋子
if(checkerboard[x][y] == '-')
if(flagNum == 1):
checkerboard[x][y] == '*'
else:
checkerboard[x][y] == 'o'
else:
print('\033[31m******您输入位置已经有其他棋子,请重新输入!\033[0m')
continue
本章主要使用Python语言开发了一个简易五子棋游戏(控制台版)项目,项目的核心是五子棋的实现算法;另外,五子棋游戏在控制台中与用户进行交互,如大家所知,控制台中通常都是以黑色背景和白色字体显示数据的,如何在控制台中拥有良好的用户体验是本项目的一个难点,本项目通过在print()打印函数中设置背景颜色、字体颜色来解决这一难点。通过本章的学习,读者应该熟练掌握五子棋游戏的实现算法,并熟悉如何改变PyCharn控制台的背景颜色和字体颜色。
文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文
文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作 导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释: cwy_init/init_123..._达梦数据库导入导出
文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js
文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6
文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输
文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...
文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure
文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割
文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答
文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。
文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入
文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf