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字符转换
Sep 06 Python
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
Jan 05 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
详解Python自建logging模块
Jan 29 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
Python实现多进程的四种方式
Feb 22 Python
python的re模块使用方法详解
Jul 26 Python
python快速编写单行注释多行注释的方法
Jul 31 Python
Django实现简单网页弹出警告代码
Nov 15 Python
python实现控制台输出彩色字体
Apr 05 Python
Python eval函数原理及用法解析
Nov 14 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将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
jQuery实现全选、反选和不选功能
2017/08/16 jQuery
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
Python开发编码规范
2006/09/08 Python
python的类变量和成员变量用法实例教程
2014/08/25 Python
Python常用模块介绍
2014/11/21 Python
Python函数的周期性执行实现方法
2016/08/13 Python
Python中字典和集合学习小结
2017/07/07 Python
numpy.random.seed()的使用实例解析
2018/02/03 Python
python OpenCV学习笔记直方图反向投影的实现
2018/02/07 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
StubHub德国:购买和出售门票
2017/09/06 全球购物
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
酒店办公室文员岗位职责
2013/12/18 职场文书
档案接收函
2014/01/13 职场文书
开业庆典策划方案
2014/02/18 职场文书
个人课题方案
2014/05/08 职场文书
负责人任命书范本
2014/06/04 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
旅行社计调工作总结
2015/08/12 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库