五子棋python人机对弈,python五子棋人机对战

  五子棋python人机对弈,python五子棋人机对战

  这篇文章主要为大家详细介绍了大蟒实现人人对战的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  大蟒五子棋之人人对战,供大家参考,具体内容如下

  checkerboard.py

  从集合导入命名元组

  Chessman=namedtuple(Chessman , Name Value Color )

  Point=namedtuple(Point , X Y )

  BLACK_CHESSMAN=Chessman(黑子, 1, (45, 45, 45))

  白色棋子=棋子(白子, 2, (219, 219, 219))

  offset=[(1,0),(0,1),(1,1),(1,-1)]

  类别棋盘:

  def __init__(self,line_points):

  自我。_线点=线点

  自我棋盘=[[0]* line _ points for _ in range(line _ points)]

  def _ get _ checkerboard(self):

  回归自我。_棋盘

  棋盘=属性(_ get _棋盘)

  # 判断是否可落子

  def can_drop(自身,点):

  回归自我。_棋盘[点y][点. X]==0

  定义掉落(自己,棋子,点):

  落子

  :param chessman:

  :参数点:落子位置

  :返回:若该子落下之后即可获胜,则返回获胜方,否则返回没有人

  打印(f {棋子。姓名}({点. X},{点. Y}))

  自我。_棋盘[点y][点. X]=棋子。价值

  如果自我. win(点):

  打印(f {棋子。姓名}获胜)

  返回棋子

  # 判断是否赢了

  def _win(自己,点):

  当前值=自身。_棋盘[点y][点. X]

  对于偏移量:中的操作系统

  如果自我. get_count_on_direction(point,cur_value,os[0],os[1]):

  返回真实的

  定义_获取_计数_方向(自身,点,值,x_offset,y_offset):

  计数=1

  对于范围(1,5):中的步长

  x=点10 . x步长* x _偏移

  y=点10 . y步长* y _偏移

  如果0=x自我100 . 00 _行_点和0=y自我._line_points和自我._棋盘[y][x]==值:

  计数=1

  else:

  破裂

  对于范围(1,5):中的步长

  x=点10 . x步* x _偏移

  y=点10 . y步长* y _偏移

  如果0=x自我100 . 00 _行_点和0=y自我._line_points和自我._棋盘[y][x]==值:

  计数=1

  else:

  破裂

  返回理事会

  t >= 5

  ManAndMan.py

  

import sys

  import pygame

  from pygame.locals import *

  import pygame.gfxdraw

  from checkerboard import Checkerboard, BLACK_CHESSMAN, WHITE_CHESSMAN, Point

  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)

  BLACK_STONE_COLOR = (45, 45, 45)

  WHITE_STONE_COLOR = (219, 219, 219)

  RIGHT_INFO_POS_X = SCREEN_HEIGHT + Stone_Radius2 * 2 + 10

  def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):

     imgText = font.render(text, True, fcolor)

     screen.blit(imgText, (x, y))

  def main():

     pygame.init()

     screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

     pygame.display.set_caption(五子棋)

     font1 = pygame.font.SysFont(SimHei, 36)

     font2 = pygame.font.SysFont(SimHei, 72)

     fwidth, fheight = font2.size(黑方获胜)

     checkerboard = Checkerboard(Line_Points)

     cur_runner = BLACK_CHESSMAN

     winner = None

     while True:

         for event in pygame.event.get():

             if event.type == QUIT:

                 sys.exit()

             elif event.type == KEYDOWN:

                 if event.key == K_RETURN:

                     if winner is not None:

                         winner = None

                         cur_runner = BLACK_CHESSMAN

                         checkerboard = Checkerboard(Line_Points)

             elif event.type == MOUSEBUTTONDOWN:

                 if winner is None:

                     pressed_array = pygame.mouse.get_pressed()

                     if pressed_array[0]:

                         mouse_pos = pygame.mouse.get_pos()

                         click_point = _get_clickpoint(mouse_pos)

                         if click_point is not None:

                             if checkerboard.can_drop(click_point):

                                 winner = checkerboard.drop(cur_runner, click_point)

                                 if cur_runner == BLACK_CHESSMAN:

                                     cur_runner = WHITE_CHESSMAN

                                 else:

                                     cur_runner = BLACK_CHESSMAN

                         else:

                             print(超出棋盘区域)

         # 画棋盘

         _draw_checkerboard(screen)

         # 画棋盘上已有的棋子

         for i, row in enumerate(checkerboard.checkerboard):

             for j, cell in enumerate(row):

                 if cell == BLACK_CHESSMAN.Value:

                     _draw_chessman(screen, Point(j, i), BLACK_CHESSMAN.Color)

                 elif cell == WHITE_CHESSMAN.Value:

                     _draw_chessman(screen, Point(j, i), WHITE_CHESSMAN.Color)

         _draw_chessman_pos(screen, (SCREEN_HEIGHT + Stone_Radius2, Start_X + 20), BLACK_STONE_COLOR)

         _draw_chessman_pos(screen, (SCREEN_HEIGHT + Stone_Radius2, Start_X + 20 + Stone_Radius2 * 3), WHITE_STONE_COLOR)

         if winner:

             print_text(screen, font2, (SCREEN_WIDTH - fwidth)//2, (SCREEN_HEIGHT - fheight)//2, winner.Name + 获胜, RED_COLOR)

         if cur_runner == BLACK_CHESSMAN:

             print_text(screen, font1, RIGHT_INFO_POS_X, Start_X, 获胜 if winner else 落子中, BLUE_COLOR)

         else:

             print_text(screen, font1, RIGHT_INFO_POS_X, Start_X + Stone_Radius2 * 3, 获胜 if winner else 落子中, BLUE_COLOR)

         pygame.display.flip()

  # 画棋盘

  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)

  # 画棋子

  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)

  def _draw_chessman_pos(screen, pos, stone_color):

     pygame.gfxdraw.aacircle(screen, pos[0], pos[1], Stone_Radius2, stone_color)

     pygame.gfxdraw.filled_circle(screen, pos[0], pos[1], Stone_Radius2, stone_color)

  # 根据鼠标点击位置,返回游戏区坐标

  def _get_clickpoint(click_pos):

     pos_x = click_pos[0] - Start_X

     pos_y = click_pos[1] - Start_Y

     if pos_x < -Inside_Width or pos_y < -Inside_Width:

         return None

     x = pos_x // SIZE

     y = pos_y // SIZE

     if pos_x % SIZE > Stone_Radius:

         x += 1

     if pos_y % SIZE > Stone_Radius:

         y += 1

     if x >= Line_Points or y >= Line_Points:

         return None

     return Point(x, y)

  if __name__ == __main__:

     main()

  

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: