python实现三子棋游戏
作者:sakura_ll 发布时间:2021-11-20 04:10:37
三子棋的python实现代码,供大家参考,具体内容如下
一、基本流程
三子棋游戏实现逻辑如下:
1、创建初始化3*3棋盘;
2、玩家执U子,先进行落子;
3、胜负判定【胜、负、和棋】,若胜负未分,则继续如下
4、电脑执T子,进行落子;
5、胜负判定,若胜负未分,则从步骤2继续执行
二、基本步骤
1、菜单界面
选择1是开始游戏,选择2是退出游戏
def menu():
print('-'*20)
print('1---------------begin')
print('2---------------exit')
print('please select begin or exit')
print('-' * 20)
while(1):
select = input('please input:')
if select == '1':
begin_games()
pass
elif select == '2':
print('exit the game')
break
#pass
pass
2、初始化棋盘、打印棋盘
三子棋棋盘是3*3的方阵,在python中用列表来进行存储。
chess_board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
那么如何将这个存储列表打印出来,成为棋盘呢?
def init_cheaa_board(chess_board): #先对列表进行初始化
for i in range(MAX_ROW):
for j in range(MAX_COL):
chess_board[i][j] = ' '
pass
def print_chess_board(chess_board): #棋盘打印
print('*'+'-'*7+'*'+'-'*7+'*'+'-'*7+'*')
for i in range(MAX_ROW):
print('|'+' '*3+chess_board[i][0]+' '*3+'|'+' '*3+chess_board[i][1]+' '*3+'|'+' '*3+chess_board[i][2]+' '*3+'|')
print('*' + '-' * 7 + '*' + '-' * 7 + '*' + '-' * 7 + '*')
pass
pass
3、玩家落子
玩家在3*3的棋盘中选择落子的横纵坐标。坐标点需要满足:1、该点在棋盘内;2、该点还未置子。
def player_first(chess_board):
while(1):
x = int(input('please input x:'))
y = int(input('please input y:'))
if(chess_board[x][y] != ' '): #若已被置子,则重新选择坐标
print('This position is already occupied!')
pass
elif(x >= MAX_ROW or y >= MAX_COL or x < 0 or y < 0): #所选坐标超出棋盘范围,重新选择坐标
print('This position is beyond the chessboard!')
pass
else: #若坐标可以落子,则将该坐标置为玩家的棋子U
chess_board[x][y] = 'U'
print_chess_board(chess_board)
#return x,y
break
pass
pass
4、电脑落子
电脑落子算法:
4.1、先检查一下棋盘,看电脑已占有棋面中是否已经有两子连成、即将成棋的状态。若已有,则获取可以促成胜利的坐标点,进行落子T;
4.2、若4.1不满足,则再去检查一下棋盘,看玩家已占有棋面中是否已经有两子连成、即将成棋的状态。若已有,则获取玩家即将胜利的坐标点,落子T进行拦截;
4.3、若4.1、4.2均不满足,则在棋面中选择电脑端有利的点进行落子;
A、先判断中心位置[1][1]处是否被占领,若未被占领,则这是最有利点。当占领[1][1]点时,则阻断了玩家的横、纵、正对角线、副对角线四条线路;
B、次有利点则是3*3棋盘的四个角,每占领一个角,则会阻断玩家的三条线路;
C、最后有利的点则是每条边的中心位置,会阻断玩家的两条线路;
def Intercept_player(chess_board,key):
count2 = 0
index2 = []
intercept_index = {'x':-1,'y':-1}
for i in range(MAX_ROW):
index = []
count = 0
count1 = 0
index1 = []
allindex = [0,1,2]
for j in range(MAX_ROW):
if(chess_board[i][j] == key): #每一行的玩家落子情况
count += 1
index.append(j)
if(chess_board[j][i] == key): #每一列的玩家落子情况
#print('j'+str(j)+',i'+str(i)+'='+chess_board[j][i])
count1 += 1
index1.append(j)
if (i == j and chess_board[j][i] == key): # 在主对角线中的玩家落子情况
count2 += 1
index2.append(j)
if(count == 2): #在每一行中 获取具体的可以拦截的位置坐标 需要排除掉已经填充的位置
result = list(set(allindex).difference(set(index)))
result = result[0]
if(chess_board[i][result] == ' '): #当这个位置可以进行拦截时,进行坐标返回
#return i,result
intercept_index['x'] = i
intercept_index['y'] = result
return intercept_index
#print(count1,'------->',index1)
if (count1 == 2): # 在每一列中 获取具体的可以拦截的位置坐标 需要排除掉已经填充的位置
result = list(set(allindex).difference(set(index1)))
result = result[0]
#print('count1==2,result:',result)
if (chess_board[result][i] == ' '): # 当这个位置可以进行拦截时,进行坐标返回
intercept_index['x'] = result
intercept_index['y'] = i
return intercept_index
#return i, result
if (count2 == 2): # 在主对角线上 获取具体的可以拦截的位置坐标 需要排除掉已经填充的位置
result = list(set(allindex).difference(set(index2)))
result = result[0]
if (chess_board[i][result] == ' '): # 当这个位置可以进行拦截时,进行坐标返回
intercept_index['x'] = i
intercept_index['y'] = result
return intercept_index
#return i, result
count3 = 0
if(chess_board[0][2] == key):
count3 += 1
if (chess_board[1][1] == key):
count3 += 1
if (chess_board[2][0] == key):
count3 += 1
if(count3 == 2):
if(chess_board[0][2] == ' '):
intercept_index['x'] = 0
intercept_index['y'] = 2
elif (chess_board[1][1] == ' '):
intercept_index['x'] = 1
intercept_index['y'] = 1
elif (chess_board[2][0] == ' '):
intercept_index['x'] = 2
intercept_index['y'] = 0
return intercept_index
def computer_second(chess_board): #电脑智能出棋
#1、先检查一下电脑是否两子成棋 若已有,则获取空位置坐标 自己先成棋
intercept_index = Intercept_player(chess_board, 'T')
if (intercept_index['x'] == -1 and intercept_index['y'] == -1):
pass
else: # 电脑可落子
x = intercept_index['x']
y = intercept_index['y']
chess_board[x][y] = 'T'
return
#2、若玩家快成棋 则先进行拦截
intercept_index = Intercept_player(chess_board,'U') #若玩家已经两子成棋 则获取空位置的坐标
#print('intercept_index---:')
#print(intercept_index)
if(intercept_index['x'] == -1 and intercept_index['y'] == -1):
pass
else: #电脑可落子
x = intercept_index['x']
y = intercept_index['y']
chess_board[x][y] = 'T'
return
#3、如果没有,则电脑端排棋 以促进成棋
#3.1、 占领中心位置 如若中心位置[1,1]未被占领
if(chess_board[1][1] == ' '):
chess_board[1][1] = 'T'
return
#3.2、 占领四角位置 若[0,0] [0,2] [2,0] [2,2]未被占领
if (chess_board[0][0] == ' '):
chess_board[0][0] = 'T'
return
if (chess_board[0][2] == ' '):
chess_board[0][2] = 'T'
return
if (chess_board[2][0] == ' '):
chess_board[2][0] = 'T'
return
if (chess_board[2][2] == ' '):
chess_board[2][2] = 'T'
return
# 3.3、 占领每一边中心位置 若[0,1] [1,0] [1,2] [2,1]未被占领
if (chess_board[0][1] == ' '):
chess_board[0][1] = 'T'
return
if (chess_board[1][0] == ' '):
chess_board[1][0] = 'T'
return
if (chess_board[1][2] == ' '):
chess_board[1][2] = 'T'
return
if (chess_board[2][1] == ' '):
chess_board[2][1] = 'T'
return
5、输赢判定
最终的结果:输、赢、和棋D
判定流程:判断每个横线、纵线、对角线上是否有玩家U或电脑T连成三子的,若有则是该方胜出;当整个棋面都被占满,但玩家和电脑都未成棋时,则说明和棋。
def chess_board_isfull(chess_board): #判断棋盘是否填充满
for i in range(MAX_ROW):
if (' ' in chess_board[i]):
return 0
return 1
pass
def Win_or_lose(chess_board):
isfull = chess_board_isfull(chess_board)
for i in range(MAX_ROW): #每一列的判断
if( chess_board[0][i] == chess_board[1][i] == chess_board[2][i]):
return chess_board[0][i]
pass
pass
for i in range(MAX_ROW): # 每一行的判断
if( chess_board[i][0] == chess_board[i][1] == chess_board[i][2]):
return chess_board[i][0]
pass
pass
if (chess_board[0][0] == chess_board[1][1] == chess_board[2][2]): # 判断棋盘正对角线
return chess_board[0][0]
if (chess_board[0][2] == chess_board[1][1] == chess_board[2][0]): # 判断棋盘反对角线
return chess_board[0][2]
if isfull:
return 'D' # 经过以上的判断,都不满足(既没赢也没输),但是棋盘也已经填充满,则说明和棋
else:
return ' '
三、整体代码
# coding=utf-8import random
MAX_ROW = 3
MAX_COL = 3
#array = ['0','0','0']
chess_board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] #[array] * 3
def init_cheaa_board(chess_board):
for i in range(MAX_ROW):
for j in range(MAX_COL):
chess_board[i][j] = ' '
pass
def print_chess_board(chess_board):
print('*'+'-'*7+'*'+'-'*7+'*'+'-'*7+'*')
for i in range(MAX_ROW):
print('|'+' '*3+chess_board[i][0]+' '*3+'|'+' '*3+chess_board[i][1]+' '*3+'|'+' '*3+chess_board[i][2]+' '*3+'|')
print('*' + '-' * 7 + '*' + '-' * 7 + '*' + '-' * 7 + '*')
pass
pass
def player_first(chess_board):
while(1):
x = int(input('please input x:'))
y = int(input('please input y:'))
if(chess_board[x][y] != ' '):
print('This position is already occupied!')
pass
elif(x >= MAX_ROW or y >= MAX_COL or x < 0 or y < 0):
print('This position is beyond the chessboard!')
pass
else:
chess_board[x][y] = 'U'
print_chess_board(chess_board)
#return x,y
break
pass
pass
def chess_board_isfull(chess_board): #判断棋盘是否填充满
for i in range(MAX_ROW):
if (' ' in chess_board[i]):
return 0
return 1
pass
def Win_or_lose(chess_board):
isfull = chess_board_isfull(chess_board)
for i in range(MAX_ROW): #每一列的判断
if( chess_board[0][i] == chess_board[1][i] == chess_board[2][i]):
return chess_board[0][i]
pass
pass
for i in range(MAX_ROW): # 每一行的判断
if( chess_board[i][0] == chess_board[i][1] == chess_board[i][2]):
return chess_board[i][0]
pass
pass
if (chess_board[0][0] == chess_board[1][1] == chess_board[2][2]): # 判断棋盘正对角线
return chess_board[0][0]
if (chess_board[0][2] == chess_board[1][1] == chess_board[2][0]): # 判断棋盘反对角线
return chess_board[0][2]
if isfull:
return 'D' # 经过以上的判断,都不满足(既没赢也没输),但是棋盘也已经填充满,则说明和棋
else:
return ' '
def computer_second_random(chess_board): #电脑随机出棋
while(1):
x = random.randint(0,2)
y = random.randint(0,2)
if(chess_board[x][y] != ' '):
continue
else:
chess_board[x][y] = 'T'
break
def Intercept_player(chess_board,key):
count2 = 0
index2 = []
intercept_index = {'x':-1,'y':-1}
for i in range(MAX_ROW):
index = []
count = 0
count1 = 0
index1 = []
allindex = [0,1,2]
for j in range(MAX_ROW):
if(chess_board[i][j] == key): #每一行的玩家落子情况
count += 1
index.append(j)
if(chess_board[j][i] == key): #每一列的玩家落子情况
#print('j'+str(j)+',i'+str(i)+'='+chess_board[j][i])
count1 += 1
index1.append(j)
if (i == j and chess_board[j][i] == key): # 在主对角线中的玩家落子情况
count2 += 1
index2.append(j)
if(count == 2): #在每一行中 获取具体的可以拦截的位置坐标 需要排除掉已经填充的位置
result = list(set(allindex).difference(set(index)))
result = result[0]
if(chess_board[i][result] == ' '): #当这个位置可以进行拦截时,进行坐标返回
#return i,result
intercept_index['x'] = i
intercept_index['y'] = result
return intercept_index
#print(count1,'------->',index1)
if (count1 == 2): # 在每一列中 获取具体的可以拦截的位置坐标 需要排除掉已经填充的位置
result = list(set(allindex).difference(set(index1)))
result = result[0]
#print('count1==2,result:',result)
if (chess_board[result][i] == ' '): # 当这个位置可以进行拦截时,进行坐标返回
intercept_index['x'] = result
intercept_index['y'] = i
return intercept_index
#return i, result
if (count2 == 2): # 在主对角线上 获取具体的可以拦截的位置坐标 需要排除掉已经填充的位置
result = list(set(allindex).difference(set(index2)))
result = result[0]
if (chess_board[i][result] == ' '): # 当这个位置可以进行拦截时,进行坐标返回
intercept_index['x'] = i
intercept_index['y'] = result
return intercept_index
#return i, result
count3 = 0
if(chess_board[0][2] == key):
count3 += 1
if (chess_board[1][1] == key):
count3 += 1
if (chess_board[2][0] == key):
count3 += 1
if(count3 == 2):
if(chess_board[0][2] == ' '):
intercept_index['x'] = 0
intercept_index['y'] = 2
elif (chess_board[1][1] == ' '):
intercept_index['x'] = 1
intercept_index['y'] = 1
elif (chess_board[2][0] == ' '):
intercept_index['x'] = 2
intercept_index['y'] = 0
return intercept_index
def computer_second(chess_board): #电脑智能出棋
#1、先检查一下电脑是否两子成棋 若已有,则获取空位置坐标 自己先成棋
intercept_index = Intercept_player(chess_board, 'T')
if (intercept_index['x'] == -1 and intercept_index['y'] == -1):
pass
else: # 电脑可落子
x = intercept_index['x']
y = intercept_index['y']
chess_board[x][y] = 'T'
return
#2、若玩家快成棋 则先进行拦截
intercept_index = Intercept_player(chess_board,'U') #若玩家已经两子成棋 则获取空位置的坐标
#print('intercept_index---:')
#print(intercept_index)
if(intercept_index['x'] == -1 and intercept_index['y'] == -1):
pass
else: #电脑可落子
x = intercept_index['x']
y = intercept_index['y']
chess_board[x][y] = 'T'
return
#3、如果没有,则电脑端排棋 以促进成棋
#3.1、 占领中心位置 如若中心位置[1,1]未被占领
if(chess_board[1][1] == ' '):
chess_board[1][1] = 'T'
return
#3.2、 占领四角位置 若[0,0] [0,2] [2,0] [2,2]未被占领
if (chess_board[0][0] == ' '):
chess_board[0][0] = 'T'
return
if (chess_board[0][2] == ' '):
chess_board[0][2] = 'T'
return
if (chess_board[2][0] == ' '):
chess_board[2][0] = 'T'
return
if (chess_board[2][2] == ' '):
chess_board[2][2] = 'T'
return
# 3.3、 占领每一边中心位置 若[0,1] [1,0] [1,2] [2,1]未被占领
if (chess_board[0][1] == ' '):
chess_board[0][1] = 'T'
return
if (chess_board[1][0] == ' '):
chess_board[1][0] = 'T'
return
if (chess_board[1][2] == ' '):
chess_board[1][2] = 'T'
return
if (chess_board[2][1] == ' '):
chess_board[2][1] = 'T'
return
def begin_games():
global chess_board
init_cheaa_board(chess_board)
result = ' '
while(1):
print_chess_board(chess_board)
player_first(chess_board)
result = Win_or_lose(chess_board)
if(result != ' '):
break
else: #棋盘还没满,该电脑出棋
#computer_second_random(chess_board)
computer_second(chess_board)
result = Win_or_lose(chess_board)
if (result != ' '):
break
print_chess_board(chess_board)
if (result == 'U'):
print('Congratulations on your victory!')
elif (result == 'T'):
print('Unfortunately, you failed to beat the computer.')
elif (result == 'D'):
print('The two sides broke even.')
def menu():
print('-'*20)
print('1---------------begin')
print('2---------------exit')
print('please select begin or exit')
print('-' * 20)
while(1):
select = input('please input:')
if select == '1':
begin_games()
pass
elif select == '2':
print('exit the game')
break
#pass
pass
if __name__ == "__main__":
menu()
pass
四、结果展示
4.1 在以下截图中,展示了电脑拦截、占据有利位置、并率先成棋的过程
来源:https://blog.csdn.net/sakura_ll/article/details/112577718
猜你喜欢
- 本文实例讲述了Python实现FTP上传文件或文件夹实例。分享给大家供大家参考。具体如下:import sys import os impo
- 直方图介绍直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表
- 一、乱码问题描述经常在爬虫或者一些操作的时候,经常会出现中文乱码等问题,如下原因是源网页编码和爬取下来后的编码格式不一致 二、利用
- asp编程中我们经常要处理字符串,比如一个新闻列表,在我们编写asp程序的时候就要考虑到新闻标题的长度不确定性,因为有的文章标题可能很长,可
- 阅读上一章:Chapter 14 图片替换Chapter 15 为<body>指定样式把内容与显示效果分开设定的好处之一就是灵活
- max(iterable, *[, key, default])max(arg1, arg2, *args[, key])函数功能为取传入的
- 1、使用argparse组件,获取命令行参数;使用re组件,获取需要查找的字符串所在行2、使用pandas组件,对文件进行排序。3、命令行执
- 前言今天呢,笔者想和大家聊聊python+pytest接口自动化中将代码进行封装,只有将测试代码进行封装,才能被测试框架识别执行。例如单个接
- seed() 设置生成随机数用的整数起始值。调用任何其他random模块函数之前调用这个函数。语法以下是seed()方法的语法:
- 自定义图片生成词云图的多种方法有时候我们会根据具体的场景来结合图片展示词云,比如我分析的是美团评论,那么最好的展示方法就是利用美团的logo
- 1.经典类与新式类在了解Python的类与类型前,需要对Python的经典类(classic classes)与新式类(new-style
- 测试环境为Windows 10 系统,Python3.7,转换需要提前安装pydub、ffmpeg,安装和加入环境变量配置方法自行解决,至于
- Request.ServerVariables("Url") 返回服务器地址Request.ServerVariable
- python的random库,提供了很多随机抽样方法。1. 设置随机数种子 seed()在适当的情形下,为例保证抽样的结果固定,不因多次运行
- 可以把多个页面相同的部分提取出来,放在一个母板里,这些页面只需要继承这个母板就好了通常会在母板中定义页面专用的 CSS 块和 JS 块,方便
- 在实现TextStraem的时候,找到判断文件编码的代码是VBS的,但是在JScript中是没有ASC等函数的,也不能对二进制数据进行处理,
- python之Pyperclip模块下面介绍一下,python中的Pyperclip模块,它的简单又实用,主要用法就2点:1.用于复制剪贴板
- 一、环境windows二、下载进入Anaconda 官网进行下载 安装 找到安装包所在的目录,双击安装包点击 Next点击 I A
- 上一篇我们写了Django基于类如何增删改数据的方法,方法虽然简单,但新手可能对其原理不是很清楚,那么我们这次就用Django提供的Mode
- 单张人脸关键点检测定义可视化图像函数导入三维人脸关键点检测模型导入可视化函数和可视化样式读取图像将图像模型输入,获取预测结果BGR转RGB将