Python项目开发案例(二)————简易五子棋游戏(控制台版)

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

2.1  需求分析

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

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

2.2  游戏设计

2.2.1  游戏功能结构

Python项目开发案例(二)————简易五子棋游戏(控制台版)_第1张图片

2.2.2  游戏业务流程

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

Python项目开发案例(二)————简易五子棋游戏(控制台版)_第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界面右上角的按钮,即可在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,则表示此类型棋子的玩家为赢家。五子棋棋子查找方向如图所示。

Python项目开发案例(二)————简易五子棋游戏(控制台版)_第3张图片

                                                                  图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  判断棋子坐标

        在实现五子棋(控制台版)游戏时,设置的棋盘为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

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控制台的背景颜色和字体颜色。

你可能感兴趣的:(python,python)