大家好,我是梦执,对梦执着。希望能和大家共同进步!

五子棋对战-所有文件文末自取

  • 前言

    • 人人对战

      • 动态演示
      • 源码分享
        • cheackboard.py
        • 人人对战.py
          • 导入模块
          • 设置棋盘和棋子参数
          • 局内字体设置
          • 落子循坏体
          • 画棋盘
          • 画棋子
          • 运行框返回落子坐标
          • 执行文件
    • 人机对战
      • 动态演示
    • all源码自取

前言

快520了,咱们来玩玩五子棋陶冶情操。快拿这个和你女朋友去对线。(分了别来找我哇)。多的不说直接进入正题

人人对战

游戏规则:p1为黑子,p2为白子,黑子先手,一方达到五子相连即为获胜。

动态演示

源码分享

cheackboard.py

定义黑白子,落子位置以及获胜规则。

from collections import namedtupleChessman = namedtuple('Chessman', 'Name Value Color')
Point = namedtuple('Point', 'X Y')BLACK_CHESSMAN = Chessman('黑子', 1, (45, 45, 45))
WHITE_CHESSMAN = Chessman('白子', 2, (219, 219, 219))offset = [(1, 0), (0, 1), (1, 1), (1, -1)]class Checkerboard:def __init__(self, line_points):self._line_points = line_pointsself._checkerboard = [[0] * line_points for _ in range(line_points)]def _get_checkerboard(self):return self._checkerboardcheckerboard = property(_get_checkerboard)# 判断是否可落子def can_drop(self, point):return self._checkerboard[point.Y][point.X] == 0def drop(self, chessman, point):"""落子:param chessman::param point:落子位置:return:若该子落下之后即可获胜,则返回获胜方,否则返回 None"""print(f'{chessman.Name} ({point.X}, {point.Y})')self._checkerboard[point.Y][point.X] = chessman.Valueif self._win(point):print(f'{chessman.Name}获胜')return chessman# 判断是否赢了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 Truedef _get_count_on_direction(self, point, value, x_offset, y_offset):count = 1for step in range(1, 5):x = point.X + step * x_offsety = point.Y + step * y_offsetif 0 <= x < self._line_points and 0 <= y < self._line_points and self._checkerboard[y][x] == value:count += 1else:breakfor step in range(1, 5):x = point.X - step * x_offsety = point.Y - step * y_offsetif 0 <= x < self._line_points and 0 <= y < self._line_points and self._checkerboard[y][x] == value:count += 1else:breakreturn count >= 5

人人对战.py

导入模块

如出现模块的错误,在pycharm终端输入如下指令。

pip install 相应模块 -i https://pypi.douban.com/simple

import sys
import 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)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', 32)font2 = pygame.font.SysFont('SimHei', 72)fwidth, fheight = font2.size('黑方获胜')checkerboard = Checkerboard(Line_Points)cur_runner = BLACK_CHESSMANwinner = Nonecomputer = AI(Line_Points, WHITE_CHESSMAN)black_win_count = 0white_win_count = 0

落子循坏体

    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 = Nonecur_runner = BLACK_CHESSMANcheckerboard = 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 += 1cur_runner = _get_next(cur_runner)else:black_win_count += 1else:print('超出棋盘区域')

画棋盘

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 = 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)

画棋子

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_Xpos_y = click_pos[1] - Start_Yif pos_x < -Inside_Width or pos_y < -Inside_Width:return Nonex = pos_x // SIZEy = 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 Nonereturn Point(x, y)

执行文件

if __name__ == '__main__':main()

人机对战

动态演示

all源码自取

五子棋人机对战和人人对战的源码网盘自取:点击提取,提取码5201

python实现五子棋-人机对战/人人对战(动图演示+源码分享)相关推荐

  1. 用python实现植物大战僵尸(游戏截图+动态演示+源码分享)

    大家好,我是梦执,对梦执着.希望能和大家共同进步! 下面给大家带来python实现植物大战僵尸的的源码分享,只含有冒险模式. 截图+动态演示+源码分享 游戏截图 动态演示 源码分享 state/too ...

  2. 当我学会Python之后,画画是这样的《哆啦A梦》源码分享

    Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行 ...

  3. Python实现五子棋:人机对战 / 人人对战(动图演示)

    前言 过完520,咱们来玩玩五子棋陶冶情操.快拿这个和你女朋友去对线.(分了别来找我哇).多的不说直接进入正题 人人对战 游戏规则:p1为黑子,p2为白子,黑子先手,一方达到五子相连即为获胜. 动态演 ...

  4. 【Python游戏】Python基于pygame实现的人机大战的斗兽棋小游戏 | 附源码

    前言 有粉丝说要我出一期Python版本的斗兽棋,今天宠粉狂魔的我不就来啦!! 虽然是一个简单的小游戏,但是对于新手小伙伴来说还是有一定的小难度的哟!要是不理解都可以找到小编的哈!! 相关文件 关注小 ...

  5. [智慧农业]Python基于改进YOLOv5的猕猴桃叶病害检测系统(完整源码&数据集&视频教程)

    1.背景 现如今由于农作物病虫害的多样性和复杂性,在特定的条件下其很容易在大范围内发生,导致农产品产量急剧下降.因此,预防和监测农作物病虫害已成为农业生产活动中的重要环节.当前,耕地面积逐渐减少,世界 ...

  6. 十大经典排序算法Python版实现(附动图演示)

    来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...

  7. 一文读懂Python版的十大经典排序算法(附动图演示)

    来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...

  8. 【Python工具】Python版本的天眼查,是不是就很nice啦 | 附带源码

    相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 公众号:Python日志 可以关注小编公众号,会不定时的发布一下Python小技巧,还有很多资源可以免费领取哟!! 源码领取:加Pyth ...

  9. 微信小程序:王者战力查询改名工具箱小程序源码

    今天分享一款战力查询小程序源码, 微信端QQ苹果安卓四端端战力查询 带改名工具,空白名.重复名.符号名改名小程序源码 带流量主广告位,带激励视频广告位,界面精美,无需服务器后台. 至于更多,就大家自行 ...

  10. 计算机毕业设计Python+uniapp基于微信小程序某企业考勤系统(小程序+源码+LW)

    计算机毕业设计Python+uniapp基于微信小程序某企业考勤系统(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ ...

最新文章

  1. YOLO算法最全综述:从YOLOv1到YOLOv5
  2. 1.spring boot要求最低jdk1.8,平安默认1.6问题,-》安装JDK1.8 2.maven 3.3.3要求最低jdk1.7-安装jdk 1.8...
  3. libevent中的缓冲区(二)
  4. Libsvm的一些说明帮助吧
  5. 安装Ubuntu 20.04.1 LTS (Focal Fossa)到U盘并安装ros2
  6. (Android第一行代码)活动的启动模式
  7. 看完后震惊!清华“姚班”创始人的老师究竟有多牛?他说孩子最应该培养这几个思维……...
  8. 一元运算符重载 前置和后置++ --(这种一般用成员函数来实现重载)
  9. 体重 年龄 性别 身高 预测鞋码_孩子身高低于同龄人就说明发育迟缓?这个简单公式可以算出来...
  10. 改进一个asp.net通用分页显示辅助类
  11. win乌班图双系统安装(win11、Ubuntu20.04)及安装后的环境、软件配置
  12. C语言编译器(C语言编程软件)完全攻略
  13. Linux中访问tomcat方式,linux软连接_Linux中为Tomcat启用软链接的三种方式
  14. 英特尔服务器主板g41性能,英特尔g41显卡好用吗 英特尔g41显卡评测【详解】
  15. 马化腾:与CNTV合作是产业的延展
  16. Springboot开关柜综合监测信息查询系统毕业设计-附源码191550
  17. HTML ASP VBSCRIPT JAVASCRIPT SKILLS 常见问题
  18. Excel的最大行数
  19. 孩子兄弟存储结构的几个统计算法实现
  20. 某金服银行存管分布式架构设计

热门文章

  1. 我java启蒙老师 郝斌老师
  2. 海量计算机入门视频教程
  3. dsp2812 pmsm foc之中断初始化
  4. java beanshell_使用beanshell实现JAVA代码动态运行
  5. 国产谷歌地球,地形分析秒杀同款地图软件
  6. 简述计算机网络的五层协议体系结构,计算机网络五层协议体系结构分别是什么...
  7. 初写数学建模论文 -- 摸鱼1
  8. 请启动windows零配置(wzc)服务
  9. PHP第一季视频教程.李炎恢.学习笔记(二)(第2章 基本语法(1))
  10. 怎么样使prestashop 运行速度更快