1. 程式人生 > >Python 井字棋

Python 井字棋

# Tic Tac Toe


import random


def drawBoard(board):
    # 列印棋盤


    # "board"是長度為10的列表,為了方便輸入,忽略第一個元素board[0]


    print('\n\n\n\n')
    print('\t\t\t┌─┬─┬─┐')
    print('\t\t\t│'+board[7]+' │'+board[8]+' │'+board[9]+' │')
    print('\t\t\t├─┼─┼─┤')
    print('\t\t\t│'+board[4]+' │'+board[5]+' │'+board[6]+' │')
    print('\t\t\t├─┼─┼─┤')
    print('\t\t\t│'+board[1]+' │'+board[2]+' │'+board[3]+' │')
    print('\t\t\t└─┴─┴─┘')


def inputPlayerLetter():
    # 讓玩家選擇棋子
    # 返回一個列表,第一個是玩家的棋子,第二個是電腦的
    letter = ''
    while not (letter == 'X' or letter == 'O'):
        print('Do you want to be X or O?')
        letter = input().upper()


    if letter == 'X':
        return ['X', 'O']
    else:
        return ['O', 'X']


def whoGoesFirst():
    # 隨機產生誰先走
    if random.randint(0, 1) == 0:
        return 'computer'
    else:
        return 'player'


def playAgain():
    # 再玩一次?輸入yes或y返回True
    print('Do you want to play again? (yes or no)')
    return input().lower().startswith('y')


def makeMove(board, letter, move):
    #落子
    board[move] = letter


def isWinner(bo, le):
    # 判斷所給的棋子是否獲勝
    # 引數為棋盤上的棋子(列表)和棋子符號
    # 以下是所有可能勝利的情況,共8種
    return ((bo[7] == le and bo[8] == le and bo[9] == le) or 
    (bo[4] == le and bo[5] == le and bo[6] == le) or 
    (bo[1] == le and bo[2] == le and bo[3] == le) or 
    (bo[7] == le and bo[4] == le and bo[1] == le) or 
    (bo[8] == le and bo[5] == le and bo[2] == le) or 
    (bo[9] == le and bo[6] == le and bo[3] == le) or
    (bo[7] == le and bo[5] == le and bo[3] == le) or
    (bo[9] == le and bo[5] == le and bo[1] == le)) 


def getBoardCopy(board):
    # 複製一份棋盤,供電腦落子時使用
    dupeBoard = []


    for i in board:
        dupeBoard.append(i)


    return dupeBoard


def isSpaceFree(board, move):
    # 判斷這個位置是否有子,沒子返回True
    return board[move] == ' '


def getPlayerMove(board):
    # 玩家落子
    move = ' '
    while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)):
        print('What is your next move? (1-9)')
        move = input()
    return int(move)


def chooseRandomMoveFromList(board, movesList):
    # 隨機返回一個可以落子的座標
    # 如果沒有所給的movesList中沒有可以落子的,返回None
    possibleMoves = []
    for i in movesList:
        if isSpaceFree(board, i):
            possibleMoves.append(i)


    if len(possibleMoves) != 0:
        return random.choice(possibleMoves)
    else:
        return None


def getComputerMove(board, computerLetter):
    # 確定電腦的落子位置
    if computerLetter == 'X':
        playerLetter = 'O'
    else:
        playerLetter = 'X'


    # Tic Tac Toe AI核心演算法:
    # 首先判斷電腦方能否通過一次落子直接獲得遊戲勝利
    for i in range(1, 10):
        copy = getBoardCopy(board)
        if isSpaceFree(copy, i):
            makeMove(copy, computerLetter, i)
            if isWinner(copy, computerLetter):
                return i


    # 判斷玩家下一次落子能否獲得勝利,如果能,給它堵上
    for i in range(1, 10):
        copy = getBoardCopy(board)
        if isSpaceFree(copy, i):
            makeMove(copy, playerLetter, i)
            if isWinner(copy, playerLetter):
                return i


    # 如果角上能落子的話,在角上落子
    move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
    if move != None:
        return move


    # 如果能在中心落子的話,在中心落子
    if isSpaceFree(board, 5):
        return 5


    # 在邊上落子
    return chooseRandomMoveFromList(board, [2, 4, 6, 8])


def isBoardFull(board):
    # 如果棋盤滿了,返回True
    for i in range(1, 10):
        if isSpaceFree(board, i):
            return False
    return True




print('Welcome to Tic Tac Toe!')


while True:
    # 更新棋盤
    theBoard = [' '] * 10
    playerLetter, computerLetter = inputPlayerLetter()
    turn = whoGoesFirst()
    print('The ' + turn + ' will go first.')
    gameIsPlaying = True


    while gameIsPlaying:
        if turn == 'player':
            # 玩家回合
            drawBoard(theBoard)
            move = getPlayerMove(theBoard)
            makeMove(theBoard, playerLetter, move)


            if isWinner(theBoard, playerLetter):
                drawBoard(theBoard)
                print('Hooray! You have won the game!')
                gameIsPlaying = False
            else:
                if isBoardFull(theBoard):
                    drawBoard(theBoard)
                    print('The game is a tie!')
                    break
                else:
                    turn = 'computer'


        else:
            # 電腦回合
            move = getComputerMove(theBoard, computerLetter)
            makeMove(theBoard, computerLetter, move)


            if isWinner(theBoard, computerLetter):
                drawBoard(theBoard)
                print('The computer has beaten you! You lose.')
                gameIsPlaying = False
            else:
                if isBoardFull(theBoard):
                    drawBoard(theBoard)
                    print('The game is a tie!')
                    break
                else:
                    turn = 'player'


    if not playAgain():
        break


相關推薦

python算法及代碼

one 鍵盤輸入 有一個 通過 數字鍵盤 boa 簡便 oss range 井字棋盤看起來像一個大的井字符號(#),有9 個空格,可以包含X、O 或關於落子問題由於只能采用鍵盤輸入,所以需要對棋盤進行坐標表示;即直接用1-9個9個數字來表示位置,7|8|9-+-+-4|5|

Python

# Tic Tac Toe import random def drawBoard(board):     # 列印棋盤     # "board"是長度為10的列表,為了方便輸入,忽略第一個元素board[0]     print('\n\n\n\n')     print('\t\t\t┌

Python小遊戲 (人機對戰,玩家對戰)

pan urn utf-8 erl ext print cef () nbsp # -*- coding:utf-8 -*-import timeimport random#井字棋 人機對戰def drawBoard(board): blank_board = '|

Python小遊戲----

週五晚上上了python的選修課,本來以為老師是從python的基礎語法開始的,沒想到是從turtle畫圖開始,正好補上了我以前一些不懂的地方,有人講一下還是比啃書好一點。 之前從圖書館借了一本python遊戲程式設計,看了前面幾章後就沒怎麼看了,晚上突然想看看,然後跟著教

python實現遊戲

用python實現的一個井字棋遊戲。 #Tic-Tac-Toe 井字棋遊戲 #全域性常量 X="X" O="O" EMPTY=" " #詢問是否繼續 def ask_yes_no(question): response=None; while response not i

遊戲C語言簡單思路人人對戰版(無圖形化介面))

#include<stdio.h> #include<stdlib.h> #include<conio.h> #defineROW 3 #defineLINE 3 intsymbol1, symbol2, step; char a[10]; void

[日常練習] 3. 基於遊戲的C語言實現!

井字棋算是童年課堂上的與同桌默契配合的一大樂趣...躲避著老師“關切”的目光,在眼皮底下“頂風作案”,將“燈下黑”體現的淋漓盡致!在C語言中,也算是一個小的專案,今天,我們就用C語言來實現它!!!追逐童年的一份小樂趣! 遊戲介紹: “井字棋”也稱“三子棋”,需要一個3*3的棋盤。假設

三子),說沒玩過的都沒童年

這裡我建立了一個“三子棋”的專案,裡面有一個頭檔案game.h和兩個原始檔text.c 、game.c。   "text.c":text.c原始檔放的是main函式,選單列印menu函式和一個遊戲game函式; #include "game.h" void menu

Unity3d學習之路-簡單

Unity3d-簡單井字棋 作業目的:熟悉IMGUI的使用,和基礎的Unity3d操作 遊戲玩法:選擇兩個模式,1.Player vs Player 2.Computer vs Player,當其中一種棋子連成三個則這個棋子的玩家獲勝。 技術限制:僅允許使用I

用C語言實現簡單 三子)小遊戲

函式頭 放在標頭檔案裡 #ifndef __GAME_H__ #define __GAME_H__ #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #inc

[文件和原始碼分享]C++實現的基於α-β剪枝演算法的遊戲

“井字棋”遊戲(又叫“三子棋”),是一款十分經典的益智小遊戲,操作簡單,娛樂性強。兩個玩家,一個打圈(O),一個打叉(X),輪流在3乘3的格上打自己的符號,最先以橫、直、斜連成一線則為勝。 如果雙方都下得正確無誤,將得和局。這種遊戲實際上是由第一位玩家所控制,第一位玩家是攻,第二位玩家是守。 這種遊戲的變

用TensorFlow基於神經網路實現(含程式碼)

為了展示如何應用神經網路演算法模型,我們將使用神經網路來學習優化井字棋(Tic Tac Toe)。明確井字棋是一種決策性遊戲,並且走棋步驟優化是確定的。 開始 為了訓練神經網路模型,我們有一系列優化的不同的走棋棋譜,棋譜基於棋盤位置列表和對應的最佳落子點。考慮到棋盤的對稱性,通

C語言實現小遊戲

#include <stdio.h> #include <stdlib.h> int store[]={'_','_','_','_','_','_','_','_','_'}, shunt=1, count, i; void pr

遊戲實現-java(低階方法實現)

import java.util.Scanner; public class JingGame  {     final static int LENGTH=3; //棋局的長度     final static int NUM_FOR_WIN=3;//幾個子連起來贏   

tictac 立體

題目描述: 你玩過井字棋遊戲嗎?它的英文名字叫做tic-tac-toe,是一個古老的博弈遊戲。遊戲在一 個3 £ 3的棋盤上進行。遊戲約定,先在同一條線(橫線、縱線或斜線)上佔有3枚棋子者得 勝。儘管現在藉助計算機可以生成這個遊戲所有可能的情況,但這個古老的遊戲從未失去它

[LeetCode] Valid Tic-Tac-Toe State 驗證狀態

A Tic-Tac-Toe board is given as a string array board. Return True if and only if it is possible to reach this board position during the course of a valid

演算法設計與分析題目練習四:(啟發式演算法)

井字棋又叫做三連棋或一連棋。顧名思義就是讓三顆棋子連成一條線就獲勝了。國外也有相似的玩法,名字叫tic-tac-toe #include <iostream> #include <string> using namespace std; /*

JavaScript- 根據棋盤和玩家,得出下一步獲勝的走法

假設我們現在有一個 3 x 3 的井字棋遊戲,我們用一個二維陣列代表棋盤,’x’ 代表玩家 X 下的棋子,’o’ 代表玩家 O 下的棋子,’e’ 代表該格沒有棋子。例如: 一個空白的棋盤以下面的二維陣列表示 [ [‘e’, ‘e’, ‘e’],   [‘e’, ‘e’,

面向物件以及運用最大最小搜尋的設計(附原始碼)

一:實驗題目 井字棋遊戲設計 利用面向物件程式設計的知識,通過設計board、player、game類,實現一個具有人人對弈、人機對弈以及機機對弈的井字棋遊戲。 要求: ①對類設定和實現的要求 1.封裝:需要對遊戲中的資料進行相應的封裝保護。 在井字

三子,又稱的實現

編寫一個三子棋你需要知道的是需要哪些實現步驟:首先,你需要有一個棋盤,這樣你就需要編寫一個初始化棋盤的函式,並能夠將棋盤打印出來; 棋盤麼,就像這種樣子: ___|___|___ ___|___|___        |       | 這個採用二維陣列就可以來實現了;