簡體   English   中英

如何在PYTHON中的任何選定位置在控制台中編寫

[英]How to write in console at any selected position in PYTHON

我正在嘗試用Python創建一個簡單的控制台井字游戲。

我想要的是讓玩家選擇位置,然后通過使用箭頭鍵移動光標來進行下一播放

通過研究,我已經能夠用str.format()替換板位置上的實際字符串,並通過用戶輸入用數組更改該位置上的字符串。

以下代碼顯示了我是如何實現的。

僅作為示例,它代替了第一個位置。

from os import system   

board = ["a",'b','c','c','d','e','f','g','h']    

#Draws the board    
def drawboard():    
    print(" {0[0]} | {0[1]} | {0[2]} ".format(board))    
    print("___|___|___")    
    print(" {0[3]} | {0[4]} | {0[5]} ".format(board))   
    print("___|___|___")    
    print(" {0[6]} | {0[7]} | {0[8]} ".format(board))    
    print("   |   |   ") 


drawboard()

userInput = input()
board[0] = userInput

system("cls") #clears the screen

drawboard()

在控制台中編寫井字游戲可以使用curses完成。 它的API非常簡單,可以處理顯示坐標。 該腳本將按照您在上文中所述的方式工作,允許您使用箭頭鍵進行導航,並在相應的X或O符號上進行按鍵操作。 我在外殼上工作良好

import curses

CH_P1 = 'X'
CH_P2 = 'O'
X_STEP = 4
Y_STEP = 2
X_OFFSET = 1
Y_OFFSET = 4



def print_board(stdscr):
    stdscr.addstr(0, 0, 'Tic Tac Toe')
    stdscr.hline(1, 0, '-', 50)
    stdscr.addstr(2, 0, 'Use arrows to move,  [SPACE] Draw,  [Q] Quit')
    stdscr.addstr(Y_OFFSET    , X_OFFSET, '  │   │  ')
    stdscr.addstr(Y_OFFSET + 1, X_OFFSET, '──┼───┼──')
    stdscr.addstr(Y_OFFSET + 2, X_OFFSET, '  │   │  ')
    stdscr.addstr(Y_OFFSET + 3, X_OFFSET, '──┼───┼──')
    stdscr.addstr(Y_OFFSET + 4, X_OFFSET, '  │   │  ')


def print_players(stdscr, player_id):
    stdscr.addstr(Y_OFFSET + 6, 0, 'Player {}'.format(CH_P1),
                  curses.A_BOLD if player_id == 0 else 0)
    stdscr.addstr(Y_OFFSET + 7, 0, 'Player {}'.format(CH_P2),
                  curses.A_BOLD if player_id == 1 else 0)


def draw(y, x, stdscr, player_id):
    stdscr.addch(y, x, CH_P2 if player_id else CH_P1)


def check_victory(board, y, x):
    #check if previous move caused a win on horizontal line
    if board[0][x] == board[1][x] == board [2][x]:
        return True

    #check if previous move caused a win on vertical line
    if board[y][0] == board[y][1] == board [y][2]:
        return True

    #check if previous move was on the main diagonal and caused a win
    if x == y and board[0][0] == board[1][1] == board [2][2]:
        return True

    #check if previous move was on the secondary diagonal and caused a win
    if x + y == 2 and board[0][2] == board[1][1] == board [2][0]:
        return True

    return False


def main(stdscr):
    # Clear screen
    # stdscr.clear()

    print_board(stdscr)
    player_id = 0
    print_players(stdscr, player_id=player_id)

    x_pos = 1
    y_pos = 1
    board = [list('   ') for _ in range(3)]

    # This raises ZeroDivisionError when i == 10.
    while True:
        stdscr.move(Y_OFFSET + y_pos * Y_STEP, X_OFFSET + x_pos * X_STEP)

        c = stdscr.getch()
        if c == curses.KEY_UP:
            y_pos = max(0, y_pos - 1)
        elif c == curses.KEY_DOWN:
            y_pos = min(2, y_pos + 1)
        elif c == curses.KEY_LEFT:
            x_pos = max(0, x_pos - 1)
        elif c == curses.KEY_RIGHT:
            x_pos = min(2, x_pos + 1)
        elif c == ord('q') or c == ord('Q'):
            break
        elif c == ord(' '):
            # Update
            y, x = stdscr.getyx()
            if stdscr.inch(y, x) != ord(' '):
                continue

            draw(y, x, stdscr, player_id)
            board[y_pos][x_pos] = CH_P2 if player_id else CH_P1

            if check_victory(board, y_pos, x_pos):
                stdscr.addstr(Y_OFFSET + 9, 0, 'Player {} wins'.format(
                    CH_P2 if player_id else CH_P1))
                break

            # Switch player
            player_id = (player_id + 1) % 2
            print_players(stdscr, player_id)

    stdscr.refresh()
    stdscr.getkey()


if __name__ == '__main__':
    curses.wrapper(main)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM