Implementação do Gomoku através do pygame (Gomoku)

Um estudante universitário desconhecido, conhecido como Caigou no mundo das artes marciais
autor original: jacky Li
Email: [email protected]
Última edição: 30/11/2022

Índice

Implementação do Gomoku através do pygame (Gomoku)

Introdução ao gamão

1: Exibição de efeito

Dois: configuração necessária 

Três: exibição de código

1. Parâmetros do quadro do tabuleiro de xadrez

2. Desenhe um tabuleiro de xadrez

3. Desenhe peças de xadrez

4. Como jogar xadrez no lado da IA

5.Julgue a vitória

Quatro: Perspectiva de Valor

1. Jogar gamão é uma forma de entretenimento para cultivar o corpo e melhorar a saúde física e mental.

2. Jogar gamão tem o efeito de fortalecer o cérebro e aumentar a inteligência.

3. O gamão tem uma boa função de regular a psicologia.

O autor tem algo a dizer


Implementação do Gomoku através do pygame (Gomoku)

Introdução ao gamão

        O Gamão teve origem na China e é uma das provas competitivas dos Jogos Intelectuais Nacionais.É um jogo de xadrez puramente estratégico jogado entre duas pessoas. Ambos os lados usam peças de xadrez pretas e brancas, respectivamente, e as colocam na intersecção das linhas retas e horizontais do tabuleiro. O primeiro a formar uma sequência de cinco peças vence. O gamão é fácil de aprender, adequado para todas as idades e é divertido e envolvente. Não só aumenta a capacidade de raciocínio e melhora a inteligência, mas também é rico em filosofia e ajuda a cultivar o caráter moral.

1: Exibição de efeito

 

 

Dois: configuração necessária 

pygame

aleatório

sistema

Três: exibição de código

1. Parâmetros do quadro do tabuleiro de xadrez

SIZE = 30  # 棋盘每个点时间的间隔
Line_Points = 19  # 棋盘每行/每列点数
Outer_Width = 20  # 棋盘外宽度
Border_Width = 4  # 边框宽度
Inside_Width = 4  # 边框跟实际的棋盘之间的间隔
Border_Length = SIZE * (Line_Points - 1) + Inside_Width * 2 + Border_Width  # 边框线的长度
Start_X = Start_Y = Outer_Width + int(Border_Width / 2) + Inside_Width  # 网格线起点(左上角)坐标
SCREEN_HEIGHT = SIZE * (Line_Points - 1) + Outer_Width * 2 + Border_Width + Inside_Width * 2  # 游戏屏幕的高
SCREEN_WIDTH = SCREEN_HEIGHT + 200  # 游戏屏幕的宽

Stone_Radius = SIZE // 2 - 3  # 棋子半径
Stone_Radius2 = SIZE // 2 + 3
Checkerboard_Color = (0xE3, 0x92, 0x65)  # 棋盘颜色
BLACK_COLOR = (0, 0, 0)
WHITE_COLOR = (255, 255, 255)
RED_COLOR = (200, 30, 30)
BLUE_COLOR = (30, 30, 200)

2. Desenhe um tabuleiro de xadrez

def _draw_checkerboard(screen):
    # 填充棋盘背景色
    screen.fill(Checkerboard_Color)
    # 画棋盘网格线外的边框
    pygame.draw.rect(screen, BLACK_COLOR, (Outer_Width, Outer_Width, Border_Length, Border_Length), Border_Width)
    # 画网格线
    for i in range(Line_Points):
        pygame.draw.line(screen, BLACK_COLOR,
                         (Start_Y, Start_Y + SIZE * i),
                         (Start_Y + SIZE * (Line_Points - 1), Start_Y + SIZE * i),
                         1)
    for j in range(Line_Points):
        pygame.draw.line(screen, BLACK_COLOR,
                         (Start_X + SIZE * j, Start_X),
                         (Start_X + SIZE * j, Start_X + SIZE * (Line_Points - 1)),
                         1)
    # 画星位和天元
    for i in (3, 9, 15):
        for j in (3, 9, 15):
            if i == j == 9:
                radius = 5
            else:
                radius = 3
            # pygame.draw.circle(screen, BLACK, (Start_X + SIZE * i, Start_Y + SIZE * j), radius)
            pygame.gfxdraw.aacircle(screen, Start_X + SIZE * i, Start_Y + SIZE * j, radius, BLACK_COLOR)
            pygame.gfxdraw.filled_circle(screen, Start_X + SIZE * i, Start_Y + SIZE * j, radius, BLACK_COLOR)

3. Desenhe peças de xadrez

def _draw_chessman(screen, point, stone_color):
    # pygame.draw.circle(screen, stone_color, (Start_X + SIZE * point.X, Start_Y + SIZE * point.Y), Stone_Radius)
    pygame.gfxdraw.aacircle(screen, Start_X + SIZE * point.X, Start_Y + SIZE * point.Y, Stone_Radius, stone_color)
    pygame.gfxdraw.filled_circle(screen, Start_X + SIZE * point.X, Start_Y + SIZE * point.Y, Stone_Radius, stone_color)

4. Como jogar xadrez no lado da IA

class AI:
    def __init__(self, line_points, chessman):
        self._line_points = line_points
        self._my = chessman
        self._opponent = BLACK_CHESSMAN if chessman == WHITE_CHESSMAN else WHITE_CHESSMAN
        self._checkerboard = [[0] * line_points for _ in range(line_points)]

    def get_opponent_drop(self, point):
        self._checkerboard[point.Y][point.X] = self._opponent.Value

    def AI_drop(self):
        point = None
        score = 0
        for i in range(self._line_points):
            for j in range(self._line_points):
                if self._checkerboard[j][i] == 0:
                    _score = self._get_point_score(Point(i, j))
                    if _score > score:
                        score = _score
                        point = Point(i, j)
                    elif _score == score and _score > 0:
                        r = random.randint(0, 100)
                        if r % 2 == 0:
                            point = Point(i, j)
        self._checkerboard[point.Y][point.X] = self._my.Value
        return point

    def _get_point_score(self, point):
        score = 0
        for os in offset:
            score += self._get_direction_score(point, os[0], os[1])
        return score

    def _get_direction_score(self, point, x_offset, y_offset):
        count = 0   # 落子处我方连续子数
        _count = 0  # 落子处对方连续子数
        space = None   # 我方连续子中有无空格
        _space = None  # 对方连续子中有无空格
        both = 0    # 我方连续子两端有无阻挡
        _both = 0   # 对方连续子两端有无阻挡

        # 如果是 1 表示是边上是我方子,2 表示敌方子
        flag = self._get_stone_color(point, x_offset, y_offset, True)
        if flag != 0:
            for step in range(1, 6):
                x = point.X + step * x_offset
                y = point.Y + step * y_offset
                if 0 <= x < self._line_points and 0 <= y < self._line_points:
                    if flag == 1:
                        if self._checkerboard[y][x] == self._my.Value:
                            count += 1
                            if space is False:
                                space = True
                        elif self._checkerboard[y][x] == self._opponent.Value:
                            _both += 1
                            break
                        else:
                            if space is None:
                                space = False
                            else:
                                break   # 遇到第二个空格退出
                    elif flag == 2:
                        if self._checkerboard[y][x] == self._my.Value:
                            _both += 1
                            break
                        elif self._checkerboard[y][x] == self._opponent.Value:
                            _count += 1
                            if _space is False:
                                _space = True
                        else:
                            if _space is None:
                                _space = False
                            else:
                                break
                else:
                    # 遇到边也就是阻挡
                    if flag == 1:
                        both += 1
                    elif flag == 2:
                        _both += 1

        if space is False:
            space = None
        if _space is False:
            _space = None

        _flag = self._get_stone_color(point, -x_offset, -y_offset, True)
        if _flag != 0:
            for step in range(1, 6):
                x = point.X - step * x_offset
                y = point.Y - step * y_offset
                if 0 <= x < self._line_points and 0 <= y < self._line_points:
                    if _flag == 1:
                        if self._checkerboard[y][x] == self._my.Value:
                            count += 1
                            if space is False:
                                space = True
                        elif self._checkerboard[y][x] == self._opponent.Value:
                            _both += 1
                            break
                        else:
                            if space is None:
                                space = False
                            else:
                                break   # 遇到第二个空格退出
                    elif _flag == 2:
                        if self._checkerboard[y][x] == self._my.Value:
                            _both += 1
                            break
                        elif self._checkerboard[y][x] == self._opponent.Value:
                            _count += 1
                            if _space is False:
                                _space = True
                        else:
                            if _space is None:
                                _space = False
                            else:
                                break
                else:
                    # 遇到边也就是阻挡
                    if _flag == 1:
                        both += 1
                    elif _flag == 2:
                        _both += 1

        score = 0
        if count == 4:
            score = 10000
        elif _count == 4:
            score = 9000
        elif count == 3:
            if both == 0:
                score = 1000
            elif both == 1:
                score = 100
            else:
                score = 0
        elif _count == 3:
            if _both == 0:
                score = 900
            elif _both == 1:
                score = 90
            else:
                score = 0
        elif count == 2:
            if both == 0:
                score = 100
            elif both == 1:
                score = 10
            else:
                score = 0
        elif _count == 2:
            if _both == 0:
                score = 90
            elif _both == 1:
                score = 9
            else:
                score = 0
        elif count == 1:
            score = 10
        elif _count == 1:
            score = 9
        else:
            score = 0

        if space or _space:
            score /= 2

        return score

    # 判断指定位置处在指定方向上是我方子、对方子、空
    def _get_stone_color(self, point, x_offset, y_offset, next):
        x = point.X + x_offset
        y = point.Y + y_offset
        if 0 <= x < self._line_points and 0 <= y < self._line_points:
            if self._checkerboard[y][x] == self._my.Value:
                return 1
            elif self._checkerboard[y][x] == self._opponent.Value:
                return 2
            else:
                if next:
                    return self._get_stone_color(Point(x, y), x_offset, y_offset, False)
                else:
                    return 0
        else:
            return 0

5.Julgue a vitória

    def _win(self, point):
        cur_value = self._checkerboard[point.Y][point.X]
        for os in offset:
            if self._get_count_on_direction(point, cur_value, os[0], os[1]):
                return True

Quatro: Perspectiva de Valor

1. Jogar gamão é uma forma de entretenimento para cultivar o corpo e melhorar a saúde física e mental.


Jogar gamão presta atenção à ética e ao estilo do xadrez e trata os outros com cortesia. Os europeus chamam o gamão de "xadrez de cavalheiros", o que significa que os jogadores que jogam gamão devem ter o comportamento e o temperamento de um cavalheiro. Jogar xadrez, um movimento de cada vez, é como viver a vida real, passo a passo. O gamão não leva muito tempo e é muito interessante. Se você estiver interessado, estará de bom humor. Portanto, tem bons efeitos de prevenção e controle da neurastenia, ansiedade, depressão e TDAH.


2. Jogar gamão tem o efeito de fortalecer o cérebro e aumentar a inteligência.


Jogar xadrez pode fortalecer seu cérebro e melhorar sua capacidade de raciocínio. A persistência em jogar gamão pode não apenas melhorar a velocidade das atividades intelectuais, mas também melhorar a capacidade de resolver problemas de diferentes ângulos e a originalidade no raciocínio lógico. Isso também é muito útil para desenvolver a inteligência de crianças em idade pré-escolar e de alunos do ensino fundamental e médio.


3. O gamão tem uma boa função de regular a psicologia.


Algumas pessoas costumam reclamar de memória fraca, e o motivo costuma ser a falta de concentração. Jogar gamão ajuda a melhorar a concentração. Ao jogar xadrez, "uma mente não pode fazer duas coisas".A concentração pode melhorar a ordem das atividades das células cerebrais e, ao mesmo tempo, promover a regulação benigna do pensamento, das atividades psicológicas, do sistema circulatório e do sistema respiratório das pessoas.
 

O autor tem algo a dizer

Se precisar do código, envie uma mensagem privada ao blogueiro e ele responderá após vê-lo.

Se você acha que o que o blogueiro disse é útil para você, clique em "Seguir" para apoiá-lo. Continuaremos atualizando essas questões...

Acho que você gosta

Origin blog.csdn.net/weixin_62075168/article/details/128116286
Recomendado
Clasificación