Простые игры подключить четыре в Python 3


Пожалуйста, комментарий и предложение поделиться :

https://github.com/prosenjitj/ConnectFour

enter image description here

Код:

import re
import string
import sys


PLAYING = "PLAYING"
WAITING = "WAITING"
WINNERX = "XXXX"
WINNERO = "OOOO"

## User Class
class User:
    state = ""
    name = ""
    def __init__(self,name, stateParam):
        self.name = name
        self.state = stateParam

    def userInfo(self):
        return self.name

    def getState(self):
        return self.state
    def setState(self, stateParam):
        self.state = stateParam

def printBoard(matrix):
    for num in range(1, 7):
        print(" "+ str(num) +" ", end = " ")
    print()

    for row in range(0, 6):
        for col in range(0, 6):
            print(" "+ str(matrix[row][col]) +" ", end = " ")
        print("")

def createMatrix(row, column) :
    mat = ["*"] * row
    for i in range(row):
        # mat[i] = ["" + str(i)] * column
        mat[i] = ["*"] * column
    return mat



def findMatrixMatched(matrix) :
    winFlg = False
    rowStrArr = []
    # get rows in String format
    for row in range(0, 6):
        str = ""
        for col in range(0, 6):
            str = str + matrix[row][col]
        rowStrArr.append(str)

    for rowStr in rowStrArr:
        # print("Row-" , rowStr)
        if WINNERX in rowStr or WINNERO in rowStr:
            winFlg = True
            break


    # get columns in String format
    colStrArr = []
    for col in range(0, 6):
        str = ""
        for row in range(0, 6):
            str = str + matrix[row][col]
        colStrArr.append(str)

    for colStr in colStrArr:
        # print("Col-" , colStr)
        if WINNERX in colStr or WINNERO in colStr :
            winFlg = True
            break

    # get diagonal match
    diagStrArr = [""] * 25
    for col in range(0, 6):
        diagNum = col

        for row in range(0, 6):
            if row + col > 5 :
                break
            if col == 0:
                diagStrArr[diagNum] = diagStrArr[diagNum] + matrix[row][row]  # middle
            else :
                diagStrArr[diagNum] = diagStrArr[diagNum] + matrix[row][row + col]  # upper
                diagStrArr[diagNum + 5] = diagStrArr[diagNum + 5] + matrix[row + col][row]  # lower

    # get diagonal match
    for col in range(0, 6):
        diagNum = col + 12

        for row in range(0,6):
            rowId = 5-row
            # print(col , " ---- " , rowId, " ---- " , row)
            if rowId - col < 0 :
                break

            if col == 0:
                diagStrArr[diagNum] = diagStrArr[diagNum] + matrix[row][rowId]  # middle
            else :
                diagStrArr[diagNum] = diagStrArr[diagNum] + matrix[row][rowId - col]  # upper
                diagStrArr[diagNum + 5] = diagStrArr[diagNum + 5] + matrix[row + col][rowId]  # lower


    for diagStr in diagStrArr:
        # print("Diag-" , diagStr)
        if WINNERX in diagStr or WINNERO in diagStr:
            winFlg = True
            break

    return winFlg



def appConnect():
    userA = User("A" , PLAYING)
    userB = User("B" , WAITING)

    matBoard = createMatrix(6,6)
    printBoard(matBoard)

    turn = 0
    while True:
        user = userA
        if turn % 2 == 0 :
            user = userA
            userA.setState(PLAYING)
            userB.setState(WAITING)
        else :
            user = userB
            userB.setState(PLAYING)
            userA.setState(WAITING)

        print(".................................................. ")
        print("Preference : ", user.userInfo() , " SEQ : ", str(turn + 1))
        print(".................................................. ")

        try:
            print( user.userInfo() , " turn >>>>>......................... ")
            color = str(input("Please select X or O > "))
            if color != 'X' and color != 'O' :
                print("Wrong Entry", color)
                continue

            colNum = int(input("Please Enter column Number >"))
            if colNum > 6 and colNum < 0:
                print("Wrong Entry -> Please Enter 1 - 5 :", colNum)
                continue

            colNum = colNum - 1; # column starting from 0
            for row in range(5, -1, -1):
                if matBoard[row][colNum] == "*" :
                    matBoard[row][colNum] = color
                    break;

            turn += 1
        except ValueError:
            print('Invalid Number !! Please try again')

        printBoard(matBoard)
        if findMatrixMatched(matBoard) :
            print(".................................................. ")
            print("User : ", user.userInfo() , " Win the Match by ", str(turn / 2) , " Steps")
            print(".................................................. ")
            break

        if turn >= 20:
            print("You have crossed maximum limits. Please start again.")
            break

if __name__ == '__main__':
    appConnect()


1735
6
задан 24 февраля 2018 в 05:02 Источник Поделиться
Комментарии
1 ответ

Я провел быстрое сканирование за код, и некоторые вещи всплывают:

Класс User является слишком сложным для того, что вы на самом деле делать с ним (хотя вы, возможно, планирует использовать ее в будущем?)

Вы могли бы сделать что-то простое, как:

users = ['A', 'B']

а потом тумблер, чья очередь, просто листать между users[0] и users[1].

Сейчас хороший трюк заключается в том, что False == 0 и True == 1так users[False] эквивалентно users[0] что будет Ausers[True] будет B)

Так что ваш код может выглядеть примерно так:

turn = 0
while True:
player = players[turn % 2 == 0] # Odd turns False, even turns True
turn += 1

(Если вы держите классов можно хранить User случаи, в список и получить тот же эффект).

Матч строк (OOOO и XXXX) - это может быть лучше, чтобы построить эти:

win_count = 4
WINNERX = "X" * 4
WINNERO = "O" * 4

Таким образом, вы можете легко настроить игру, чтобы изменить условие победы при изменении переменной.

Кроме того... вы можете не беспокоиться о сохранении WINNERX и WINNERO на все - и просто проверить, если строка содержит тот же символ Н (4) раз:

# Replace
if WINNERX in rowStr or WINNERO in rowStr:
# with
if rowStr == rowStr[0] * win_count:

Одну и ту же строку множитель может быть использован в других местах за аккуратность - такие как `печать(".....") линии.

Возможно, вы также захотите установить размер доски переменные и использовать их в range звонков, настройки платы, colNum и т. д., Чтобы другой размер доски легко.

Использование winFlag/break мог быть удален - так как вы только использовать его, чтобы затем вернуться winFlag. Почему бы просто не сделать return True или return False в месте установки/разрыва/возвращения?

if colNum > 6 and colNum < 0 - это должно быть or не and.

импорт - вы импортируете несколько библиотек, которые вы не используете - re, string и сис.

Вы могли бы хотеть рассмотреть, используя format для некоторых из печати заявления-соединение строк. Если ничего другого, это бы снять нужно int для str в print заявления.

str = "" - str это встроенный метод, так не должно быть переопределено - выбрать другое имя переменной.

Очень незначительные, но turn >= 20 может быть turn == 20 - нет никакой способ добраться до 21 без первого проведения этого теста.

Наконец, попробуйте выполнить код через pylint и pycodestyle - есть ряд мелких макет и форматирование вопросов, которые выиграют от ремонта.

Надеюсь, что достаточно идеи, чтобы начать с!

3
ответ дан 24 февраля 2018 в 09:02 Источник Поделиться