五子棋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 sysimport 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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。