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 在以下截图中,展示了电脑拦截、占据有利位置、并率先成棋的过程
以上是python怎么实现三子棋游戏的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

MySQL 有免费的社区版和收费的企业版。社区版可免费使用和修改,但支持有限,适合稳定性要求不高、技术能力强的应用。企业版提供全面商业支持,适合需要稳定可靠、高性能数据库且愿意为支持买单的应用。选择版本时考虑的因素包括应用关键性、预算和技术技能。没有完美的选项,只有最合适的方案,需根据具体情况谨慎选择。

文章介绍了MySQL数据库的上手操作。首先,需安装MySQL客户端,如MySQLWorkbench或命令行客户端。1.使用mysql-uroot-p命令连接服务器,并使用root账户密码登录;2.使用CREATEDATABASE创建数据库,USE选择数据库;3.使用CREATETABLE创建表,定义字段及数据类型;4.使用INSERTINTO插入数据,SELECT查询数据,UPDATE更新数据,DELETE删除数据。熟练掌握这些步骤,并学习处理常见问题和优化数据库性能,才能高效使用MySQL。

MySQL安装失败的原因主要有:1.权限问题,需以管理员身份运行或使用sudo命令;2.依赖项缺失,需安装相关开发包;3.端口冲突,需关闭占用3306端口的程序或修改配置文件;4.安装包损坏,需重新下载并验证完整性;5.环境变量配置错误,需根据操作系统正确配置环境变量。解决这些问题,仔细检查每个步骤,就能顺利安装MySQL。

MySQL下载文件损坏,咋整?哎,下载个MySQL都能遇到文件损坏,这年头真是不容易啊!这篇文章就来聊聊怎么解决这个问题,让大家少走弯路。读完之后,你不仅能修复损坏的MySQL安装包,还能对下载和安装过程有更深入的理解,避免以后再踩坑。先说说为啥下载文件会损坏这原因可多了去了,网络问题是罪魁祸首,下载过程中断、网络不稳定都可能导致文件损坏。还有就是下载源本身的问题,服务器文件本身就坏了,你下载下来当然也是坏的。另外,一些杀毒软件过度“热情”的扫描也可能造成文件损坏。诊断问题:确定文件是否真的损坏

MySQL拒启动?别慌,咱来排查!很多朋友安装完MySQL后,发现服务死活启动不了,心里那个急啊!别急,这篇文章带你从容应对,揪出幕后黑手!读完后,你不仅能解决这个问题,还能提升对MySQL服务的理解,以及排查问题的思路,成为一名更强大的数据库管理员!MySQL服务启动失败,原因五花八门,从简单的配置错误到复杂的系统问题都有可能。咱们先从最常见的几个方面入手。基础知识:服务启动流程简述MySQL服务启动,简单来说,就是操作系统加载MySQL相关的文件,然后启动MySQL守护进程。这其中涉及到配置

MySQL 可在无需网络连接的情况下运行,进行基本的数据存储和管理。但是,对于与其他系统交互、远程访问或使用高级功能(如复制和集群)的情况,则需要网络连接。此外,安全措施(如防火墙)、性能优化(选择合适的网络连接)和数据备份对于连接到互联网的 MySQL 数据库至关重要。

MySQL数据库性能优化指南在资源密集型应用中,MySQL数据库扮演着至关重要的角色,负责管理海量事务。然而,随着应用规模的扩大,数据库性能瓶颈往往成为制约因素。本文将探讨一系列行之有效的MySQL性能优化策略,确保您的应用在高负载下依然保持高效响应。我们将结合实际案例,深入讲解索引、查询优化、数据库设计以及缓存等关键技术。1.数据库架构设计优化合理的数据库架构是MySQL性能优化的基石。以下是一些核心原则:选择合适的数据类型选择最小的、符合需求的数据类型,既能节省存储空间,又能提升数据处理速度

MySQL性能优化需从安装配置、索引及查询优化、监控与调优三个方面入手。1.安装后需根据服务器配置调整my.cnf文件,例如innodb_buffer_pool_size参数,并关闭query_cache_size;2.创建合适的索引,避免索引过多,并优化查询语句,例如使用EXPLAIN命令分析执行计划;3.利用MySQL自带监控工具(SHOWPROCESSLIST,SHOWSTATUS)监控数据库运行状况,定期备份和整理数据库。通过这些步骤,持续优化,才能提升MySQL数据库性能。
