首页 畅享游戏,快乐生活!
手机版
扫描查看手机站

PYTHON人马大战CSDN(python人马大战图)

时间:2023-10-25 13:53:18 编辑:

这篇文章给大家聊聊关于PYTHON人马大战CSDN,以及python人马大战图对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

作者|marble_xu

责编|毛中政

出品|CSDN博客

功能介绍

最近一直在给这个植物大战僵尸游戏添加新的植物和僵尸,因为网上的图片资源有限,能加的植物和僵尸比较少,目前进展如下。

功能实现如下:

支持的植物类型:太阳花,豌豆射手,寒冰射手,坚果,樱桃炸弹。新增加植物:双重豌豆射手,三重豌豆射手,食人花,小喷菇,土豆地雷,倭瓜。

支持的僵尸类型:普通僵尸,棋子僵尸,路障僵尸,铁桶僵尸。新增加读报僵尸。

使用json文件保存关卡信息,设置僵尸出现的时间和位置。

增加每关开始时选择上场植物。

增加除草机。

下面是游戏的截图:

图1:新增的植物和僵尸

图2:每关开始选择上场植物卡片

图3:选择植物在哪里种植

植物卡片选择和种植

如图3所示,游戏中可以种植物的方格一共有45个(有5行,每行9列)。

这篇文章要介绍的是:

上方植物卡片栏的实现。

点击植物卡片,鼠标切换为植物图片。

鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。

完整代码

游戏实现代码的github链接:

https://github.com/marblexu/PythonPlantsVsZombies

这边是csdn的下载链接:

https://download.csdn.net/download/marble_xu/11982275

代码实现

所有的植物卡片的名称和属性都保存在单独的list中,每个listindex都对应一种植物。

比如listindex0就是太阳花:

card_name_list[0]是太阳花卡片的名字,用来获取太阳花卡片的图片。

plant_name_list[0]是太阳花的名字,用来获取太阳花卡片的图片。

plant_sun_list[0]是种植太阳花需要花费的太阳点数。

plant_frozen_time_list[0]是太阳花的冷却时间。

代码在source\component\menubar.py中:

card_name_list=[c.CARD_SUNFLOWER,c.CARD_PEASHOOTER,c.CARD_SNOWPEASHOOTER,c.CARD_WALLNUT,

c.CARD_CHERRYBOMB,c.CARD_THREEPEASHOOTER,c.CARD_REPEATERPEA,c.CARD_CHOMPER,

c.CARD_PUFFMUSHROOM,c.CARD_POTATOMINE,c.CARD_SQUASH]

plant_name_list=[c.SUNFLOWER,c.PEASHOOTER,c.SNOWPEASHOOTER,c.WALLNUT,

c.CHERRYBOMB,c.THREEPEASHOOTER,c.REPEATERPEA,c.CHOMPER,

c.PUFFMUSHROOM,c.POTATOMINE,c.SQUASH]

plant_sun_list=[50,100,175,50,150,325,200,150,0,25,50]

plant_frozen_time_list=[0,5000,5000,10000,5000,5000,5000,5000,8000,8000,8000]

all_card_list=[0,1,2,3,4,5,6,7,8,9,10]

植物卡片类

代码在source\component\menubar.py中,每个植物卡片是一个单独的Card类,用来显示这个植物。

checkMouseClick函数:判断鼠标是否点击到这个卡片;

canClick:判断这个卡片是否能种植(有没有足够的点数,是否还在冷却时间内);

update函数:通过设置图片的透明度来表示这个卡片是否能选择。

classCard:

def__init__(self,x,y,name_index,scale=0.78):

self.loadFrame(card_name_list[name_index],scale)

self.rect=self.image.get_rect

self.rect.x=x

self.rect.y=y

self.name_index=name_index

self.sun_cost=plant_sun_list[name_index]

self.frozen_time=plant_frozen_time_list[name_index]

self.frozen_timer=-self.frozen_time

self.select=True

defloadFrame(self,name,scale):

frame=tool.GFX[name]

rect=frame.get_rect

width,height=rect.w,rect.h

self.image=tool.get_image(frame,0,0,width,height,c.BLACK,scale)

defcheckMouseClick(self,mouse_pos):

x,y=mouse_pos

if(x>=self.rect.xandx<=self.rect.rightand

y>=self.rect.yandy<=self.rect.bottom):

returnTrue

returnFalse

defcanClick(self,sun_value,current_time):

ifself.sun_cost<=sun_valueand(current_time-self.frozen_timer)>self.frozen_time:

returnTrue

returnFalse

defcanSelect(self):

returnself.select

defsetSelect(self,can_select):

self.select=can_select

ifcan_select:

self.image.set_alpha(255)

else:

self.image.set_alpha(128)

defsetFrozenTime(self,current_time):

self.frozen_timer=current_time

defupdate(self,sun_value,current_time):

if(self.sun_cost>sun_valueor

(current_time-self.frozen_timer)<=self.frozen_time):

self.image.set_alpha(128)

else:

self.image.set_alpha(255)

defdraw(self,surface):

surface.blit(self.image,self.rect)

卡片栏类

代码在source\component\menubar.py中,MenuBar类显示图3中的植物卡片栏:

self.sun_value:当前采集的太阳点数;

self.card_list:植物卡片的list;

setupCards函数:遍历初始化__init__函数中传入这个关卡选好的植物卡片list,依次创建Card类,设置每个卡片的显示位置;

checkCardClick函数:检查鼠标是否点击了卡片栏上的某个植物卡片,如果选择了一个可种植的卡片,返回结果。

classMenuBar:

def__init__(self,card_list,sun_value):

self.loadFrame(c.MENUBAR_BACKGROUND)

self.rect=self.image.get_rect

self.rect.x=10

self.rect.y=0

self.sun_value=sun_value

self.card_offset_x=32

self.setupCards(card_list)

defloadFrame(self,name):

frame=tool.GFX[name]

rect=frame.get_rect

frame_rect=(rect.x,rect.y,rect.w,rect.h)

self.image=tool.get_image(tool.GFX[name],*frame_rect,c.WHITE,1)

defupdate(self,current_time):

self.current_time=current_time

forcardinself.card_list:

card.update(self.sun_value,self.current_time)

defcreateImage(self,x,y,num):

ifnum==1:

return

img=self.image

rect=self.image.get_rect

width=rect.w

height=rect.h

self.image=pg.Surface((width*num,height)).convert

self.rect=self.image.get_rect

self.rect.x=x

self.rect.y=y

foriinrange(num):

x=i*width

self.image.blit(img,(x,0))

self.image.set_colorkey(c.BLACK)

defsetupCards(self,card_list):

self.card_list=

x=self.card_offset_x

y=8

forindexincard_list:

x+=55

self.card_list.append(Card(x,y,index))

defcheckCardClick(self,mouse_pos):

result=None

forcardinself.card_list:

ifcard.checkMouseClick(mouse_pos):

ifcard.canClick(self.sun_value,self.current_time):

result=(plant_name_list[card.name_index],card.sun_cost)

break

returnresult

defcheckMenuBarClick(self,mouse_pos):

x,y=mouse_pos

if(x>=self.rect.xandx<=self.rect.rightand

y>=self.rect.yandy<=self.rect.bottom):

returnTrue

returnFalse

defdecreaseSunValue(self,value):

self.sun_value-=value

defincreaseSunValue(self,value):

self.sun_value+=value

defsetCardFrozenTime(self,plant_name):

forcardinself.card_list:

ifplant_name_list[card.name_index]==plant_name:

card.setFrozenTime(self.current_time)

break

defdrawSunValue(self):

self.value_image=getSunValueImage(self.sun_value)

self.value_rect=self.value_image.get_rect

self.value_rect.x=21

self.value_rect.y=self.rect.bottom-21

self.image.blit(self.value_image,self.value_rect)

defdraw(self,surface):

self.drawSunValue

surface.blit(self.image,self.rect)

forcardinself.card_list:

card.draw(surface)

鼠标图片切换

代码在source\state\level.py中,setupMouseImage函数实现鼠标图片切换为选中的植物:

self.mouse_image:根据plant_name获取选中的植物图片;

self.mouse_rect:选中植物图片的位置,在drawMouseShow函数中,需要将植物图片的位置设置成当前鼠标的位置;

pg.mouse.set_visible(False):隐藏默认的鼠标显示,这样效果就是鼠标图片切换为选中的植物了。

defsetupMouseImage(self,plant_name,plant_cost):

frame_list=tool.GFX[plant_name]

ifplant_nameintool.PLANT_RECT:

data=tool.PLANT_RECT[plant_name]

x,y,width,height=data['x'],data['y'],data['width'],data['height']

else:

x,y=0,0

rect=frame_list[0].get_rect

width,height=rect.w,rect.h

ifplant_name==c.POTATOMINEorplant_name==c.SQUASH:

color=c.WHITE

else:

color=c.BLACK

self.mouse_image=tool.get_image(frame_list[0],x,y,width,height,color,1)

self.mouse_rect=self.mouse_image.get_rect

pg.mouse.set_visible(False)

self.drag_plant=True

self.plant_name=plant_name

self.plant_cost=plant_cost

defdrawMouseShow(self,surface):

ifself.hint_plant:

surface.blit(self.hint_image,self.hint_rect)

x,y=pg.mouse.get_pos

self.mouse_rect.centerx=x

self.mouse_rect.centery=y

surface.blit(self.mouse_image,self.mouse_rect)

提示种在哪个方格中

先看下map类,代码在source\component\map.py中:

self.map:二维list,用来保存每个方格的状态。每个entry初始化为0,表示可以种植物,值为1时表示这个方格已经种了植物。

getMapIndex函数:传入参数是游戏中的坐标位置(比如当前鼠标的位置),返回该位置在地图的哪个方格中。

getMapGridPos函数:传入一个方格的index,返回在该方格中种植物的坐标位置。

showPlant函数:根据传入的坐标位置,判断该位置所在的方格是否能种植物,如果能种,就返回返回在该方格中种植物的坐标位置。

MAP_EMPTY=0

MAP_EXIST=1

classMap:

def__init__(self,width,height):

self.width=width

self.height=height

self.map=[[0forxinrange(self.width)]foryinrange(self.height)]

defisValid(self,map_x,map_y):

if(map_x<0ormap_x>=self.widthor

map_y<0ormap_y>=self.height):

returnFalse

returnTrue

defisMovable(self,map_x,map_y):

return(self.map[map_y][map_x]==c.MAP_EMPTY)

defgetMapIndex(self,x,y):

x-=c.MAP_OFFSET_X

y-=c.MAP_OFFSET_Y

return(x//c.GRID_X_SIZE,y//c.GRID_Y_SIZE)

defgetMapGridPos(self,map_x,map_y):

return(map_x*c.GRID_X_SIZE+c.GRID_X_SIZE//2+c.MAP_OFFSET_X,

map_y*c.GRID_Y_SIZE+c.GRID_Y_SIZE//5*3+c.MAP_OFFSET_Y)

defsetMapGridType(self,map_x,map_y,type):

self.map[map_y][map_x]=type

defgetRandomMapIndex(self):

map_x=random.randint(0,self.width-1)

map_y=random.randint(0,self.height-1)

return(map_x,map_y)

defshowPlant(self,x,y):

pos=None

map_x,map_y=self.getMapIndex(x,y)

ifself.isValid(map_x,map_y)andself.isMovable(map_x,map_y):

pos=self.getMapGridPos(map_x,map_y)

returnpos

代码在source\state\level.py中:

canSeedPlant函数:判断当前鼠标位置能否种植物;

setupHintImage函数:如果当前鼠标位置能种植物,且有选择了一个植物卡片,则设置self.hint_image显示当前会在哪一个方格中种植物,self.hint_rect是植物种的坐标位置。

defcanSeedPlant(self):

x,y=pg.mouse.get_pos

returnself.map.showPlant(x,y)

defsetupHintImage(self):

pos=self.canSeedPlant

ifposandself.mouse_image:

if(self.hint_imageandpos[0]==self.hint_rect.xand

pos[1]==self.hint_rect.y):

return

width,height=self.mouse_rect.w,self.mouse_rect.h

image=pg.Surface([width,height])

image.blit(self.mouse_image,(0,0),(0,0,width,height))

image.set_colorkey(c.BLACK)

image.set_alpha(128)

self.hint_image=image

self.hint_rect=image.get_rect

self.hint_rect.centerx=pos[0]

self.hint_rect.bottom=pos[1]

self.hint_plant=True

else:

self.hint_plant=False

编译环境:python3.7+pygame1.9。

原文链接:https://blog.csdn.net/marble_xu/article/details/103100614

版权声明:本文为CSDN博主「marble_xu」的原创文章。

好了,关于PYTHON人马大战CSDN和python人马大战图的问题到这里结束啦,希望可以解决您的问题哈!

热门文章

推荐专题

更多>>

游戏推荐

更多>>