개발 노트/파이썬 함수 목록

파이썬 리버시 게임 소스코드

LeeInGyu 2022. 1. 8. 00:34
'''
기능 1 : 리버시 환경 출력
기능 2 : 리버시 환경 기본 세팅
기능 3 : 둘 수 있는 경우의 수 출력
기능 4 : 뒤집어 지는 기능
기능 5 : 개수 카운트 기능
경우의 수 로직
1. -1일때 주위 3x3을 탐색
2. 탐색시 0이 있는지 확인
3. 있으면 그걸 기준으로 그 방향을 +1 해서 재귀 탐색
4. -1이면 그냥 종료, 1이 있으면 시작점을 true, 0이면 계속해서 탐색
'''

class Reversy():
    def __init__(self):
        self.map = [
            [-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,0,1,-1,-1,-1],
            [-1,-1,-1,1,0,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1]
        ]

        self.log = []
        self.turn = 0
        self.mark = ['O','X']
        self.able = None
        self.checker = False
        self.end = True

    def print_field(self):
        print("x\\y  0   1   2   3   4   5   6   7")
        print("   ---------------------------------")
        for i in range(8):
            print(f"{i}  ", end="")
            for j in range(8):
                if self.map[i][j] == 1:
                    print(f"| {self.mark[0]} ", end="")
                elif self.map[i][j] == -1:
                    if [i,j] in self.able:
                        print(f"| {'*'} ", end="")
                    else:
                        print(f"| {' '} ", end="")
                else:
                    print(f"| {self.mark[1]} ", end="")

            print("|")
            print("   ---------------------------------")

    def able_list(self):
        self.able = []
        for i in range(8):
            for j in range(8):
                if self.find_next(i+1,j,6,False) + self.find_next(i-1,j,4,False) + self.find_next(i,j-1,2,False) + self.find_next(i,j+1,8,False) + self.find_next(i+1,j-1,3,False) + self.find_next(i-1,j+1,7,False) + self.find_next(i-1,j-1,1,False) + self.find_next(i+1,j+1,9,False):
                    if self.map[i][j] == -1:
                        self.able.append([i,j])

        if len(self.able) == 0:
            self.end_checker()
        else:
            self.checker = False

    def end_checker(self):
            if self.checker:
                self.end = False
            else:
                self.checker = True
                self.turn += 1
                self.able_list()

    def find_next(self,x,y,seed,bool):
        if x == -1 or y == -1 or x == 8 or y == 8 or self.map[x][y] == -1:
            return 0
        if self.map[x][y] == (self.turn % 2):
            if seed == 1:
                return self.find_next(x-1,y-1,seed,True)
            if seed == 2:
                return self.find_next(x,y-1,seed,True)
            if seed == 3:
                return self.find_next(x+1,y-1,seed,True)
            if seed == 4:
                return self.find_next(x-1,y,seed,True)
            if seed == 6:
                return self.find_next(x+1,y,seed,True)
            if seed == 7:
                return self.find_next(x-1,y+1,seed,True)
            if seed == 8:
                return self.find_next(x,y+1,seed,True)
            if seed == 9:
                return self.find_next(x+1,y+1,seed,True)
        else:
            return bool

    def put_mark(self,x,y):
        finder = False
        if [x,y] in self.able:  
            finder = True
        if finder:
            self.turn += 1
            self.map[x][y] = (self.turn % 2)

            self.log.append([x,y])

            self.reverse(x-1,y-1,1,0)
            self.reverse(x,y-1,2,0)
            self.reverse(x+1,y-1,3,0)
            self.reverse(x-1,y,4,0)
            self.reverse(x+1,y,6,0)
            self.reverse(x-1,y+1,7,0)
            self.reverse(x,y+1,8,0)
            self.reverse(x+1,y+1,9,0)

    def reverse(self,x,y,seed,cnt):
        if x == -1 or y == -1 or x == 8 or y == 8 or self.map[x][y] == -1:
            return
        if self.map[x][y] != (self.turn % 2):
            if seed == 1:
                self.reverse(x-1,y-1,seed,cnt+1)
            if seed == 2:
                self.reverse(x,y-1,seed,cnt+1)
            if seed == 3:
                self.reverse(x+1,y-1,seed,cnt+1)
            if seed == 4:
                self.reverse(x-1,y,seed,cnt+1)
            if seed == 6:
                self.reverse(x+1,y,seed,cnt+1)
            if seed == 7:
                self.reverse(x-1,y+1,seed,cnt+1)
            if seed == 8:
                self.reverse(x,y+1,seed,cnt+1)
            if seed == 9:
                self.reverse(x+1,y+1,seed,cnt+1)
        else:
            if cnt:
                if seed == 1:
                    for i in range(1,cnt+1):
                        self.map[x+i][y+i] = (self.turn % 2)
                if seed == 2:
                    for i in range(1,cnt+1):
                        self.map[x][y+i] = (self.turn % 2)
                if seed == 3:
                    for i in range(1,cnt+1):
                        self.map[x-i][y+i] = (self.turn % 2)
                if seed == 4:
                    for i in range(1,cnt+1):
                        self.map[x+i][y] = (self.turn % 2)
                if seed == 6:
                    for i in range(1,cnt+1):
                        self.map[x-i][y] = (self.turn % 2)
                if seed == 7:
                    for i in range(1,cnt+1):
                        self.map[x+i][y-i] = (self.turn % 2)
                if seed == 8:
                    for i in range(1,cnt+1):
                        self.map[x][y-i] = (self.turn % 2)
                if seed == 9:
                    for i in range(1,cnt+1):
                        self.map[x-i][y-i] = (self.turn % 2)

    def count_score(self):
        score = [0,0]

        for i in range(8):
            for j in range(8):
                if self.map[i][j] < 0:
                    continue
                score[self.map[i][j]] += 1

        print("  X     O")
        print("%3d : %3d" % (score[0], score[1]))

    def print_log(self):
        for i,j in self.log:
            print(f"[{i},{j}] ",end="")

if __name__ == '__main__':
    game = Reversy()
    game.able_list()

    while game.end:
        game.print_field()
        game.count_score()

        x, y = map(int, input("x y: ").split())
        game.put_mark(x,y)
        game.able_list()

    game.count_score()
728x90
반응형