Как сделать крестики-нолики в Python, используя черепаху без системы счисления? - PullRequest
0 голосов
/ 09 мая 2019

Я делаю игру в крестики / нолики, и мне было интересно, как можно создать игру такого типа без использования системы счисления?

В большинстве примеров, которые я видел, используются цифры, которые соответствуют пользователю и компьютеру, конкурирующим друг с другом на игровой доске.Как "0-9".Тогда вот как они определяют победителя.Есть ли другой способ без использования каких-либо встроенных методов?Я просто использую модуль черепахи, модуль случайных чисел и модуль времени.

Пока это мой код.Я пытаюсь создать функцию, которая контролирует движения компьютеров, а затем проверить игру на три в ряд без использования системы счисления:

import turtle
import random
import time

# draw board
pieces = ["_", "_", "_", "_", "_", "_", "_", "_", "_"]
turn = "X"

turtle.clear()
turtle.setup(600, 600)
turtle.bgcolor("black")

turtle.color("white")
turtle.hideturtle()
turtle.speed('fastest')
turtle.width(10)
turtle.up()

# Horizontal bars
turtle.goto(-300, 100)
turtle.down()
turtle.forward(600)
turtle.up()
turtle.goto(-300, -100)
turtle.down()
turtle.forward(600)
turtle.up()

# Vertical bars
turtle.goto(-100, 300)
turtle.setheading(-90)
turtle.down()
turtle.forward(600)
turtle.up()
turtle.goto(100, 300)
turtle.down()
turtle.forward(600)
turtle.up()

turtle.color("green")

# Draw noughts and crosses
def cross(x, y):
    turtle.up()
    turtle.goto(x + 20, y - 20)
    turtle.setheading(-45)
    turtle.down()
    turtle.forward(226)
    turtle.up()
    turtle.goto(x + 180, y - 20)
    turtle.setheading(-135)
    turtle.down()
    turtle.forward(226)
    turtle.up()

def circle(x, y):
    turtle.up()
    turtle.goto(x + 100, y - 180)
    turtle.setheading(0)
    turtle.down()
    turtle.circle(80)
    turtle.up()

turtle.update()

def drawPieces(pieces):
    x, y = -300, 300

    for piece in pieces:
        if piece == "X":
            cross(x, y)
        elif piece == "O":
            circle(x, y)

        x += 200
        if x > 100:
            x = -300
            y -= 200

def clicked(x, y):
    global turn, pieces

    turtle.onscreenclick(None)  # disable handler when inside handler!

    column = (x + 300) // 200
    row = (y - 300) // -200
    square = int(row * 3 + column)

    print("You clicked ", x, ",", y, " which is square ", square)

    if pieces[square] == "_":
        pieces[square] = turn

        if turn == "X":
            turn = "O"
        else:
            turn = "X"

        drawPieces(pieces)
    else:
        print("That square is already taken")

    turtle.onscreenclick(clicked)

# Start the game
turtle.tracer(0,0)
turtle.onscreenclick(clicked)
turtle.mainloop()

Спасибо!Любая помощь приветствуется.Надеюсь, это было достаточно ясно.

1 Ответ

0 голосов
/ 10 мая 2019

Вот мой пример игры в крестики-нолики, в которой компьютер играет, выбирая случайные квадраты, а код пытается максимально избежать чисел. У него есть возможность обнаружить и объявить победителя:

from turtle import Turtle, Screen
from random import choice

SQUARE_SIZE = 200
FONT_SIZE = 160
FONT = ('Arial', FONT_SIZE, 'bold')
CURSOR_SIZE = 20
GAME_SIZE = 3

class TicTacToe:

    wins = [
        [True, True, True, False, False, False, False, False, False],
        [False, False, False, True, True, True, False, False, False],
        [False, False, False, False, False, False, True, True, True],
        [True, False, False, True, False, False, True, False, False],
        [False, True, False, False, True, False, False, True, False],
        [False, False, True, False, False, True, False, False, True],
        [True, False, False, False, True, False, False, False, True],
        [False, False, True, False, True, False, True, False, False]
    ]

    def __init__(self):
        self.board = [Turtle('square', visible=False) for _ in range(GAME_SIZE * GAME_SIZE)]
        self.background = Turtle('square', visible=False)

    def drawBoard(self):
        screen.tracer(False)

        self.background.shapesize(SQUARE_SIZE * GAME_SIZE / CURSOR_SIZE)
        self.background.color('black')
        self.background.stamp()

        for j in range(GAME_SIZE):
            for i in range(GAME_SIZE):
                square = self.board[i + j * GAME_SIZE]
                square.shapesize(SQUARE_SIZE / CURSOR_SIZE)
                square.color('white')
                square.penup()
                square.goto((i - 1) * (SQUARE_SIZE + 2), (j - 1) * (SQUARE_SIZE + 2))
                square.state = None
                square.onclick(lambda x, y, s=square: self.mouse(s))
                square.showturtle()
                square.stamp()  # blank out background behind turtle (for later)

        screen.tracer(True)

    def select(self, square, turn):
        square.onclick(None)  # disable further moves to this square
        square.state = turn
        # replace square/turtle with (written) X or O
        square.hideturtle()
        square.color('black')
        square.sety(square.ycor() - FONT_SIZE / 2)
        square.write(turn, align='center', font=FONT)

        return self.is_winner(turn)

    def is_winner(self, turn):
        for win in self.wins:
            for index, flag in enumerate(win):
                if flag and self.board[index].state != turn:
                    break

            else:  # no break
                self.deactivate()
                screen.textinput("Game Over", turn + " Wins!")
                return True

        return False

    def deactivate(self):
        for square in self.board:
            if square.state is None:
                square.onclick(None)

    def mouse(self, square):

        if self.select(square, 'X'):
            return

        choices = [square for square in self.board if square.state is None]

        if not choices:
            self.deactivate()
            return

        if self.select(choice(choices), 'O'):
            return

screen = Screen()

game = TicTacToe()
game.drawBoard()

screen.mainloop()

Таблица типа wins может использоваться для реализации стратегии, если / когда вы хотите сделать компьютерный плеер умнее.

...