I believe most people have played the gobang game, and today we will use python to implement it once
The specific code can be obtained from my GitHub address
Build a gomoku board
from collections import namedtuple
Chessman =namedtuple('Chessman','Name Value Color')
Point =namedtuple('Point','X Y')
BLACK_CHESSMAN =Chessman('Kuroko',1,(45,45,45))
WHITE_CHESSMAN =Chessman('Baizi',2,(219,219,219))
offset =[(1,0),(0,1),(1,1),(1,-1)]classCheckerboard:
def __init__(self, line_points):
self._line_points = line_points
self._checkerboard =[[0]* line_points for _ inrange(line_points)]
def _get_checkerboard(self):return self._checkerboard
checkerboard =property(_get_checkerboard)
# Determine whether it can be placed
def can_drop(self, point):return self._checkerboard[point.Y][point.X]==0
def drop(self, chessman, point):"""
Laozi
: param chessman::param point:Placement
: return:If the child can win after falling, return the winner, otherwise return None
"""
print(f'{chessman.Name} ({point.X}, {point.Y})')
self._checkerboard[point.Y][point.X]= chessman.Value
if self._win(point):print(f'{chessman.Name}Win')return chessman
# Judge if you won
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
def _get_count_on_direction(self, point, value, x_offset, y_offset):
count =1for step inrange(1,5):
x = point.X + step * x_offset
y = point.Y + step * y_offset
if0<= x < self._line_points and 0<= y < self._line_points and self._checkerboard[y][x]== value:
count +=1else:breakfor step inrange(1,5):
x = point.X - step * x_offset
y = point.Y - step * y_offset
if0<= x < self._line_points and 0<= y < self._line_points and self._checkerboard[y][x]== value:
count +=1else:breakreturn count =5
Realize Gobang man-machine battle
import sys
import random
import pygame
from pygame.locals import*import pygame.gfxdraw
from checkerboard import Checkerboard, BLACK_CHESSMAN, WHITE_CHESSMAN, offset, Point
SIZE =30 #The time interval of each point of the chessboard
Line_Points =19 #Each row of the board/Points per column
Outer_Width =20 #Outside width of chessboard
Border_Width =4 #Border width
Inside_Width =4 #The space between the border and the actual chessboard
Border_Length = SIZE *(Line_Points -1)+ Inside_Width *2+ Border_Width #The length of the border line
Start_X = Start_Y = Outer_Width +int(Border_Width /2)+ Inside_Width #Grid line starting point (upper left corner) coordinates
SCREEN_HEIGHT = SIZE *(Line_Points -1)+ Outer_Width *2+ Border_Width + Inside_Width *2 #The height of the game screen
SCREEN_WIDTH = SCREEN_HEIGHT +200 #The width of the game screen
Stone_Radius = SIZE // 2 - 3 #Chess piece radius
Stone_Radius2 = SIZE // 2 + 3
Checkerboard_Color =(0xE3,0x92,0x65) #Checkerboard color
BLACK_COLOR =(0,0,0)
WHITE_COLOR =(255,255,255)
RED_COLOR =(200,30,30)
BLUE_COLOR =(30,30,200)
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('Gobang')
font1 = pygame.font.SysFont('SimHei',32)
font2 = pygame.font.SysFont('SimHei',72)
fwidth, fheight = font2.size('Black wins')
checkerboard =Checkerboard(Line_Points)
cur_runner = BLACK_CHESSMAN
winner = None
computer =AI(Line_Points, WHITE_CHESSMAN)
black_win_count =0
white_win_count =0while 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)
computer =AI(Line_Points, WHITE_CHESSMAN)
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 winner is None:
cur_runner =_get_next(cur_runner)
computer.get_opponent_drop(click_point)
AI_point = computer.AI_drop()
winner = checkerboard.drop(cur_runner, AI_point)if winner is not None:
white_win_count +=1
cur_runner =_get_next(cur_runner)else:
black_win_count +=1else:print('Beyond the board area')
# Draw chessboard
_ draw_checkerboard(screen)
# Draw existing pieces on the chessboard
for i, row inenumerate(checkerboard.checkerboard):for j, cell inenumerate(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_left_info(screen, font1, cur_runner, black_win_count, white_win_count)if winner:print_text(screen, font2,(SCREEN_WIDTH - fwidth)//2, (SCREEN_HEIGHT - fheight)//2, winner.Name + 'Win', RED_COLOR)
pygame.display.flip()
def _get_next(cur_runner):if cur_runner == BLACK_CHESSMAN:return WHITE_CHESSMAN
else:return BLACK_CHESSMAN
# Draw chessboard
def _draw_checkerboard(screen):
# Fill the checkerboard background color
screen.fill(Checkerboard_Color)
# Draw the border outside the checkerboard grid lines
pygame.draw.rect(screen, BLACK_COLOR,(Outer_Width, Outer_Width, Border_Length, Border_Length), Border_Width)
# Draw grid lines
for i inrange(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 inrange(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)
# Draw stars and Tianyuan
for i in(3,9,15):for j in(3,9,15):if i == j ==9:
radius =5else:
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)
# Draw chess pieces
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)
# Information display on the left side of the picture
def _draw_left_info(screen, font, cur_runner, black_win_count, white_win_count):_draw_chessman_pos(screen,(SCREEN_HEIGHT + Stone_Radius2, Start_X + Stone_Radius2), BLACK_CHESSMAN.Color)_draw_chessman_pos(screen,(SCREEN_HEIGHT + Stone_Radius2, Start_X + Stone_Radius2 *4), WHITE_CHESSMAN.Color)print_text(screen, font, RIGHT_INFO_POS_X, Start_X +3,'Player', BLUE_COLOR)print_text(screen, font, RIGHT_INFO_POS_X, Start_X + Stone_Radius2 *3+3,'computer', BLUE_COLOR)print_text(screen, font, SCREEN_HEIGHT, SCREEN_HEIGHT - Stone_Radius2 *8,'The situation:', BLUE_COLOR)_draw_chessman_pos(screen,(SCREEN_HEIGHT + Stone_Radius2, SCREEN_HEIGHT -int(Stone_Radius2 *4.5)), BLACK_CHESSMAN.Color)_draw_chessman_pos(screen,(SCREEN_HEIGHT + Stone_Radius2, SCREEN_HEIGHT - Stone_Radius2 *2), WHITE_CHESSMAN.Color)print_text(screen, font, RIGHT_INFO_POS_X, SCREEN_HEIGHT -int(Stone_Radius2 *5.5)+3, f'{black_win_count}Win', BLUE_COLOR)print_text(screen, font, RIGHT_INFO_POS_X, SCREEN_HEIGHT - Stone_Radius2 *3+3, f'{white_win_count}Win', BLUE_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)
# According to the mouse click position, return to the game area coordinates
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 // SIZEif pos_x % SIZE Stone_Radius:
x +=1if pos_y % SIZE Stone_Radius:
y +=1if x = Line_Points or y = Line_Points:return None
returnPoint(x, y)classAI:
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 _ inrange(line_points)]
def get_opponent_drop(self, point):
self._checkerboard[point.Y][point.X]= self._opponent.Value
def AI_drop(self):
point = None
score =0for i inrange(self._line_points):for j inrange(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 =0for 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 #The number of consecutive sons at our place
_ count =0 #The number of consecutive children in the opponent
space = None #Are there any spaces in our continuation
_ space = None #Are there spaces in the opponent's continuation
both =0 #Is there any obstruction at both ends of our continuum?
_ both =0 #Whether the opponent's continuum is blocked at both ends
# If it is 1, it means we are on the side, and 2 is the enemy
flag = self._get_stone_color(point, x_offset, y_offset, True)if flag !=0:for step inrange(1,6):
x = point.X + step * x_offset
y = point.Y + step * y_offset
if0<= x < self._line_points and 0<= y < self._line_points:if flag ==1:if self._checkerboard[y][x]== self._my.Value:
count +=1if space is False:
space = True
elif self._checkerboard[y][x]== self._opponent.Value:
_ both +=1breakelse:if space is None:
space = False
else:break #Exit when encountering the second space
elif flag ==2:if self._checkerboard[y][x]== self._my.Value:
_ both +=1break
elif self._checkerboard[y][x]== self._opponent.Value:
_ count +=1if _space is False:
_ space = True
else:if _space is None:
_ space = False
else:breakelse:
# Encountering the edge is blocking
if flag ==1:
both +=1
elif flag ==2:
_ both +=1if 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 inrange(1,6):
x = point.X - step * x_offset
y = point.Y - step * y_offset
if0<= x < self._line_points and 0<= y < self._line_points:if _flag ==1:if self._checkerboard[y][x]== self._my.Value:
count +=1if space is False:
space = True
elif self._checkerboard[y][x]== self._opponent.Value:
_ both +=1breakelse:if space is None:
space = False
else:break #Exit when encountering the second space
elif _flag ==2:if self._checkerboard[y][x]== self._my.Value:
_ both +=1break
elif self._checkerboard[y][x]== self._opponent.Value:
_ count +=1if _space is False:
_ space = True
else:if _space is None:
_ space = False
else:breakelse:
# Encountering the edge is blocking
if _flag ==1:
both +=1
elif _flag ==2:
_ both +=1
score =0if count ==4:
score =10000
elif _count ==4:
score =9000
elif count ==3:if both ==0:
score =1000
elif both ==1:
score =100else:
score =0
elif _count ==3:if _both ==0:
score =900
elif _both ==1:
score =90else:
score =0
elif count ==2:if both ==0:
score =100
elif both ==1:
score =10else:
score =0
elif _count ==2:if _both ==0:
score =90
elif _both ==1:
score =9else:
score =0
elif count ==1:
score =10
elif _count ==1:
score =9else:
score =0if space or _space:
score /=2return score
# Determine whether the specified position is our party, the other party, and the empty in the specified direction
def _get_stone_color(self, point, x_offset, y_offset, next):
x = point.X + x_offset
y = point.Y + y_offset
if0<= x < self._line_points and 0<= y < self._line_points:if self._checkerboard[y][x]== self._my.Value:return1
elif self._checkerboard[y][x]== self._opponent.Value:return2else:if next:return self._get_stone_color(Point(x, y), x_offset, y_offset, False)else:return0else:return0if __name__ =='__main__':main()
The operation effect is as follows:
Python realizes backgammon for everyone
import sys
import pygame
from pygame.locals import*import pygame.gfxdraw
from checkerboard import Checkerboard, BLACK_CHESSMAN, WHITE_CHESSMAN, Point
SIZE =30 #The time interval of each point of the chessboard
Line_Points =19 #Each row of the board/Points per column
Outer_Width =20 #Outside width of chessboard
Border_Width =4 #Border width
Inside_Width =4 #The space between the border and the actual chessboard
Border_Length = SIZE *(Line_Points -1)+ Inside_Width *2+ Border_Width #The length of the border line
Start_X = Start_Y = Outer_Width +int(Border_Width /2)+ Inside_Width #Grid line starting point (upper left corner) coordinates
SCREEN_HEIGHT = SIZE *(Line_Points -1)+ Outer_Width *2+ Border_Width + Inside_Width *2 #The height of the game screen
SCREEN_WIDTH = SCREEN_HEIGHT +200 #The width of the game screen
Stone_Radius = SIZE // 2 - 3 #Chess piece radius
Stone_Radius2 = SIZE // 2 + 3
Checkerboard_Color =(0xE3,0x92,0x65) #Checkerboard color
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('Gobang')
font1 = pygame.font.SysFont('SimHei',36)
font2 = pygame.font.SysFont('SimHei',72)
fwidth, fheight = font2.size('Black wins')
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('Beyond the board area')
# Draw chessboard
_ draw_checkerboard(screen)
# Draw existing pieces on the chessboard
for i, row inenumerate(checkerboard.checkerboard):for j, cell inenumerate(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 + 'Win', RED_COLOR)if cur_runner == BLACK_CHESSMAN:print_text(screen, font1, RIGHT_INFO_POS_X, Start_X,'Win'if winner else'Laozizhong', BLUE_COLOR)else:print_text(screen, font1, RIGHT_INFO_POS_X, Start_X + Stone_Radius2 *3,'Win'if winner else'Laozizhong', BLUE_COLOR)
pygame.display.flip()
# Draw chessboard
def _draw_checkerboard(screen):
# Fill the checkerboard background color
screen.fill(Checkerboard_Color)
# Draw the border outside the checkerboard grid lines
pygame.draw.rect(screen, BLACK_COLOR,(Outer_Width, Outer_Width, Border_Length, Border_Length), Border_Width)
# Draw grid lines
for i inrange(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 inrange(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)
# Draw stars and Tianyuan
for i in(3,9,15):for j in(3,9,15):if i == j ==9:
radius =5else:
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)
# Draw chess pieces
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)
# According to the mouse click position, return to the game area coordinates
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 // SIZEif pos_x % SIZE Stone_Radius:
x +=1if pos_y % SIZE Stone_Radius:
y +=1if x = Line_Points or y = Line_Points:return None
returnPoint(x, y)if __name__ =='__main__':main()
running result
More interesting classic mini game implementation topics, share with you:
C++ classic games summary
Python classic games summary
python tetris game collection
JavaScript classic games are constantly playing
Summary of classic java games
JavaScript classic games summary
The above is the whole content of this article, I hope it will be helpful to everyone's study.
Recommended Posts