Python项目开发案例(二)————简易五子棋游戏(控制台版)_五子棋游戏业务流程图-程序员宅基地

技术标签: python  

二、简易五子棋游戏(控制台版)

2.1  需求分析

本节开发的五子棋游戏为控制台版,因此要求游戏应该具有以下功能:

  • 可以循环打印棋盘;
  • 可以单机对战;
  • 对战双方有一方胜利时,打印胜利棋盘及赢家;
  • 判断棋子是否超出棋盘范围;
  • 判断指定坐标位置是否已经存在棋子;
  • 界面美观,提示明显。

2.2  游戏设计

2.2.1  游戏功能结构

2.2.2  游戏业务流程

        简易五子棋游戏(控制台版)业务流程如下图所示。

2.3  游戏开发必备

2.3.1  游戏开发环境

本游戏的开发及运行环境具体如下:

  • 操作系统:Windows7、Windows10等;
  • Python版本:Python3.7;
  • 开发工具:Pycharm。

2.3.2  文件夹组织结构

        简易五子棋游戏(控制台版)只有一个gobang.py文件,表示该软件的代码文件,所有实现五子棋逻辑的代码都在该文件中。

2.4  棋盘设置

2.4.1  棋盘设置实现流程

        棋盘设置实现流程及用到的关键技术如图所示。

2.4.2  初始化棋盘

        开发五子棋游戏时,首先需要对棋盘进行初始化,五子棋的棋盘类似于一个二维的列表,因此,本程序中通过一个名称为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('-')

2.4.3  打印棋盘

        用户要在五子棋游戏中下棋,首先需要显示五子棋的棋盘,由于本程序是控制台程序,因此直接在Pycharn中选中gobang,py文件,单击Pycharn界面右上角的\tiny \triangleright按钮,即可在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")

2.4.4  打印胜利棋盘及赢家

        玩五子棋游戏时,如果有一方胜利,则打印最终的棋盘,并输出赢家。

        定义一个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')

2.4.5  为控制台设置不同字体和背景色

2.5  五子棋算法

2.5.1  五子棋算法分析

        五子棋的游戏规则是,以落棋点为中心,向八个方向查找同一类型的棋子,如果相同棋子数大于或等于5,则表示此类型棋子的玩家为赢家。五子棋棋子查找方向如图所示。

                                                                  图1  判断一枚棋子在八个方向上摆出的棋型

2.5.2  判断棋子上、下、左、右方向

        判断棋子的上、下、左、右方向,主要是判断与棋子的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()

2.5.3  判断棋子对角线方向

        判断棋子的对角线方向,主要是判断对角线上与棋子坐标相邻的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()

2.6  下棋设置

2.6.1  下棋设置实现流程

        下棋设置实现流程及用到的关键技术如图所示。

2.6.2  判断当前下棋者

        在五子棋游戏下棋中时,有对战双方,具体体现在控制台中分别以不同的背景色和字体颜色来显示。

        本程序中主要通过一个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; #更换下棋者标记

2.6.3  记录棋子坐标

        在五子棋游戏中实现下棋功能时,主要通过记录棋子的坐标,来确定放在哪个位置,这里首先使用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

2.6.4  判断棋子坐标

        在实现五子棋(控制台版)游戏时,设置的棋盘为10\tiny \times10的,因此输入的坐标一定要在棋盘范围内,如果超过范围,则打印相应的提示信息。

        由于五子棋的棋盘是10\tiny \times10,而棋盘坐标索引是从0开始的,因此只要X坐标或Y坐标不在0~9的范围内,即可说明棋子坐标超出了棋盘的范围,实现代码如下:

#判断坐标是否在棋盘之内
if(x < 0 or x > 9 or y < 0 or y > 9 ):
   print('\033[31m***您输入的坐标有误请重新输入!***\033[0m')
   continue

2.6.5  判断指定坐标位置是否有棋子

         在五子棋(控制台版)游戏中对战时,如果一方已经在一个坐标位置下了棋子,则另一方就不能再该位置下棋子,如果下了,则应该出现相应的提示信息。

        五子棋棋盘每个坐标位置的默认值为“-”,而下棋之后,值会变为“*”或者“o”,因此,要判断指定坐标位置是否有棋子,只需要判断其值是否为“-”即可,如果为“-”,则可以下棋,否则,打印相应的提示信息,代码如下:

#判断坐标上是否有棋子
if(checkerboard[x][y] == '-')
   if(flagNum == 1):
      checkerboard[x][y] == '*'
   else:
      checkerboard[x][y] == 'o'
else:
   print('\033[31m******您输入位置已经有其他棋子,请重新输入!\033[0m')
   continue

2.7  小结

        本章主要使用Python语言开发了一个简易五子棋游戏(控制台版)项目,项目的核心是五子棋的实现算法;另外,五子棋游戏在控制台中与用户进行交互,如大家所知,控制台中通常都是以黑色背景和白色字体显示数据的,如何在控制台中拥有良好的用户体验是本项目的一个难点,本项目通过在print()打印函数中设置背景颜色、字体颜色来解决这一难点。通过本章的学习,读者应该熟练掌握五子棋游戏的实现算法,并熟悉如何改变PyCharn控制台的背景颜色和字体颜色。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38452841/article/details/108613734

智能推荐

JavaScript,大有前景的编程语言_javascript是最有前景的语言-程序员宅基地

文章浏览阅读1.2k次。原文:JavaScript-A First-Class Language At Last 作者:Tom Goldenberg 译者:LeviDing 声明:转载请联系本人,并注明出处。2003年,保罗·格雷厄姆(Paul Graham)在他的一篇文章中提到,他的公司决定使用 Lisp (一门编程语言)。在文章中他将 Lisp 描绘成计算机语言界的法语,它独特、深邃,能够表达出难以_javascript是最有前景的语言

【MySQL】mysql The server time zone value “乱码” 错误_the server time zone value 乱码-程序员宅基地

文章浏览阅读7.8k次。稚语希听– 你忘了想起,我忘了忘记…mysql8以上版本时区问题:The server time zone value乱码XXXX异常类似:The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuratio_the server time zone value 乱码

【WebApi】————.net WebApi开发(一)_webapi .net-程序员宅基地

文章浏览阅读8.5k次。【1】.部署环境.net4及以上版本。【2】.vs2010 开发需单独安装vs2010 sp1和mvc4mvc4:http://www.asp.net/mvc/mvc4【3】.开发1.新建项目选择ASP.net MVC 4 Web应用程序2.选择Web API 3.在新建立的项目里面有已经生成的webapi模版其中App_Start文件夹下WebApiCo..._webapi .net

几招教你阻止百度搜索自动跳转百度APP(其他网站也适用)!_百度自动跳转app怎么解决-程序员宅基地

文章浏览阅读10w+次,点赞15次,收藏33次。最近阿虚看到个消息说「百度」发布了新政策,禁止网站通过搜索引擎打开后折叠内容强迫下载APP客户端听起来似乎是百度难得良心一回?但实际上该政策仅限于手机百度APP内如果你是通过浏览器用百度搜索则与新政策完全没关系正好前不久不少粉丝来问过我这样一个问题:怎么屏蔽手机浏览器上的「跳转某某APP打开查看」提示那今天阿虚就来教一下怎么解决吧,毕竟这东西的确是有点烦人…屏蔽「跳转某某APP打开查看」这个问题我细看了下,还得分俩类:文章只能显示部分,然后提示你需要安装APP才能查看的,这种应该是大_百度自动跳转app怎么解决

PHP快速入门12-异常处理,自定义异常、抛出异常、断言异常等示例_php 抛出异常-程序员宅基地

文章浏览阅读843次。PHP的异常处理机制可以帮助我们在程序运行时遇到错误或异常情况时,及时发出警告并停止程序继续运行。下面是10个例子,分别展示了PHP异常处理的不同用法。_php 抛出异常

linux 清空docker容器日志_linux清理docker容器log-程序员宅基地

文章浏览阅读221次。【代码】linux 清空docker容器日志。_linux清理docker容器log

随便推点

The 2022 ICPC Asia Regionals Online Contest (I)-D题题解(DFS暴搜+剪枝+打表去重+二分)_杭州2022icpc题解-程序员宅基地

文章浏览阅读1.4k次,点赞3次,收藏3次。这次比赛很好,题也很好,就是下午人不太清醒,没做出来太菜了,回去才写出来的。_杭州2022icpc题解

【二中OJ】1100 【p-NOIP-2004-1】不高兴的津津-程序员宅基地

文章浏览阅读41次。由于网站设计原因,无法直接跳转题目,需要自己点击【所有试题】——【试题ID】——输入本题题号并点击【开始查询】

【halcon深度学习】dev_display_dl_data 移植到C# 上篇_halcon c# dev_display_dl_data-程序员宅基地

文章浏览阅读403次。在研究halcon深度学习的时候,会发现halcon的例程里面用到了大量的二次封装库函数。这些库函数内部也是由基础的算子组成。我们在halcon的开发环境里面用的很爽,但是一旦要在C#中使用,就会报错。一开始,我想避开这个移植过程,直接使用halcon引擎(HDevEngine )的方式。其实, halcon引擎(HDevEngine ) 不提供内部显示运算符的实现,而是提供类HDevOperatorImplCpp,其中包含所有您可以自己实现的运算符的空虚拟方法。_halcon c# dev_display_dl_data

jacob 报错 Can't co-create object-程序员宅基地

文章浏览阅读1.8k次。问题:开始时一切正常,后来什么都没该,出现Can't co-create object报错,即是创建不了ActiveXComponent wd=new ActiveXComponent("Word.Application");偶尔发现任务管理器中word进程居然达到10个,而我没有打开word就关闭一个进程再运行又可以打印了,进程也多一条,然后再一次运行系统执行打印又报错了。这说明..._jacob can't co-create object

爬虫入门:了解Web爬虫的基本知识-程序员宅基地

文章浏览阅读1.1k次。Web爬虫是一种自动化程序,可以模拟人类浏览器的操作,从互联网上抓取数据。爬虫在很多领域中都发挥重要的作用,如搜索引擎、数据分析和监测等。本文将介绍一些关于爬虫的基本知识点,以帮助初学者入门。本文介绍了爬虫的基本知识点,包括原理、常用库和框架、道德规范、挑战以及学习资源。通过深入学习和实践,你将能够掌握更多关于爬虫的技术,开发出高效和可靠的爬虫应用程序。希望这些知识对你的爬虫学习之旅有所帮助!

cuckoo sandbox之windows恶意文件分析环境搭建_win7安装 cuckoo sandbox-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。前言 接触cuckoo sandbox沙盒有一段时间了,对host端的处理流程和windows平台的分析都具有了一定的了解。_win7安装 cuckoo sandbox