ホームページ >バックエンド開発 >Python チュートリアル >Pythonでスリーピースチェスゲームを実装する方法
3 ピース チェス ゲームの実装ロジックは次のとおりです:
1. 初期化された 3*3 チェス盤を作成します;
2. プレーヤーU の駒を持って先に駒を動かす;
3. 勝敗の決定 [勝ち、負け、引き分け]、結果が決まらない場合は次のように続行
4. コンピュータは T の駒を持って、そして行動を起こす;
5. 勝敗の判定 (勝利の場合) 結果が否定的な場合は、手順 2 から続行
ゲームを開始するには 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
3 ピースのチェス盤は 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 チェス盤上の動きの水平方向と垂直方向の座標を選択します。座標点は次の要件を満たす必要があります: 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.1. まずチェス盤をチェックして、チェス盤上にコンピュータが占有している 2 つの連続する駒があるかどうかを確認します。チェスの状態。すでに存在する場合は、勝利を促進できる座標点を取得し、T;
4.2. 4.1 が満たされない場合は、チェス盤を再度チェックして、すでに 2 つの駒が連続しているかどうかを確認します。プレイヤーが占有している盤面、チェスの駒になっている、またはチェスの駒になりつつある状態。すでに存在する場合は、プレイヤーが勝ちそうな座標点を取得し、T を移動してインターセプトします;
4.3. 4.1 と 4.2 が満たされない場合は、コンピューター側で有利な点を選択して、移動;
A. まず中央の位置 [1][1] が占有されているかどうかを判断し、占有されていない場合は、これが最も有利なポイントです。 [1][1] ポイントが占有されている場合、プレイヤーの 4 つの水平、垂直、対角線、およびサブ対角線がブロックされます。
B、二次的に有利なポイントは、それぞれ 3*3 チェス盤のコーナー上の 4 つです。コーナーが占有されている場合、プレーヤーの 3 つのルートがブロックされます;
C. 最後の有利なポイントは各サイドの中央であり、プレーヤーの 2 つのルートをブロックします;
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
最終結果: 負け、勝ち、引き分け D
判定プロセス: プレイヤー U とコンピューター T が水平線、垂直線、対角線のそれぞれに 3 つの駒を接続しているかどうかを判断し、接続している場合は、チェスの面全体が揃ったとき、その側の勝ちとなります。が占領されているが、プレイヤーもコンピュータも成功しない場合、引き分けを意味します。
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 中国語 Web サイトの他の関連記事を参照してください。