Pygame第二课:画图

本文详细介绍了Pygame中的坐标系设定、颜色管理以及各种绘图函数,如矩形、线条、圆形、椭圆和多边形的绘制方法,最后给出了一个简单的示例代码。

目录

一、Pygame的坐标系

二、绘图

2.1 颜色

2.2 绘图函数

2.2.1 pygame.draw.rect()

2.2.2 pygame.draw.line()

2.2.3 pygame.draw.circle()

2.2.4 pyame.draw.ellipse()

2.2.5 pygame.draw.polygon()

2.3 显示

三、示例


人生苦短,我用Python!

一、Pygame的坐标系

pygame的坐标系与turtle的坐标系不同,它是以左上角为(0,0)原点,X坐标越往右越大,Y坐标越往下越大,如图1-1所示。

图1-1

二、绘图

2.1 颜色

在pygame中,颜色采用RGB颜色,会保存在一个元组中,第一个代表红色的量,第二个代表绿色的量,第三个代表蓝色的量。如:白色是(255,255,255),黑色是(0,0,0),红色是(255,0,0),绿色是(0,255,0),蓝色是(0,0,255)。

我们通常会提前设置好。示例:

WHITE=(255,255,255)
BLACK=(0,0,0)
RED=(255,0,0)
GREEN=(0,255,0)
BLUE=(0,0,255)

2.2 绘图函数

介绍了颜色设置后,我们话不多说,直接上函数。

2.2.1 pygame.draw.rect()

pygame.draw.rect()函数可以绘画一个矩形,语法如下:

pygame.draw.rect(Surface,color,rect,width)

Surface:窗口,为一个Surface对象。

color:颜色,为RGB色值。

rect:一个元组:第一个是左上角的X坐标,第二个是左上角的Y坐标,第三个是矩形的宽,第四个是矩形的高。

width:粗细,int类型,0表示实心。

2.2.2 pygame.draw.line()

pygame.draw.line()函数可以画一个线条,语法如下:

pygame.draw.line(Surface, color, start_pos, end_pos, width)

Surface:不用说了吧,Surface对象。

color:RGB颜色。

start_pos:起始点:元组(起始点X坐标,起始点Y坐标)。

end_pos:结束点:元组(终点X坐标,终点Y坐标)。

width:粗细,整数表示(int类型)。

2.2.3 pygame.draw.circle()

pygame.draw.circle()函数可以画一个圆,语法如下:

pygame.draw.circle(Surface, color, pos, radius, width)

Surface:不用说了吧,Surface对象。

color:RGB颜色。

pos:圆心坐标(X坐标,Y坐标)。

radius:半径:int类型。

width:粗细,int类型,0表示实心。

2.2.4 pyame.draw.ellipse()

pygame.draw.ellipse()函数可以画一个椭圆形,语法如下:

pygame.draw.ellipse(Surface, color, Rect, width)

Surface:不用说了吧,Surface对象。

color:RGB颜色。

Rect:能围绕这个椭圆形的最小矩形,格式为一个元组:第一个是左上角的X坐标,第二个是左上角的Y坐标,第三个是矩形的宽,第四个是矩形的高。

width:粗细,int类型,0表示实心。

2.2.5 pygame.draw.polygon()

pygame.draw.polygon()函数可以画一个多边形,语法如下:

pygame.draw.polygon(surface, color, points,width)

Surface:不用说了吧,Surface对象。

color:RGB颜色。

points:每个点的坐标,存于一个元组中。

width:粗细,int类型,0表示实心。

2.3 显示

用pygame.display.update()来显示。

三、示例

"""
此程序摘自我的作品
"""
import pygame
pygame.init()
screen=pygame.display.set_mode([1500,1000])
pygame.display.set_caption("绝处逢生")

#设置颜色
DODGERBLUE=(30,144,255)
DODGERBLUE2=(0,114,225)
SPRINGGREEN2=(0,255,140)
BLACK=(10,10,10)
RED=(255,0,0)
WHITE=(255,255,255)

pygame.draw.line(screen, BLACK, (0, 700), (1500, 700), 20)  #画线
pygame.draw.rect(screen, SPRINGGREEN2, (0, 700, 1500, 300), 0)  #画长方形
pygame.draw.rect(screen, RED, (700, 0, 100, 50))  #画长方形
pygame.draw.rect(screen, DODGERBLUE2, (690, -10, 120, 70), 10)  #画长方形

pygame.display.update()

人生苦短,我用Python!

使用Pygame库开发五子棋游戏可以按照以下步骤进行,同时也有相关示例代码逻辑: ### 开发目的与意义 基于Python编程语言和Pygame库开发五子棋小游戏,适合初学者了解Pygame库的应用以及基础的游戏编程逻辑。同时,五子棋作为经典双人对弈游戏,是实践Python编程技巧的良好途径,通过该项目可掌握游戏开发中的关键概念,如图形界面、事件处理、游戏逻辑、用户交互、面向对象编程、状态管理以及优化与调试等,完成五子棋AI设计还能进一步了解搜索算法,对提升编程和游戏设计能力有重要意义[^1][^2]。 ### 开发环境 - 操作系统:Windows10 - Python版本:Python3.6 - 第三方库:Pygame1.9.6 - IDE:PyCharm/Sublime Text [^3] ### 需求分析 开发五子棋游戏需要考虑以下方面: - UI界面:包括玩家与电脑胜负的断定。 - 游戏逻辑:如棋盘、星位和天元网格线、信息文本绘制,鼠标事件的判定等 [^3]。 ### 核心类及函数说明 以Renju类为例: - `__init__()`方法:主要做了几件事,载入资源,建立了`_chessboard`这个棋盘的surface对象;计算棋盘所有落子点的物理坐标,并存放如`points`属性中,`points`是个二维数组,这样`points[i][j]`就可以表示逻辑位置`(i,j)`所对应的物理坐标了;调用`_draw_board()`方法,在`_chessboard`上画格线及标注等 [^4]。 - `drop_at(i,j)`方法:在逻辑位置`(i,j)`落子,至于是落白子和黑子通过Renju类的控制开关`black_turn`来决定。画图,并将已落子信息存入`ball_coord`列表中 [^4]。 - `check_at(i,j)`方法:通过遍历`ball_coord`列表来查看`(i,j)`位置是否能落子 [^4]。 - `check_over()`方法:判断是否存在五子连线的情况,主要通过调用`_check_direct`方法分别判断四个方向上的情况 [^4]。 - `_check_direct(direct)`方法:是判断五子连线的主要逻辑,通过判断最后一颗落子的某个方向落子实现 [^4]。 ### 示例代码框架(伪代码) ```python import pygame # 初始化pygame pygame.init() # 设置窗口大小等 screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("五子棋游戏") # 定义Renju类 class Renju: def __init__(self): # 载入资源,建立棋盘surface对象 self._chessboard = pygame.Surface((800, 600)) # 计算落子点物理坐标 self.points = [[(0, 0) for _ in range(15)] for _ in range(15)] # 调用画格线及标注方法 self._draw_board() self.black_turn = True self.ball_coord = [] def _draw_board(self): # 画格线及标注等逻辑 pass def drop_at(self, i, j): if self.black_turn: # 画黑子 pass else: # 画白子 pass self.ball_coord.append((i, j)) self.black_turn = not self.black_turn def check_at(self, i, j): for coord in self.ball_coord: if coord == (i, j): return False return True def check_over(self): # 调用_check_direct判断四个方向 pass def _check_direct(self, direct): # 判断五子连线逻辑 pass # 创建Renju对象 game = Renju() # 游戏主循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.MOUSEBUTTONDOWN: # 获取鼠标点击位置,转换为逻辑位置(i, j) i, j = 0, 0 # 这里需要实现转换逻辑 if game.check_at(i, j): game.drop_at(i, j) if game.check_over(): print("游戏结束") running = False # 绘制棋盘等 screen.blit(game._chessboard, (0, 0)) pygame.display.flip() # 退出pygame pygame.quit() ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值