3 五子棋游戏(控制台版)二维列表+嵌套for循环+ 多条件if判断实现

3.1 需求分析
  • 可以循环打印棋盘

  • 可以单机对战

  • 对战双方有一方胜利时,打印胜利棋盘及赢家

  • 判断棋子是否超出棋盘范围

  • 判断指定坐标位置是否已经存在棋子

  • 界面美观,提示明显

3.2 游戏设计
3.2.1 游戏功能结构

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

  • 棋盘设置

    • 初始化棋盘

    • 打印棋盘

    • 打印胜利棋盘及赢家

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

  • 五子棋算法

    • 判断棋子上,下,左,右方

    • 判断棋子对角线方向

  • 下棋设置

    • 判断当前下棋者

    • 记录棋子坐标

    • 判断棋子坐标

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

3.2.2 游戏业务流程

开始 --> 初始化棋盘 --> 绘制棋盘 --> 输入棋子坐标 --> 判断坐标 --N--> 输入棋子坐标

--Y -- > 输入棋子到棋盘--> 是否五子连珠 -->Y --> 结束

-->N --> 另一玩家

3.2.3 游戏预览
3.3 开发必备
3.3.1 游戏开发环境

操作系统:win7, win10

python版本:3.7

开发工具:pycharm

3.3.2 文件夹组织架构

只有一个gobang.py文件

3.4 棋盘设置
3.4.1 棋盘设置实现流程

开始 --> 初始化棋盘 【应用:嵌套for循环和列表】 --> 打印棋盘 【应用:range()函数和print()函数】 --> 打印胜利棋盘和赢家【应用:print()函数和int标识变量】 ----> 设置字体和颜色【应用: \033[显示方式:前景色;背景色]】 ---> 结束

3.4.2 初始化棋盘

首先初始化棋盘,类似一个二维列表,因此通过一个名称为checkerboard的二维列表存储五子棋的棋盘,代码如下

finish = False  # 游戏是否结束
flagNum = 1     # 当前下棋者标记
flagch = '*'    # 当前下棋者棋子
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('-')

3.4.3 打印棋盘
# 打印棋盘
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')

3.4.4 打印胜利及棋盘方赢家

定义一个msg()函数,用来输出最后胜利的棋盘及赢家,该函数中,主要是使用嵌套的for循环输出最终胜利的五子棋棋盘,而输出赢家则通过判断变量flagNum的值来实现,msg()函数实现代码如下

def msg():
    # 输出最后胜利的棋盘
    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')
3.4.5 为控制台设置不同字体及背景色

语法:

\033[显示方式;前景色;背景色m

第一个参数指定显示方式的值,控制台中的显示方式值及说明如下表

控制台中的显示方式值及说明

显示方式说明显示方式说明
0终端默认设置1高亮显示
4使用下划线5闪烁
7反白显示8不可见

第2个和第3个参数分别用来设置前景色和背景色的色值,Pycharm控制台中的前景色,背景色对应色值如表所示

Pycharm控制台中的前景色、背景色对应色值

颜色前景色背景色
黑色3040
红色3141
绿色3242
黄色3343
蓝色3444
紫红色3545
青蓝色3646
白色3747

例如,要设置某一区域显示不同的颜色,使用下面代码即可

print('\033[1;30;46m-------------')
print(' 1 2 3 4 5 6 7 8 9 10')
# 省略其他代码
print('-------------------------------\033[0m')

而如果只设置一行显示不同的颜色,则使用下面代码

print('\033[1;37;41m------简易五子棋游戏(控制台版)--------------\033[0m')
3.5 算法
3.5.1 五子棋算法分析

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

3.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()

3.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()

3.6 下棋设置
3.6.1 实现流程

开始 --> 判断当前下棋者(应用:int标识变量) --> 记录棋子坐标(应用:input()函数和 ord()函数) --> 判断棋子坐标(应用:if中应用or判断多条件) --> 判断指定坐标是否有棋子(应用:获取二维列表的值) --> 结束

3.6.2 判断当前下棋者

对战双方:控制台中用不同背景色和字体颜色显示

flagNum:判断对战双方身份,如果变量为1,下棋方为*,否则为‘o'

# 判断当前下棋者
if flagNum == 1:
	flagch = '*'
    print('\033[1;37;45m请*输入棋子坐标(例如A1): \033[0m', end = ' ')	 # 粉字黑底
else:
	flagch = 'o'
	print('\033[1;30;42m请o输入棋子坐标(例如J5):\033[0m', end = ' ')		# 黑字绿底
    
# 在一方下完棋之后,需要改变flagNum变量的值,以便更换下棋者
flagNum *= -1;		# 更换下棋者标记
3.6.3 记录棋子坐标

input()函数记录输入的棋子坐标,坐标形式为”大写字母+1~10的数字“,如A1,A为横坐标,1为纵坐标

将坐标转换为X/Y值

首字母转换X坐标,需要使用ord()函数获取字母对应的ASCII值,然后减去A字母的ASCII值

第二个数字转换为Y坐标,-1即可,索引从0开始

# 输入棋子坐标
str = input()
ch = str[0]			# 获取第一个字符的大写形式
x = ord(ch) - 65
y = int(str[1]) - 1

3.6.4 判断棋子坐标

棋盘为10*10,输入的坐标要在棋盘范围内,否则超出范围,打印相应的提示信息,只要x或y不在0-9,即可说明棋子坐标超出了棋盘范围

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

3.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

3.7 小结

在print()打印函数中设置背景颜色,字体颜色

掌握算法实现并熟悉如何改变pycharm控制台的背景颜色与字体颜色

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值