先拿图片资源:
百度网盘
链接:https://pan.baidu.com/s/135E38nVPwp-R5KuSZUGNKQ
提取码:z7x4
以上图片部分来自网络,部分自制。
再来看看成品效果图
*********************************************************************************************************************************************************************************************************************************************
来看代码:
*********************************************************************************************************************************************************************************************************************************************
import pygame
import time
import sys
from pygame.locals import *
# 定义棋盘
init_chess_list = [] # 保存棋盘坐标
init_role = 1 # 保存棋子(1:白--2:黑)
result_flag = 0 # 保存结果
# 落子类
class StonePoint(object):
def __init__(self, x, y, value):
"""
:param x: x坐标
:param y: y坐标
:param value: 是否有子( 0:没有,1:白,2:黑)
"""
self.x = x
self.y = y
self.value = value
# 初始化棋盘
def init_chess(x, y):
for i in range(15): # 每一行
row_list = []
for j in range(15): # 每一列
point_x = x + j * 40
point_y = y + i * 40
sp = StonePoint(point_x, point_y, 0) # 获取点位
row_list.append(sp) # 集合一行全部的点
init_chess_list.append(row_list) # 将一行存入棋盘
# 事件监听
def eventHander():
for event in pygame.event.get():
global init_role, result_flag, init_chess_list
if event.type == pygame.QUIT: # 退出游戏
pygame.quit()
sys.exit()
if event.type == MOUSEBUTTONDOWN: # 鼠标点击
x, y = pygame.mouse.get_pos() # 获取鼠标点击坐标值
i = 0
j = 0
for temp in init_chess_list: #获取行
for point in temp: # 获取列
if x >= point.x - 15 and x <= point.x + 15 and y <= point.y + 15 and y >= point.y - 15 and result_flag == 0:
if point.value == 0 and init_role == 1: # 落子点为空且白子下
point.value = 1 # 落子
init_role = 2 # 切换角色
resultType(i, j, 1)
elif point.value == 0 and init_role == 2: # 落子点为空且黑子下
point.value = 2 # 落子
init_role = 1 # 切换角色
resultType(i, j, 2)
break
j += 1
i += 1
j = 0
# 重新开始
if result_flag > 0 and x >= 250 and x <= 365 and y >= 770 and y <= 810:
result_flag = 0
init_chess_list = [] # 清空棋盘
init_role = 1
main().screen.blit(main().game, (0, 615))
# 判断函数
def resultType(i, j, value): # 先传入子
global result_flag
flag = False
if result_flag <= 0:
for x in range(j - 4, j + 5): # 横向检测
if x >= 0 and x + 4 < 15:
if init_chess_list[i][x].value == value and \
init_chess_list[i][x + 1].value == value and \
init_chess_list[i][x + 2].value == value and \
init_chess_list[i][x + 3].value == value and \
init_chess_list[i][x + 4].value == value:
flag = True
break
for y in range(i - 4, i + 5): # 纵向检测
if y >= 0 and y + 4 < 15:
if init_chess_list[y][j].value == value and \
init_chess_list[y + 1][j].value == value and \
init_chess_list[y + 2][j].value == value and \
init_chess_list[y + 3][j].value == value and \
init_chess_list[y + 4][j].value == value:
flag = True
break
# 下面那个-1暂时不知道干哈的,但是确实不能少
for x, y in zip(range(j + 4, j - 5, -1), range(i - 4, i + 5)): # 东北-西南方向检测
if x >= 0 and x + 4 < 15 and y >= 0 and y + 4 < 15:
if init_chess_list[y][x].value == value and \
init_chess_list[y - 1][x + 1].value == value and \
init_chess_list[y - 2][x + 2].value == value and \
init_chess_list[y - 3][x + 3].value == value and \
init_chess_list[y - 4][x + 4].value == value:
flag = True
break
for x, y in zip(range(j - 4, j + 5), range(i - 4, i + 5)): # 西北--东南方向检测
if x >= 0 and x + 4 < 15 and y >= 0 and y + 4 < 15:
if init_chess_list[y][x].value == value and \
init_chess_list[y + 1][x + 1].value == value and \
init_chess_list[y + 2][x + 2].value == value and \
init_chess_list[y + 3][x + 3].value == value and \
init_chess_list[y + 4][x + 4].value == value:
flag = True
break
if flag: # 如果五子连珠
result_flag = value
if value == 1:
print("白旗胜")
elif value == 2:
print("黑棋胜")
# 加载素材
def main():
global init_chess_list, result_flag
init_chess(27, 27) # 棋盘两边多出15,一半就是7,半个格子就是20
pygame.init() # 初始化游戏
screen = pygame.display.set_mode((615, 815), 0, 0) # 设置游戏窗口
pygame.display.set_caption("五子棋") # 设置窗口标题
bg = pygame.image.load("./images/bg.png") # 背景图片
white = pygame.image.load("./images/storn_white.png") # 白棋图片
black = pygame.image.load("./images/storn_black.png") # 黑棋图片
result = pygame.image.load("./images/resultStorn.jpg") # 结束图片
game = pygame.image.load("./images/gaming.png")
whiteWin = pygame.image.load("./images/white_win.png")
blackWin = pygame.image.load("./images/black_win.png")
restart = pygame.image.load("./images/restart.png")
rect = white.get_rect() # 获取棋子图片 x,y
while True:
screen.blit(bg, (0, 0))
screen.blit(game, (0, 615))
# screen.blit(restart, (250, 770))
for temp in init_chess_list:
for point in temp: # 落子贴图
if point.value == 1:
screen.blit(white, (point.x - 18, point.y - 18))
if point.value == 2:
screen.blit(black, (point.x - 18, point.y - 18))
if result_flag == 1:
# init_chess_list = [] # 清空棋盘
# init_chess(27, 27) # 重新初始化棋盘
screen.blit(whiteWin, (0, 615)) # 绘制获胜时的图片
screen.blit(restart, (250, 770))
# result_flag = 0 # 置空之前的获胜结果
elif result_flag == 2:
# init_chess_list = [] # 清空棋盘
# init_chess(27, 27) # 重新初始化棋盘
screen.blit(blackWin, (0, 615)) # 绘制获胜时的图片
screen.blit(restart, (250, 770))
# result_flag = 0 # 置空之前的获胜结果
pygame.display.update() # 更新视图
eventHander() # 事件监听
if __name__ == '__main__':
main()
本程序没有面向对象的感觉,此代码主要借鉴自:qq_43608549的博客 老手er
原文链接:https://blog.csdn.net/qq_43608549/article/details/100059765
感谢观看!!!
接下来会发布 Python井字棋 使用面向对象程序设计。