python开发人人对战的五子棋小游戏


Posted in Python onMay 02, 2022

python开发人人对战的五子棋小游戏,供大家参考,具体内容如下

checkerboard.py

from collections import namedtuple

Chessman = 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_points
        self._checkerboard = [[0] * line_points for _ in range(line_points)]

    def _get_checkerboard(self):
        return self._checkerboard

    checkerboard = property(_get_checkerboard)

    # 判断是否可落子
    def can_drop(self, point):
        return self._checkerboard[point.Y][point.X] == 0

    def 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.Value

        if 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 True

    def _get_count_on_direction(self, point, value, x_offset, y_offset):
        count = 1
        for step in range(1, 5):
            x = point.X + step * x_offset
            y = point.Y + step * y_offset
            if 0 <= x < self._line_points and 0 <= y < self._line_points and self._checkerboard[y][x] == value:
                count += 1
            else:
                break
        for step in range(1, 5):
            x = point.X - step * x_offset
            y = point.Y - step * y_offset
            if 0 <= x < self._line_points and 0 <= y < self._line_points and self._checkerboard[y][x] == value:
                count += 1
            else:
                break

        return count >= 5

ManAndMan.py

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)
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('五子棋')

   font1 = pygame.font.SysFont('SimHei', 36)
   font2 = pygame.font.SysFont('SimHei', 72)
   fwidth, fheight = font2.size('黑方获胜')

   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('超出棋盘区域')

       # 画棋盘
       _draw_checkerboard(screen)

       # 画棋盘上已有的棋子
       for i, row in enumerate(checkerboard.checkerboard):
           for j, cell in enumerate(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 + '获胜', RED_COLOR)

       if cur_runner == BLACK_CHESSMAN:
           print_text(screen, font1, RIGHT_INFO_POS_X, Start_X, '获胜' if winner else '落子中', BLUE_COLOR)
       else:
           print_text(screen, font1, RIGHT_INFO_POS_X, Start_X + Stone_Radius2 * 3, '获胜' if winner else '落子中', BLUE_COLOR)

       pygame.display.flip()


# 画棋盘
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 = 5
           else:
               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_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 // SIZE
   if pos_x % SIZE > Stone_Radius:
       x += 1
   if pos_y % SIZE > Stone_Radius:
       y += 1
   if x >= Line_Points or y >= Line_Points:
       return None

   return Point(x, y)


if __name__ == '__main__':
   main()

python开发人人对战的五子棋小游戏

以上就是本文的全部内容,希望对大家的学习有所帮助。


Tags in this post...

Python 相关文章推荐
python zip文件 压缩
Dec 24 Python
详解python中的json的基本使用方法
Dec 21 Python
python+opencv轮廓检测代码解析
Jan 05 Python
用Django实现一个可运行的区块链应用
Mar 08 Python
Python从Excel中读取日期一列的方法
Nov 28 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
Django操作session 的方法
Mar 09 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
Python面向对象之内置函数相关知识总结
Jun 24 Python
移除Selenium中window.navigator.webdriver值
Jun 10 Python
python语言中pandas字符串分割str.split()函数
Aug 05 Python
python pygame 开发五子棋双人对弈
May 02 #Python
Python开发简易五子棋小游戏
May 02 #Python
Python开发五子棋小游戏
python获取带有返回值的多线程
May 02 #Python
总结三种用 Python 作为小程序后端的方式
Python如何用re模块实现简易tokenizer
May 02 #Python
Python实现简单得递归下降Parser
You might like
php cookie 登录验证示例代码
2009/03/16 PHP
PHP中数组的分组排序实例
2014/06/01 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Python删除空文件和空文件夹的方法
2015/07/14 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
win7 x64系统中安装Scrapy的方法
2018/11/18 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
vue常用指令代码实例总结
2020/03/16 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
Java工程师面试集锦之Spring框架
2013/06/16 面试题
商场客服专员岗位职责
2014/06/13 职场文书
2015年派出所工作总结
2015/04/24 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
使用nginx配置访问wgcloud的方法
2021/06/26 Servers