Python implementation of gomoku program

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&#39;s continuation
both =0  #Is there any obstruction at both ends of our continuum?
_ both =0  #Whether the opponent&#39;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

Python implementation of gomoku program
Detailed implementation of Python plug-in mechanism
Implementation of reverse traversal of python list
Python implementation of IOU calculation case
Python preliminary implementation of word2vec operation
Implementation of python selenium operation cookie
Implementation of python3 registration global hotkey
Implementation of python student management system
Implementation of python gradient descent algorithm
Implementation of JWT user authentication in python
Python implementation of intersection and IOU tutorial
7 features of Python3.9
Method analysis of Python calling C language program
Implementation of Python headless crawler to download files
Python implementation of AI automatic matting example analysis
Python implementation of hand drawing effect example sharing
Implementation of business card management system with python
Python writes the game implementation of fishing master
Basics of Python syntax
Basic syntax of Python
Basic knowledge of Python (1)
Prettytable module of python
09. Common modules of Python3
Implementation of business card management system based on python
Detailed explanation of the implementation steps of Python interface development
Consolidate the foundation of Python (4)
Consolidate the foundation of Python(7)
In-depth understanding of python list (LIST)
Subscripts of tuples in Python
Python analysis of wav files
Consolidate the foundation of Python(6)
Python drawing rose implementation code
python king of glory wallpaper
Consolidate the foundation of Python(5)
Analysis of Python Sandbox Escape
Some new features of Python 3.10
Deep understanding of Python multithreading
Analysis of Python object-oriented programming
Implementation of CentOS8.0 Network Configuration
python3 records program running time
Python version of OpenCV installation
Python GUI simulation implementation calculator
9 feature engineering techniques of Python
matplotlib of python drawing module
Python method of parameter passing
Consolidate the foundation of Python (3)
Collection of Python Common Modules
Python telnet login function implementation code
The usage of wheel in python
Summary of logarithm method in Python
Python segmentation sequence diagram visualization program
Detailed explanation of python backtracking template
Analysis of usage examples of Python yield
Use of Pandas in Python development
Detailed explanation of python sequence types
In-depth understanding of Python variable scope
FM algorithm analysis and Python implementation
Python calculation of information entropy example
How to save the python program
Use of numpy in Python development
Python ATM function implementation code example