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 文件重命名工具代码
Jul 26 Python
Python while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
Python中基本的日期时间处理的学习教程
Oct 16 Python
Python读取一个目录下所有目录和文件的方法
Jul 15 Python
浅析Python pandas模块输出每行中间省略号问题
Jul 03 Python
python实现彩票系统
Jun 28 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
ipython和python区别详解
Jun 26 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
pandas dataframe 中的explode函数用法详解
May 18 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 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中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
nodejs 如何手动实现服务器
2018/08/20 NodeJs
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
python数据结构之链表详解
2017/09/12 Python
python中学习K-Means和图片压缩
2017/11/20 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
大一新生军训时的自我评价分享
2013/12/05 职场文书
会走路的树教学反思
2014/02/20 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
飞越疯人院观后感
2015/06/09 职场文书
孔繁森观后感
2015/06/10 职场文书
光荣之路观后感
2015/06/12 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python
Vue的生命周期一起来看看
2022/02/24 Vue.js