代码如下:代码中注释非常清楚,应该可以自行看明白。

本文文章末尾已经将需要的文件,图片以及音乐给大ga分享了,自行取用。

代码基于@“在校学渣一枚“博主的文章https://blog.csdn.net/qq_42847252/article/details/81875119?utm_source=app&app_version=4.10.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

不过修改了部分代码,如有侵删。欢迎指正,相互交流。

注意事项:1.记得修改路径

2. 记得导入相关的包

#小小五子棋#导入必要的包
import numpy as np
import pygame
import sys
import traceback
import copy
from pygame.locals import *pygame.init()#检查pygame工具包是否完整
pygame.mixer.init()#函数,初始化混音器模块# 设置各种需要颜色,便于后来直接使用
background = (201, 202, 187)#背景颜色
checkerboard = (80, 80, 80)#棋盘颜色
button = (52, 53, 44)#按键颜色#定义全局变量,使得变量可以在函数中修改
global m ,n ,p ,q,a,b# 设置音乐
play_chess_sound = pygame.mixer.Sound("C:\\Users\\23088\\Desktop\\music.MP3")#类,从文件中创建新的sound对象
play_chess_sound.set_volume(0.1)#下棋背景音乐
playing_chess_sound = pygame.mixer.Sound("C:\\Users\\23088\\Desktop\\playing.wav")
play_chess_sound.set_volume(0.2)#落棋音乐
button_sound = pygame.mixer.Sound("C:\\Users\\23088\\Desktop\\button.wav")
button_sound.set_volume(0.2)#按键音乐
victor_sound = pygame.mixer.Sound("C:\\Users\\23088\\Desktop\\victory.wav")
victor_sound.set_volume(0.2)#胜利音乐# 绘制棋盘
def Draw_a_chessboard(screen):# 填充背景色screen.fill(background)# 画15*15的棋盘for i in range(15):pygame.draw.line(screen, checkerboard, (40 * i + 40, 40), (40 * i + 40, 600))pygame.draw.line(screen, checkerboard, (40, 40 * i + 40), (600, 40 * i + 40))# 画棋盘边线pygame.draw.line(screen, checkerboard, (40, 40), (600, 40), 5)pygame.draw.line(screen, checkerboard, (40, 40), (40, 600), 5)pygame.draw.line(screen, checkerboard, (600, 40), (600, 600), 5)pygame.draw.line(screen, checkerboard, (40, 600), (600, 600), 5)# 画五个定位点pygame.draw.circle(screen, checkerboard, (160, 160), 6)pygame.draw.circle(screen, checkerboard, (160, 480), 6)pygame.draw.circle(screen, checkerboard, (320, 320), 6)pygame.draw.circle(screen, checkerboard, (480, 160), 6)pygame.draw.circle(screen, checkerboard, (480, 480), 6)# 画‘悔棋’‘重新开始’跟‘退出’按钮pygame.draw.rect(screen, button, [650, 250, 180, 60], 5)pygame.draw.rect(screen, button, [650, 350, 180, 60], 5)pygame.draw.rect(screen, button, [650, 450, 180, 60], 5)s_font = pygame.font.SysFont('方正舒体', 40)text1 = s_font.render("悔棋", True, button)text2 = s_font.render("重新开始", True, button)text3 = s_font.render("退出游戏", True, button)screen.blit(text1, (695, 255))screen.blit(text2, (660, 355))screen.blit(text3, (660, 455))# 绘制棋子(横坐标,纵坐标,屏幕,棋子颜色(1代表黑,2代表白))
def Draw_a_chessman(x, y, screen, color):if color == 1:Black_chess = pygame.image.load("C:\\Users\\23088\\Desktop\\black.png")screen.blit(Black_chess, (40 * x + 40 - 15, 40 * y + 40 - 15))if color == 2:White_chess = pygame.image.load("C:\\Users\\23088\\Desktop\\white.png")screen.blit(White_chess, (40 * x + 40 - 15, 40 * y + 40 - 15))# 悔棋后,绘制带有棋子的棋盘
def Draw_a_chessboard_with_chessman(map, screen):screen.fill(background)Draw_a_chessboard(screen)for i in range(15):for j in range(15):Draw_a_chessman(i, j, screen, map[i][j])# 定义存储棋盘棋子状况的列表,
map = []
for i in range(19):map.append([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])# 清零map列表
def clear():global map  #便于在其余函数进行修改for i in range(19):for j in range(19):map[i][j] = 0# 判断是否胜利
def win(screen,i, j):checkerboard_1=(238,128,141)  #设定画线颜色k = map[i][j]  #利用k存储(i,j)的棋子颜色p = []  #列表中纪录各个方向的棋子情况for a in range(20):p.append(0)for i3 in range(i - 4, i + 5):for j3 in range(j - 4, j + 5):  # 以下是各个方向的情况if (map[i3][j3] == k and i3 - i == j3 - j and i3 <= i and j3 <= j):#左上角斜对角p[0] += 1  if p[0] == 5:  m = i-4n = i-4p = jq = jpygame.draw.line(screen, checkerboard_1, ((m+1)*40,(n+1)* 40), ((p+1)*40,(q+1)* 40), 10)return Trueif (map[i3][j3] == k and j3 == j and i3 <= i and j3 <= j):#中间上面p[1] += 1if p[1] == 5:m = i-4n = jp = iq = jpygame.draw.line(screen, checkerboard_1, ((m+1) * 40, (n+1) * 40), ((p+1) * 40, (q+1) * 40),10)  #画线,从最初的棋子到最后的棋子return Trueif (map[i3][j3] == k and i3 == i and i3 <= i and j3 <= j):#中间左边p[2] += 1if p[2] == 5:m = in = j-4p = iq = jpygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and i3 - i == j3 - j and i3 >= i and j3 >= j):#右下斜对角p[3] += 1if p[3] == 5:m = in = jp = i+4q = j+4pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and j3 == j and i3 >= i and j3 >= j):#中间下边p[4] += 1if p[4] == 5:m = in = jp = i+4q = jpygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and i3 == i and i3 >= i and j3 >= j):#中间右边p[5] += 1if p[5] == 5:m = in = jp = iq = j+4pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and i - i3 == j3 - j and i3 <= i and j3 >= j):#右上斜对角p[6] += 1if p[6] == 5:m = in = jp = i-4q = j+4pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and i3 - i == j - j3 and i3 >= i and j3 <= j):#左下斜对角p[7] += 1if p[7] == 5:m = in = jp = i+4q = j-4pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and j - j3 == i - i3 and i3 <= i + 1 and i3 >= i - 3 and j3 <= j + 1 and j3 >= j - 3):p[8] += 1#西北,右下移1(天蓝)if p[8] == 5:m = i-3n = j-3p = i+1q = j+1pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and j == j3 and i3 <= i + 1 and i3 >= i - 3 and j3 <= j + 1 and j3 >= j - 3):p[9] += 1#列小于i+1(绿黄)if p[9] == 5:m = i-3n = jp = i+1q = jpygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and i == i3 and i3 <= i + 1 and i3 >= i - 3 and j3 <= j + 1 and j3 >= j - 3):p[10] += 1#中间横右移1(深蓝)if p[10] == 5:m = in = j-3p = iq = j+1pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and j - j3 == i - i3 and i3 >= i - 1 and i3 <= i + 3 and j3 >= j - 1 and j3 <= j + 3):p[11] += 1#西北,右下移3(灰)if p[11] == 5:m = i-1n = j-1p = i+3q = j+3pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and j == j3 and i3 >= i - 1 and i3 <= i + 3 and j3 >= j - 1 and j3 <= j + 3):p[12] += 1#中间竖下移3(紫)if p[12] == 5:m = i-1n = jp = i+3q = jpygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and i == i3 and i3 >= i - 1 and i3 <= i + 3 and j3 >= j - 1 and j3 <= j + 3):p[13] += 1#中间横右移3(红)if p[13] == 5:m = in = j-1p = iq = j+3pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and i - i3 == j3 - j and i3 <= i + 1 and i3 >= i - 3 and j3 >= j - 1 and j3 <= j + 3):p[14] += 1#东北,左下移1(紫)if p[14] == 5:m = i-3n = j+3p = i+1q = j-1pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and i3 - i == j - j3 and i3 >= i - 1 and i3 <= i + 3 and j3 <= j + 1 and j3 >= j - 3):p[15] += 1#东北,左下移3(橙)if p[15] == 5:m = i-1n = j+1p = i+3q = j-3pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and j - j3 == i - i3 and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):p[16] += 1#西北,右下移2(紫)if p[16] == 5:m = i-2n = j-2p = i+2q = j+2pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and j == j3 and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):p[17] += 1#中间竖下移2(橙)if p[17] == 5:m = i-2n = jp = i+2q = jpygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and i == i3 and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):p[18] += 1#中间横右移2(橙)if p[18] == 5:m = in = j-2p = iq = j+2pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Trueif (map[i3][j3] == k and i - i3 == j3 - j and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):p[19] += 1 ##东北,左下移2(浅)!!if p[19] == 5:m = i-2n = j+2p = i+2q = j-2pygame.draw.line(screen, checkerboard_1, ((m + 1) * 40, (n + 1) * 40), ((p + 1) * 40, (q + 1) * 40),10)return Truereturn False# 绘制提示器(类容,屏幕,字大小)
def text(s, screen, x):# 先把上一次的类容用一个矩形覆盖pygame.draw.rect(screen, background, [620, 50, 290, 100])# 定义字体跟大小s_font = pygame.font.SysFont('方正舒体', x)# 定义类容,是否抗锯齿,颜色s_text = s_font.render(s, True, button)# 将字放在窗口指定位置screen.blit(s_text, (620, 60))pygame.display.flip()  #更新窗口# 用于控制顺序
t = True# 用于结束游戏后阻止落子
running = True# 主函数
def main():# 将 t,map,running设置为可改的global t, map, running, maps, r, h# 将map置零clear()# 定义储存所有棋盘状态的列表(用于悔棋)map2 = copy.deepcopy(map)maps = [map2]# 定义窗口screen = pygame.display.set_mode([900, 620])# 定义窗口名字pygame.display.set_caption("小小五子棋")# 在窗口画出棋盘,提示器以及按钮Draw_a_chessboard(screen)pygame.display.flip()clock = pygame.time.Clock()play_chess_sound.play(0)while True:# 只有running为真才能落子,主要用于游戏结束后防止再次落子if running:if t:color = 1text('请黑棋落子', screen, 54)  #绘制提示信息else:color = 2text('请白棋落子', screen, 54)  #绘制提示信息for event in pygame.event.get():# 点击x则关闭窗口if event.type == pygame.QUIT:pygame.quit()sys.exit()# 点击窗口里面类容则完成相应指令elif event.type == MOUSEBUTTONDOWN:if event.button == 1:x, y = event.pos[0], event.pos[1]#获取坐标for i in range(15):for j in range(15):# 点击棋盘相应位置if i * 40 + 40 - 20 < x < i * 40 + 40 + 20 and j * 40 + 40 - 20 < y < j * 40 + 40 + 20 and not \map[i][j] and running:# 在棋盘相应位置落相应颜色棋子Draw_a_chessman(i , j , screen, color)# 播放音效# playing_chess_sound.play(0)# 在map里面记录落子位置map[i][j] = color# 将map存入mapsmap3 = copy.deepcopy(map)maps.append(map3)# 判断落子后是否有五子一线if win(screen,i, j):if t:text('     黑棋胜利', screen, 40)s_font = pygame.font.SysFont('方正舒体', 40)# 定义类容,是否抗锯齿,颜色s_text = s_font.render("请重新开始游戏", True, button)# 将字放在窗口指定位置screen.blit(s_text, (620, 130))pygame.display.flip()else:text('     白棋胜利', screen, 40)s_font = pygame.font.SysFont('方正舒体', 40)# 定义类容,是否抗锯齿,颜色s_text = s_font.render("请重新开始游戏", True, button)# 将字放在窗口指定位置screen.blit(s_text, (620, 130))pygame.display.flip()# 播放音效victor_sound.play(0)# 阻止再往棋盘落子running = Falsepygame.display.flip()t = not t# 如果点击‘重新开始’if 650 < x < 830 and 350 < y < 410:# 取消阻止running = True# 播放音效button_sound.play(0)# 重新开始main()# 点击‘退出游戏’,退出游戏elif 650 < x < 830 and 450 < y < 510:# 播放音效button_sound.play(0)pygame.quit()sys.exit()# 点击‘悔棋’elif 650 < x < 830 and 250 < y < 310 and len(maps) != 1:# 播放音效button_sound.play(0)# 删除maps里最后一个元素del maps[len(maps) - 1]# 再将最后一个元素copy给mapmap = copy.deepcopy(maps[len(maps)-1])# 切换顺序t = not t# 将map显示出来Draw_a_chessboard_with_chessman(map, screen)# 悔棋完成,阻止再次悔棋x, y = 0, 0clock.tick(60)  #游戏时钟,每秒60的频率,使得画面连续if __name__ == "__main__":try:main()except SystemExit:passexcept:traceback.print_exc()pygame.quit()input()

图片,音乐在这里啦!!

网盘链接:https://pan.baidu.com/s/1g8acjD2HlozJMFbvn31Jig

提取码:nt9f

利用pygame实现人人对弈五子棋(有其他相关功能)相关推荐

  1. C语言五子棋人人对弈学习笔记

    C语言编写五子棋人人对弈学习笔记 1.头文件#include <conio.h> #include <conio.h>是一个控制输出的头文件. 包含以下函数:textbackg ...

  2. 五子棋人人对弈——Easyx的第一次使用

    从进入计算机专业到现在快一年的时间,没有对C语言等课程多深入的学习,仅仅是掌握了一点皮毛.正好老师让用C语言写一个五子棋小游戏,采用EasyX做界面,我就试着完成五子棋的一些基本功能,也算是自己进行的 ...

  3. Py之pygame:有趣好玩——利用pygame库实现一个移动底座弹球的小游戏

    Py之pygame:有趣好玩--利用pygame库实现一个移动底座弹球的小游戏 目录 输出结果 实现代码 输出结果 实现代码 # -*- coding: utf-8 -*-#Py之pygame:有趣好 ...

  4. Py之pygame:有趣好玩—利用pygame库实现鱼儿自动实时目标跟踪(附完整代码)

    Py之pygame:有趣好玩-利用pygame库实现鱼儿自动实时目标跟踪(附完整代码) 目录 输出结果 实现代码 输出结果 实现代码 #Py之pygame:利用pygame库实现鱼儿自动实时目标跟踪i ...

  5. c++代码好玩_Py之pygame:有趣好玩—利用pygame库实现鱼儿自动实时目标跟踪(附完整代码)...

    Py之pygame:有趣好玩-利用pygame库实现鱼儿自动实时目标跟踪(附完整代码) 目录 输出结果 实现代码 输出结果 ​ 实现代码 #Py之pygame:利用pygame库实现鱼儿自动实时目标跟 ...

  6. pygame小游戏代码_Py之pygame:有趣好玩——利用pygame库实现一个移动底座弹球的小游戏...

    Py之pygame:有趣好玩--利用pygame库实现一个移动底座弹球的小游戏 目录 输出结果 实现代码 输出结果 ​ 实现代码 # -*- coding: utf-8 -*-#Py之pygame:有 ...

  7. python神奇时钟项目_怎么在Python项目中利用Pygame绘制一个时钟

    怎么在Python项目中利用Pygame绘制一个时钟 发布时间:2020-11-30 14:24:30 来源:亿速云 阅读:54 作者:Leah 怎么在Python项目中利用Pygame绘制一个时钟? ...

  8. Python——利用pygame模块制作RPG游戏(一)

    利用pygame模块制作RPG游戏(一) 需要用到的第三方库:pygame 一.构造游戏的基本框架 1.首先准备好相应的游戏素材:背景,人物动作图片,音乐,音效等. 图片均用png格式,音乐音效均用o ...

  9. 铁威马NAS中如何利用Docker安装人人影视教程

    Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare metal. ...

最新文章

  1. 为基于树的机器学习模型构建更好的建模数据集的10个小技巧!
  2. 富士通台式电脑_英特尔X86架构霸权终将崩塌,ARM架构才是未来PC电脑市场的王者?...
  3. ETL工具箱 5提交维表
  4. asp批量生成html静态页面方法
  5. [Bugku][Web][CTF] 30-33 write up
  6. 嵌入式C语言之struct内存分配分析
  7. 华为:对学生定制机毫不知情 将会对虚假宣传追责
  8. mysql二进制日志特点_MySQL二进制日志分析-概述篇
  9. 《Python和Pygame游戏开发指南》——导读
  10. 【小程序入门】注册AppID为开发做准备
  11. Oracle11g创建、删除表空间语句
  12. java微信开发教程,Java微信公众平台开发(1) 接入微信公众平台
  13. Python字符串杂谈
  14. HTML语言剖析15:调色原理
  15. (2)arduino读取电压相对值(模拟读取传感器数值)
  16. 决策树ID3简单实现
  17. NVIDIA安装程序失败 ,win10 RTX3060安装CUDA11.7
  18. ACPI AML debug and override ACPI tables using initrd
  19. 2020香港科大百万奖金创赛总冠军思坦科技赛后即成功融资数千万
  20. java 输出 大小写字母 a-z A-Z

热门文章

  1. IDC、CDN、云服务商如何进行IPv6改造升级?
  2. Centos7中的防火墙调整为firewalld,试一下systemctl stop firewalld关闭防火墙。
  3. vue3.2、vue3和vue2不同之处
  4. 2014年什么行业是最赚钱的
  5. 记账就使用电子记账本 用电脑记录安全放心
  6. Python爬虫练习(一):酷狗飙升榜前200_排行(使用select,find(),find_all()方法)
  7. 华为手机便签删了怎么找回
  8. .cxx\cmake\debug\arm64-v8a\CMakeFiles\CMakeTmp\.ninja_deps: 另一个程序正在使用此文件,进程无法访问
  9. 泰拉瑞亚试图加载不正确的_关于泰拉瑞亚你不知道的几件事
  10. 笔记本键盘帽脱落解决