Python实现五子棋小游戏 您所在的位置:网站首页 五子棋五子棋就是五子棋五子棋不是我 Python实现五子棋小游戏

Python实现五子棋小游戏

2023-05-19 20:15| 来源: 网络整理| 查看: 265

用较为简单的Python知识(包含循环 判断 数组)实现五子棋小游戏

如有不足之处还望大家多多指正改进 共同学习进步

首先定义标准五子棋棋盘和两位玩家

# Define Board board = [[" ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O"], ["15", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], ["14", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], ["13", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], ["12", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], ["11", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], ["10", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], [" 9", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], [" 8", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], [" 7", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], [" 6", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], [" 5", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], [" 4", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], [" 3", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], [" 2", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], [" 1", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"]] # Define Player player1 = 1 player2 = 2

其次考虑棋盘的输出,用较为好看的方式展现出每次下棋后棋盘的变化

# Show Board def Show_Board(board): for i in board: print() for k in i: print(k, end=" ") print()

接下来就要考虑每次下棋参数的传入了 传入选手编号参数实现区分出是哪位选手下的棋 依次输入所下棋子的行 列 然后传出下棋所在坐标方便后续对输赢结果判断 当然要对传入数据做稍微调整以符合运算

# Input Argument def Input_Argument(player): print("轮到", player, "号选手", sep="") while True: try: line = int(input("请输入要下棋子的行:")) column = int(ord(input("请输入要下棋子的列:"))) except: print("请输入合法数值!") continue try: if board[16 - line][column - 64] != "#": board[99][99] = "error" if player == 1: board[16 - line][column - 64] = "X" if player == 2: board[16 - line][column - 64] = "O" break except: print("请输入合法数值!") Show_Board(board) return (16 - line), (column - 64)

由于下棋是选手交替进行的 因此我们定义一个交替函数来满足选手的轮流进行下棋 这一步比较简单 根据自己的参数需求进行定义就好了

# Swap Player def Swap_Player(player): if player == 1: return 2 if player == 2: return 1

最庞大的一步就是对不同选手输赢的判断了 我们传入选手号 当前输入的行 列作为参数 每下一步就进行一次判断 对所下位置的横向 纵向 左斜 右斜进行判断 一但连成大于五个的同类旗子 则判断出该选手获胜 因此对棋子的判断有大量重复的代码(若有更简洁的方法还望指出) 其实内容还是很好理解的

# Judging Victory or Defeat def Judging_Outcome(player, line, column): sta =0 if player == 1: # Horizontal point = 0 step = 0 try: while board[line - step][column] == "X": point += 1 step += 1 except: sta += 1 step = 1 try: while board[line + step][column] == "X": point += 1 step += 1 except: sta += 1 if point >= 5: return 0 # Vertical point = 0 step = 0 try: while board[line][column - step] == "X": point += 1 step += 1 except: sta += 1 step = 1 try: while board[line][column + step] == "X": point += 1 step += 1 except: sta += 1 if point >= 5: return 0 # Left Slant point = 0 step = 0 try: while board[line - step][column - step] == "X": point += 1 step += 1 except: sta += 1 step = 1 try: while board[line + step][column + step] == "X": point += 1 step += 1 except: sta += 1 if point >= 5: return 0 # Right Slant point = 0 step = 0 try: while board[line - step][column + step] == "X": point += 1 step += 1 except: sta += 1 step = 1 try: while board[line + step][column - step] == "X": point += 1 step += 1 except: sta += 1 if point >= 5: return 0 if player == 2: # Horizontal point = 0 step = 0 try: while board[line - step][column] == "O": point += 1 step += 1 except: sta += 1 step = 1 try: while board[line + step][column] == "O": point += 1 step += 1 except: sta += 1 if point >= 5: return 0 # Vertical point = 0 step = 0 try: while board[line][column - step] == "O": point += 1 step += 1 except: sta += 1 step = 1 try: while board[line][column + step] == "O": point += 1 step += 1 except: sta += 1 if point >= 5: return 0 # Left Slant point = 0 step = 0 try: while board[line - step][column - step] == "O": point += 1 step += 1 except: sta += 1 step = 1 try: while board[line + step][column + step] == "O": point += 1 step += 1 except: sta += 1 if point >= 5: return 0 # Right Slant point = 0 step = 0 try: while board[line - step][column + step] == "O": point += 1 step += 1 except: sta += 1 step = 1 try: while board[line + step][column - step] == "O": point += 1 step += 1 except: sta += 1 if point >= 5: return 0 return 1

最后则是用主函数进行封装 定义第一位下棋的选手 不同函数间进行参数传递 并判断获胜的信号 最后输出获胜选手

if __name__ == "__main__": Show_Board(board) player=player2 while True: player = Swap_Player(player) line, column = Input_Argument(player) if Judging_Outcome(player, line, column) == 1: continue if Judging_Outcome(player, line, column) == 0: print(player, "号选手获胜!", sep="") break

目前作者所知道的不足之处 倘若遇到死棋没有判断条件进行棋局结束 判断所有棋子下满进行结束的判断还是比较简单的 只需要遍历所有位置没有“#”符号即可结束程序 但是死棋判断实现的话还是比较有难度 还有就是可以用上对象定义 队选手进行定义对象 优化操作

把所有代码复制一起即可运行

还望大佬多多提出宝贵建议



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有