三子棋的python实现
- 基本流程
- 基本步骤
2.1 菜单界面
2.2 初始化、打印棋盘
2.3 玩家落子
2.4 电脑落子
2.5 输赢判定
一、基本流程
三子棋游戏实现逻辑如下:
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