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 获取et和excel的版本号
Apr 09 Python
Python中格式化format()方法详解
Apr 01 Python
Python语言生成水仙花数代码示例
Dec 18 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Python微信操控itchat的方法
May 31 Python
简单了解Python matplotlib线的属性
Jun 29 Python
python多线程实现TCP服务端
Sep 03 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
基于Keras的格式化输出Loss实现方式
Jun 17 Python
python3 中时间戳、时间、日期的转换和加减操作
Jul 14 Python
python opencv角点检测连线功能的实现代码
Nov 24 Python
python源码剖析之PyObject详解
May 18 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
Search Engine Friendly的URL设计
2006/10/09 PHP
PHP 已经成熟
2006/12/04 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
Django框架下在视图中使用模版的方法
2015/07/16 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
python如何让类支持比较运算
2018/03/20 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
Python语言进阶知识点总结
2019/05/28 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
2019年分享net面试的经历和题目
2016/08/07 面试题
职称自我鉴定
2013/10/15 职场文书
商场端午节活动方案
2014/01/29 职场文书
企业总经理任命书
2014/06/05 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
倡议书怎么写?
2019/04/11 职场文书
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
python可视化之颜色映射详解
2021/09/15 Python
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS