建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

lsong13

发帖: 3粉丝: 0

发消息 + 关注

发表于2020年05月04日 21:16:08 1473 1
直达本楼层的链接
楼主
显示全部楼层
[大赛专区] 赛道一python地图绘制分享(赛道一)

刚刚仓库丢了,现在补上

用pygame绘制,随机产生数据可以跑,但是与程序的连接还没完成,后天结束了,怕是完成不了了,对地图有兴趣的朋友可以试试看。坐标和口罩数量随机生成可以显示。

图片素材在附近,从每日pk上下载来的。

首先,导包,初始化变量。

import random
import pygame
from pygame.color import THECOLORS
pic=['./pic/xq.png','./pic/jzxq.png','./pic/kdy.png'] #需求小区,捐赠小区,快递员图片
xqxq=[[1,5],[6,6],[2,5],[8,9]] #需求小区坐标
jzxq=[[1,9],[11,11],[11,9]]#捐赠小区坐标
xqsl=[-200,-111,-40,-99,-41]#数量
jzsl=[100,100,11]#捐赠数量
cangku=[3,3]

初始化pygame界面,建立快递员,小区的类。

pygame.init()
class ck(pygame.sprite.Sprite):#仓库
    def __init__(self,top,left):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(pic[3])
        self.image=pygame.transform.scale(self.image, (52, 52))
        self.rect = self.image.get_rect()
        self.rect.left = left*50
        self.rect.top = top*50
        self.num=100
class kdy(pygame.sprite.Sprite):#快递员
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(pic[2])
        self.image=pygame.transform.scale(self.image, (52, 52))
        self.rect = self.image.get_rect()
        self.rect.left = 0#快递员的位置,与华为题目一致,x为东西,原点在左上角
        self.rect.top = 0
        self.num=100 #快递员目前有多少口罩,要在图上显示
    def move(self, top,left):#快递员位置改变的方法

        self.rect.left = left*50
        self.rect.top = top*50
    def get(self,num):
        self.num=num
class xq(pygame.sprite.Sprite):
    def __init__(self,top,left):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(pic[0])
        self.image=pygame.transform.scale(self.image, (51, 51))
        self.rect = self.image.get_rect()
        self.rect.left = left*50
        self.rect.top = top*50
        self.num=-100#需求小区的需求数量
    def move(self, num):
        self.num=num#改变目前所需口罩数量
class jz(pygame.sprite.Sprite):
    def __init__(self,top,left):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(pic[1])
        self.image=pygame.transform.scale(self.image, (51, 51))
        self.rect = self.image.get_rect()
        self.rect.left = left*50#捐赠小区位置
        self.rect.top = top*50
        self.num=100#捐赠数量
    def move(self, num):
        self.num = num#改变数量
kdy=kdy()#实例化快递员
ck=ck(cangku[0],cangku[1])

继续初始化pygame

size = width,height = 600,600
screen = pygame.display.set_mode(size)
pygame.display.set_caption('postman')
clock = pygame.time.Clock()
def draw():
    for i in range(0,12,2):
        for j in range(0,12,2):
            pygame.draw.rect(screen, [0,255,100],[i*50,j*50,50,50],0)
    for i in range(1,12,2):
        for j in range(1,12,2):
            pygame.draw.rect(screen, [0,255,100],[i*50,j*50,50,50],0)
    for i in range(1,12,2):
        for j in range(0,12,2):
            pygame.draw.rect(screen, [0,240,100],[i*50,j*50,50,50],0)
    for i in range(0,12,2):
        for j in range(1,12,2):
            pygame.draw.rect(screen, [0,240,100],[i*50,j*50,50,50],0)
draw()#绘制地图,不含小区和快递员
xq_font = pygame.font.Font(None, 30)#初始化显示的文本
def animate():#重新绘制界面
    #先绘制地图,再绘制需求小区,捐赠小区,再更新数量的文本显示,把仓库也画上
    draw()
    for i in xqzb:
        screen.blit(i.image, i.rect)
    for i in jzzb:
        screen.blit(i.image, i.rect)
    xqxs = []  # 需求数量显示
    jzxs = []  # 捐赠数量显示
    for i in range(len(xqxq)):
        xqxs.append(xq_font.render(str(xqzb.num), 1, THECOLORS['black']))
    for i in range(len(jzxq)):
        jzxs.append(xq_font.render(str(jzzb.num), 1, THECOLORS['white']))
    for i in range(len(xqxs)):
        screen.blit(xqxs,[xqxq[1]*50,xqxq[0]*50])
    for i in range(len(jzxs)):
        screen.blit(jzxs,[jzxq[1]*50,jzxq[0]*50])
    screen.blit(kdy.image, kdy.rect)#重新绘制快递员并更新数量
    screen.blit(xq_font.render(str(kdy.num), 1, THECOLORS['white']), kdy.rect)
    screen.blit(ck.image, ck.rect)
    pygame.display.flip()#刷新界面
running = True
while running:#开始循环刷新地图
    b=random.randint(1,12)#随机增加捐赠小区
    if b >10:
        jzxq.append([b,b,b])
    xqzb = []  # 需求小区类的实现,5个实现写到列表里保存
    jzzb = []  # 捐赠小区类的实现,同列表保存
    for i in range(len(xqxq)):
        xqzb.append(xq(xqxq[0], xqxq[1]))
    for i in range(len(jzxq)):
        jzzb.append(jz(jzxq[0], jzxq[1]))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:#如果点退出,就关闭界面
             running = False
    
    a=random.randint(1,11)#以下同于改变文本显示的口罩数量
    for i in range(len(xqzb)):
        xqzb.num=a*10
    for i in range(len(jzzb)):
        jzzb.num=a*11
    clock.tick(3)#控制帧速率
    kdy.move(a,a)#快递员的位置改变,直接给坐标,如(1,2)
    animate()#调用方法,刷新地图和房子,快递员等
pygame.quit()

1588598808(1).png



picture.zip 19.67 KB,下载次数:9

举报
分享

分享文章到朋友圈

分享文章到微博

lsong13

发帖: 3粉丝: 0

发消息 + 关注

发表于2020年05月04日 22:00:21
直达本楼层的链接
沙发
显示全部楼层

pic和需求小区少写了一个,加上路径和坐标就好了

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册