闲来无聊,想来玩玩以前的魔塔60层小游戏并看看其实现机制,发现网上这种资源挺少的,于是有了自己开发的想法,用的主要是python的pygame模块。

本次开发暂时只有魔塔第一层的内容,后面的部分有时间再继续完成 (地图太多了不想手算坐标)

1.首先设计好游戏界面

我这里设计的游戏界面是大小19*13的,其中游戏区域为13*13(数数看是11格加上一层padding),左侧3*13放个人信息,右侧3*13放宝物信息。(注意,这里将一个像素块定义为50*50大小的,主要是方便计算后面的坐标)

#初始化及设置
pygame.init()
pygame.mixer.init()#初始化混音器模块size = width , height = 950 , 650
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Tower")

2.加载一些素材

wall = pygame.transform.scale(pygame.image.load('w1.PNG').convert_alpha(),(50,50))#背景音乐
pygame.mixer.music.load("鸡你太美.mp3")
pygame.mixer.music.set_volume(0.02)#设置音量
#pygame.mixer.music.play(-1)#循环播放(第一个参数为播放次数【-1表示循环】,第二个为从第n秒开始播放)
#设定变量用于判断开关音乐
musicPlaying = False
#音效sound:打怪,开门,通关等
sound0 = pygame.mixer.Sound("0.wav")#等待1秒让mixer完成初始化
pygame.time.delay(1000)#伞兵一号卢本伟准备就绪
sound0.set_volume(0.5)
sound0.play()#加载字体
my_fontCH = pygame.font.Font("简体.ttf", 40)
my_fontCHs = pygame.font.Font("简体.ttf", 30)
my_fontEN = pygame.font.Font("times.ttf", 40)#最上面一格                                                                             "
text_surface0 = my_fontCH.render("守护全世界最好的坤坤", True, (0,0,0), (191,191,191))#加载属性框(侧边栏)
#矩形的四个参数left,top,width,height
att_rect1 = pygame.Rect(0,50,200,600)
att_rect2 = pygame.Rect(750,50,200,600)
att_rect3 = pygame.Rect(200,600,550,50)
att_rect4 = pygame.Rect(0,0,950,50)#获取钥匙图片所在位置的矩形对象
ykey_rect = ykey.get_rect()
ykey_rect.left,ykey_rect.top = 0,400
bkey_rect = bkey.get_rect()
bkey_rect.left,bkey_rect.top = 0,450
rkey_rect = rkey.get_rect()
rkey_rect.left,rkey_rect.top = 0,500
#电梯位置的矩形对象
up_lift_rect    = pygame.Rect(770,100,40,20)
down_lift_rect  = pygame.Rect(770,120,40,20)

大部分加载素材的代码都略过了,大同小异

值得注意的是,这里把边框栏设置完成了,不过现在只有他们的图片已经对应的矩形对象。(后面可以通过判定鼠标与矩形对象的碰撞来判定事件的发生)

3.定义人物类

class character:def __init__(self,tuple):#位置信息self.floor = 1#self.direction = "UP"#self.location = (7,12)#属性信息self.attack = tuple[0]self.defend = tuple[1]self.life   = tuple[2]self.gold   = 0#物品栏self.property = {"Yellow_key":0,"Blue_key":0,"Red_key":0}#图像self.image = pygame.transform.scale(pygame.image.load('character.PNG').convert_alpha(),(50,50))self.bg = pygame.transform.scale(pygame.image.load('w2.PNG').convert_alpha(),(50,50))self.image_rect = self.image.get_rect()self.image_rect.left = 450self.image_rect.top = 550#def save(self):#f=open("Archive.txt","wb")#pickle.dump(f,{"floor":self.floor,"attack":self.attack,"defend":self.defend,"life":self.life,"Yellow_key":self.property["Yellow_key"],"Blue_key":self.property["Blue_key"],"Red_key":self.property["Red_key"]})#def load(self):#pass#墙壁以及门在没有对应钥匙时的不可通过机制写在移动函数的判定里了def move(self,str):if str == "UP":FORBID = 0rect_new = self.image_rect.copy()rect_new.move_ip(0,-50)#是否撞墙for wall_ in wallL[:]:if rect_new.colliderect(wall_):FORBID = 1#是否在没有钥匙的时候通过门(暂时只有黄门)    for y_door in ydoorL[:]:if rect_new.colliderect(y_door) and self.property["Yellow_key"] == 0:FORBID = 1#打不过怪时不可通过for monster_ in list_morect[:]:if rect_new.colliderect(monster_):x = list_morect.index(monster_)if(fight(CAIXUKUN,eval(list_moname[x] + "_"),1)) == [0]:sound5.play()FORBID = 1if FORBID == 1:passelse :           #判断是否出界if self.image_rect.top < 100:passelse :self.image_rect.move_ip(0,-50)if str == "DOWN":FORBID = 0rect_new = self.image_rect.copy()rect_new.move_ip(0,50)#是否撞墙for wall_ in wallL[:]:if rect_new.colliderect(wall_):FORBID = 1#是否在没有钥匙的时候通过门(暂时只有黄门)    for y_door in ydoorL[:]:if rect_new.colliderect(y_door) and self.property["Yellow_key"] == 0:FORBID = 1#打不过怪时不可通过for monster_ in list_morect[:]:if rect_new.colliderect(monster_):x = list_morect.index(monster_)if(fight(CAIXUKUN,eval(list_moname[x] + "_"),1)) == [0]:sound5.play()FORBID = 1if FORBID == 1:passelse :          #判断是否出界if self.image_rect.bottom > 550:passelse :self.image_rect.move_ip(0,50)if str == "LEFT":FORBID = 0rect_new = self.image_rect.copy()rect_new.move_ip(-50,0)#是否撞墙for wall_ in wallL[:]:if rect_new.colliderect(wall_):FORBID = 1#是否在没有钥匙的时候通过门(暂时只有黄门)    for y_door in ydoorL[:]:if rect_new.colliderect(y_door) and self.property["Yellow_key"] == 0:FORBID = 1#打不过怪时不可通过for monster_ in list_morect[:]:if rect_new.colliderect(monster_):x = list_morect.index(monster_)if(fight(CAIXUKUN,eval(list_moname[x] + "_"),1)) == [0]:sound5.play()FORBID = 1                    if FORBID == 1:passelse :         #判断是否出界if self.image_rect.left < 250:passelse :self.image_rect.move_ip(-50,0)if str == "RIGHT":FORBID = 0rect_new = self.image_rect.copy()rect_new.move_ip(50,0)#是否撞墙for wall_ in wallL[:]:if rect_new.colliderect(wall_):FORBID = 1#是否在没有钥匙的时候通过门(暂时只有黄门)    for y_door in ydoorL[:]:if rect_new.colliderect(y_door) and self.property["Yellow_key"] == 0:FORBID = 1#打不过怪时不可通过for monster_ in list_morect[:]:if rect_new.colliderect(monster_):x = list_morect.index(monster_)if(fight(CAIXUKUN,eval(list_moname[x] + "_"),1)) == [0]:sound5.play()FORBID = 1if FORBID == 1:passelse :        #判断是否出界if self.image_rect.right > 700:passelse :self.image_rect.move_ip(50,0)

这里我本想设置人物的形象随方向的改变而变化,实现转向的效果,无奈坤坤的照片我只有这样一张,后来觉得麻烦删了。

这里代码比较繁多的原因是我把人物移动的判定机制写进去了:

  • 不可移动到游戏区域外
  • 不可通过墙壁
  • 打不过怪的时候不能通过
  • 没有钥匙的时候不能通过

4.定义怪物类

怪物类就简单很多了,因为他们不涉及移动物品等等(没错我就是馋它金币)...

#怪物类:
class monster:def __init__(self,tuple):#属性信息self.attack = tuple[0]self.defend = tuple[1]self.life   = tuple[2]#获取金币数self.gold   = tuple[3]

这样我们初步定义一下人物和一些怪物

CAIXUKUN = character((10,10,100))
gSlime_   = monster((11,5,10,1))
rSlime_   = monster((12,5,10,2))
sBat_     = monster((13,5,10,3))
bWizard_  = monster((15,5,10,5))
Skeleton_ = monster((20,11,10,8))
scSkeleton_ = monster((25,11,10,10))

5.设计地图

这是整个开发过程中碰到最烦的事情了,而且不小心就会出现很多bug

###设计第一层的地图#先铺地板:范围从(200,50)到(700,550)
ground_L = []
for i in range(4,14+1) :#加1是因为range不包含最后一个数for j in range(1,11+1):ground_L.append((50*i,50*j))#墙壁的位置(矩形的左上角(left,top))
wall_L = [(200,100),(250,100),(300,100),(350,100),(400,100),(450,100),(500,100),(550,100),(600,100),(650,100),(450,150),(650,150),(350,200),(450,200),(650,200),(200,250),(300,250),(350,250),(450,250),(500,250),(550,250),(650,250),(350,300),(650,300),(350,350),(450,350),(500,350),(550,350),(600,350),(650,350),(200,400),(300,400),(350,400),(350,450),(400,450),(500,450),(550,450),(600,450),(700,450),(350,500),(550,500),(350,550),(550,550)]
#黄门的位置
dict_door = {(350,150):"yellow",(250,250):"yellow",(600,250):"yellow",(450,300):"yellow",(250,400):"yellow",(450,450):"yellow",(650,450):"yellow"}
#宝物的位置
dict_trea = {(550,150):"ykey",(200,350):"ykey",(300,500):"ykey",(400,500):"ykey",(300,550):"ykey",(200,150):"rbottle",(200,500):"rbottle",(200,550):"rbottle",(550,200):"rbottle",(650,550):"bbottle",(500,150):"rgem",(500,200):"bgem"}
#楼梯的位置
dict_stair = {(200,50):"up"}
#怪物的位置
dict_monster = {(300,50):"gSlime",(400,50):"gSlime",(600,550):"gSlime",(700,550):"gSlime",(350,50):"rSlime",(500,300):"sBat",(600,300):"sBat",(650,500):"sBat",(550,300):"bWizard",(250,300):"Skeleton",(250,450):"scSkeleton"}
#神秘位置
Guide = [(500,500)]
Lift =  [(250,550)]
#设置变量判断是否拿到电梯,初始化为0
get_lift = 0##转化为专一的list
#门
List_temp1 = [k for k,v in dict_door.items() if v=="yellow"]
#楼梯
List_temp2 = [k for k,v in dict_stair.items() if v=="up"]
#宝物
List_temp3 = [k for k,v in dict_trea.items() if v=="rbottle"]
List_temp4 = [k for k,v in dict_trea.items() if v=="bbottle"]
List_temp5 = [k for k,v in dict_trea.items() if v=="rgem"]
List_temp6 = [k for k,v in dict_trea.items() if v=="bgem"]
List_temp7 = [k for k,v in dict_trea.items() if v=="ykey"]
#怪物
#见下方的list_molocation##创建矩形对象的列表,用于判定遇到事件
#记住tuple下标也是从零开始计算
def build_List(LIST1,LIST2):for i in range(1,len(LIST2)+1):LIST1.append( pygame.Rect(LIST2[i-1][0],LIST2[i-1][1],50,50) )wallL = []
build_List(wallL,wall_L)  ydoorL = []
build_List(ydoorL,List_temp1)    stairupL = []
build_List(stairupL,List_temp2)  rbottleL = []
build_List(rbottleL,List_temp3)bbottleL = []
build_List(bbottleL,List_temp4)rgemL = []
build_List(rgemL,List_temp5)bgemL = []
build_List(bgemL,List_temp6)ykeyL = []
build_List(ykeyL,List_temp7)#怪物的不想一个个写了,直接写成字典(矩形对象:怪物名)
##上面的构象失败了,因为矩形对象无法哈希化,即不能放入字典,那么只能用两个列表代替了
list_molocation =list(dict_monster)
list_moname = list(dict_monster.values())
list_morect = []
build_List(list_morect ,list_molocation)#特殊位置和宝物的全部是单独的列表
guideL = []
guideL.append( pygame.Rect(Guide[0][0],Guide[0][1],50,50) )liftL = []
liftL.append( pygame.Rect(Lift[0][0],Lift[0][1],50,50) )

这里总感觉自己写的不太好,等到写第二层的时候再优化优化

6.pygame事件循环

算是最重要的地方了

while True:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_w:#向上移动一格CAIXUKUN.move("UP")if event.key == pygame.K_s:#向下移动一格CAIXUKUN.move("DOWN")if event.key == pygame.K_a:#向左移动一格CAIXUKUN.move("LEFT")if event.key == pygame.K_d:#向右移动一格CAIXUKUN.move("RIGHT")if event.key == pygame.K_p:if musicPlaying:pygame.mixer.music.stop()else:pygame.mixer.music.play(-1)#更换变量状态musicPlaying = not musicPlayingif event.key == pygame.K_1:sound0.play()#设置一个简单的外挂,鼠标左键点击钥匙图标可以+1钥匙,右键-1,中键归0elif event.type == pygame.MOUSEBUTTONDOWN:#检测鼠标的单击位置是否在钥匙的rect内if ykey_rect.collidepoint(event.pos):if event.button == 1:CAIXUKUN.property["Yellow_key"] += 1sound4.play()elif event.button == 2:CAIXUKUN.property["Yellow_key"]  = 0elif event.button == 3:CAIXUKUN.property["Yellow_key"] -= 1   elif bkey_rect.collidepoint(event.pos):if event.button == 1:CAIXUKUN.property["Blue_key"] += 1sound4.play()elif event.button == 2:CAIXUKUN.property["Blue_key"]  = 0elif event.button == 3:CAIXUKUN.property["Blue_key"] -= 1 elif rkey_rect.collidepoint(event.pos):if event.button == 1:CAIXUKUN.property["Red_key"] += 1sound4.play()elif event.button == 2:CAIXUKUN.property["Red_key"]  = 0elif event.button == 3:CAIXUKUN.property["Red_key"] -= 1#电梯功能elif up_lift_rect.collidepoint(event.pos):if event.button == 1 and get_lift and CAIXUKUN.floor < 66 and CAIXUKUN.floor != 42:#其实还要增加设定,不可去到没到过的楼层CAIXUKUN.floor += 1elif down_lift_rect.collidepoint(event.pos):if event.button == 1 and get_lift and CAIXUKUN.floor > 1  and CAIXUKUN.floor != 44:CAIXUKUN.floor -= 1                ##开始画地图#地板for i in ground_L:screen.blit(ground,i)#墙for j in wall_L:screen.blit(wall,j)#门for k in List_temp1:screen.blit(yellow_door,k)#楼梯for k in List_temp2:screen.blit(upstair,k)#宝物for k in List_temp3:screen.blit(rbottle,k)for k in List_temp4:screen.blit(bbottle,k)for k in List_temp5:screen.blit(rgem,k)for k in List_temp6:screen.blit(bgem,k)for k in List_temp7:screen.blit(ykey,k)#怪物   for k in list_molocation:n = list_molocation.index(k)k_name = list_moname[n]screen.blit(eval(k_name),k)screen.blit(lift,Lift[0])screen.blit(guide,Guide[0])##判定遇到事件'''遇到红血瓶+50生命,遇见蓝血瓶+100生命,遇到钥匙+1,遇到红宝石攻击+2,遇到蓝宝石防御+2,遇到门对应钥匙-1遇到怪物启用战斗系统,遇到特殊事件(宝物或人)发生特定事件'''#对于列表中的元素,碰撞以后:#黄门for y_door in ydoorL[:]:if CAIXUKUN.image_rect.colliderect(y_door):if CAIXUKUN.property["Yellow_key"] > 0:               i = ydoorL.index(y_door)ydoorL.remove(y_door)CAIXUKUN.property["Yellow_key"] -= 1del List_temp1[i]else :#实际上这里应该是不能通过,当作墙壁,写在类的机制里了pass#楼梯的判定事件较为复杂,暂时不写  #for stairup in stairupL[:]:#self.floor += 1##后期增加功能,根据self.floor判断楼层数并绘制地图#红血瓶for r_bottle in rbottleL[:]:if CAIXUKUN.image_rect.colliderect(r_bottle):sound1.play()i = rbottleL.index(r_bottle)rbottleL.remove(r_bottle)CAIXUKUN.life += 50del List_temp3[i]    #蓝血瓶for b_bottle in bbottleL[:]:if CAIXUKUN.image_rect.colliderect(b_bottle):sound1.play()i = bbottleL.index(b_bottle)bbottleL.remove(b_bottle)CAIXUKUN.life += 100del List_temp4[i]    for r_gem in rgemL[:]:if CAIXUKUN.image_rect.colliderect(r_gem):sound1.play()i = rgemL.index(r_gem)rgemL.remove(r_gem)CAIXUKUN.attack += 2del List_temp5[i]    for b_gem in bgemL[:]:if CAIXUKUN.image_rect.colliderect(b_gem):sound1.play()i = bgemL.index(b_gem)bgemL.remove(b_gem)CAIXUKUN.defend += 2del List_temp6[i] for y_key in ykeyL[:]:if CAIXUKUN.image_rect.colliderect(y_key):i = ykeyL.index(y_key)ykeyL.remove(y_key)CAIXUKUN.property["Yellow_key"] += 1del List_temp7[i]    ##战斗事件for monster_ in list_morect[:]:if CAIXUKUN.image_rect.colliderect(monster_):x = list_morect.index(monster_)oops = eval(list_moname[x] + "_")              if (fight(CAIXUKUN,oops)!=[0]):sound2.play()list_morect[x] = pygame.Rect(-100,-100,50,50)#字符串转化为变量(这里的变量是怪物类的实例)list_molocation[x] = (-100,-100)else : pass#这里和没有钥匙开门同理,打不过不可通过的机制放在移动机制中for lift_ in liftL[:]:if CAIXUKUN.image_rect.colliderect(lift_):sound6.play()liftL.remove(lift_)get_lift = 1Lift[0] = (-100, -100)  #侧边栏背景screen.fill((191,191,191), rect=att_rect1, special_flags=0)screen.fill((191,191,191), rect=att_rect2, special_flags=0)screen.fill((191,191,191), rect=att_rect3, special_flags=0)screen.fill((191,191,191), rect=att_rect4, special_flags=0)#物品栏screen.blit(ykey, (0,400))screen.blit(bkey, (0,450))screen.blit(rkey, (0,500))#属性栏                                                                          "text_surface1 = my_fontCH.render("第 %s 层"%str(CAIXUKUN.floor),    True, (0,0,0), (191,191,191))text_surface2 = my_fontCH.render("攻击力: %s"%str(CAIXUKUN.attack), True, (0,0,0), (191,191,191))text_surface3 = my_fontCH.render("防御力: %s"%str(CAIXUKUN.defend), True, (0,0,0), (191,191,191))text_surface4 = my_fontCH.render("生命值: %s"%str(CAIXUKUN.life),   True, (0,0,0), (191,191,191))text_surface5 = my_fontCH.render("金币 : %s"%str(CAIXUKUN.gold),   True, (0,0,0), (191,191,191))##钥匙数目Yellow_key = CAIXUKUN.property["Yellow_key"]Blue_key   = CAIXUKUN.property["Blue_key"]Red_key    = CAIXUKUN.property["Red_key"]#物品栏text_surface6 = my_fontCH.render("%s 把"%str(Yellow_key), True, (0,0,0), (191,191,191))text_surface7 = my_fontCH.render("%s 把"%str(Blue_key), True, (0,0,0), (191,191,191))text_surface8 = my_fontCH.render("%s 把"%str(Red_key), True, (0,0,0), (191,191,191))  text_surface9 = my_fontCHs.render("永久使用宝物", True, (0,0,0), (191,191,191))text_surface10 = my_fontCHs.render("一次使用宝物", True, (0,0,0), (191,191,191))text_surface11 = my_fontCHs.render("自动使用宝物", True, (0,0,0), (191,191,191))#如果获得电梯,则在右侧边栏加上该宝物if get_lift:screen.blit(pygame.transform.scale(pygame.image.load('lift.PNG').convert_alpha(),(40,40)),(770,100))screen.blit(CAIXUKUN.image,CAIXUKUN.image_rect)#属性栏screen.blit(text_surface0, (280,0))screen.blit(text_surface1, (0,100))screen.blit(text_surface2, (0,150))screen.blit(text_surface3, (0,200))screen.blit(text_surface4, (0,250))screen.blit(text_surface5, (0,300))screen.blit(text_surface6, (100,400))screen.blit(text_surface7, (100,450))screen.blit(text_surface8, (100,500))screen.blit(text_surface9, (758,50))screen.blit(text_surface10, (758,280)) screen.blit(text_surface11, (758,510)) pygame.display.update()

这里注释挺详细的,刚开始写的时候踩了不少坑,大部分源自于地图问题,我在后面的讨论中再详细说下。

7.战斗机制

采用的是日韩游戏中常用的回合型战斗机制(你拍一啊我拍一,说起来我对疯狂加血版魔塔真的映像深刻)

def fight(A,B,cancel=0):a = A.attack - B.defendb = B.attack - A.defend#保存怪物的初始生命值alife = A.lifeblife = B.lifeif a <= 0: #失败,未能破防return [0]if a > 0 and b <= 0: #成功,怪物无法给主角造成伤害,则无需战斗结算if(cancel == 0):A.gold += B.goldif(cancel != 0):A.life = alifeB.life = blifereturn 0else: #进行战斗结算for i in range(1,100):B.life = B.life - aif B.life < 0 : #成功if(cancel == 0):#重置怪物的生命值B.life = blifeA.gold += B.goldif(cancel != 0):A.life = alifeB.life = blifereturn alife - A.lifeA.life = A.life - bif A.life < 0 :#失败,重置双方生命值A.life = alifeB.life = blifereturn [0]

讨论

介绍一下设计过程中遇到的一些问题

Q:移动图片后图片在原始位置上的痕迹还在(主角移动后在原位置留下残影)
A:每次移动的时候,用背景色覆盖之前的位置(这里用的是地板覆盖)

Q:游戏全屏显示出现问题
A:因为元素是按像素大小放上去的,改变屏幕大小会出问题,不要改游戏设置使游戏可以全屏或者设置可放缩屏幕

Q:解决楼层时的问题,可以考虑采用双缓冲,这样不必每次都重新慢慢画,DOUBLEBUF,使用pygame.display.flip()刷新屏幕
A:很好的想法,暂时没打算采用

Q:钥匙上升到10把后,“把”字会后移,而掉回10把以内后会出现重影
A:把背景设置拖到循环里来即可

Q:音效无法播放
A:sound.play()的括号一定要加上(是我傻了)

Q:将怪物合并为一个列表之后,每次遇到一个并删除之后,列表前移一个,对应位置的图像发生变化了
A:将删除改为投影到屏幕外即可,如设定坐标(-100,-100)

Q:怪物的顺序有问题
A:list_morect也不可以remove,道理同上,改删除为换位

Q:升到第二层后地图设置没有改变
A:实现的想法是,设计两个函数Analysis_map()和Draw_map(),第一个用于根据楼层解析地图,第二个用于画地图,Draw_map()是一直放入事件循环中的,Analysis_map()做一次初始化后,根据楼层改变的扳机触发。这样的想法带来的后果是,所有特殊的道具必须提前做好放进列表里,还有触发事件也必须提前写好并编号,比如观音1号观音2号...(对于我这样才看了几层地图的懒人来说实在有点困难)

python开发魔塔(1)相关推荐

  1. python安装包_迈出Python学习第一步:Python开发环境的下载与安装

    所谓"磨刀不误砍柴工"."工欲善其事,必先利其器",都在告诉我们一个道理:要做好一个事情,事先做好充分的准备工作是非常重要的.所以在我们正式学习用Python编 ...

  2. python 开发板-MicroPython:STM32 上 的 Python 开发

    虽然Python在国外是一门非常火的语言,在黑客界更是赫赫有名,然而中国的大学却极少开设 Python 课程,故而国内 Python 程序员多属自学.而一个没有MCU编程经验的初学者,要想让芯片跑起来 ...

  3. 如何在python开发的GUI界面程序中恰当地使用PyExecJS

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 "解决一闪而过的黑框的小技巧." 在使用python开发过程中,不可避免地,会开发带界面的应用,也会经常使用js来完成一些功能,比如, ...

  4. Python培训教程分享:10款超好用的Python开发工具

    学会Python技术后,我们在参加工作的时候如果能有辅助工具的话,那么会很大程度的提高我们的工作效率,那么Python都有哪些好用的开发工具呢?下面小编就为大家详细的介绍一下10款超好用的Python ...

  5. 学习Python开发培训有用吗

    学习Python开发培训有用吗?这是目前很多人都比较关注的一个问题,Python语言在最近几年是广受IT互联网行业关注的, 下面我们就针对这问题来详细的分析一下. 学习Python开发培训有用吗?Py ...

  6. Python开发【第十篇】:CSS (二)

    Python开发[前端]:CSS Kylin Zhang 发表于 2016-11-10 13:13:57 css样式选择器 标签上设置style属性: <body><div styl ...

  7. 太强了,Python 开发桌面小工具,让代码替我们干重复的工作~

    作者 | Cherish 来源 | 杰哥的IT之旅 决定写这篇文章的初衷是来源于一位小伙伴的问题,关于"如何根据数据源用 Python 自动生成透视表",这个问题背后有个非常好的解 ...

  8. 硬核教程:五步掌握用VSCode进行高效Python开发

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|OpenCV学堂 在程序员圈子里,Visual Stud ...

  9. 当程序员的一个人无聊时,甚至用Python开发出机器人看他们聊天

    当程序员的一个人独孤的时候,甚至可以用Python开发出两个机器人看他们聊天 当你无聊的时候,可能会刷一下手机看一下新闻,看看电视剧,发发呆. 但是当程序员无聊起来的时候,甚至可以用Python开发两 ...

最新文章

  1. 【PAT乙级】1086 就不告诉你 (15 分)
  2. mysql获取查询策略语句_MySQL数据库查询性能优化策略
  3. c# 类对象和实例对象_C#类和对象能力问题 套装4
  4. mysql手工注入imformation_mysql 简单手工注入
  5. Echarts数据可视化series-radar雷达图,开发全解+完美注释
  6. Winform开发框架之终极应用 - 伍华聪 - 博客园
  7. VLAN 虚拟局域网 搭建
  8. 计算机主机光驱弹不出来怎么办,光驱弹不出来怎么办,教你win10光驱弹不出来的应对办法...
  9. CSS边框border属性
  10. Unable to find a single main class from the following candidates 问题解决
  11. 最佳解决方法 Error: No such file or directory @ rb_sysopen
  12. 【题解刷题总结】青蛙的约会
  13. 第二十二章 SQL命令 CREATE TRIGGER(二)
  14. kubernetes云原生纪元:共享存储-PVPVC(上)
  15. 空气污染数据的空间地图绘制(点转面画出来)
  16. 软件测试参数化的作用,Pytest之测试的参数化
  17. 如何选择合适的渗压计?
  18. Vibration API
  19. 监管的重拳出击下,电子烟何去何从?
  20. VS插件_Supercharger_Auto Placeholders自动添加 用户+时间

热门文章

  1. 轮播图进度条同步切换(参考漫威官网)
  2. .ps1 is not digitally signed. The script will not execute on the system.
  3. 【软考高级:信息系统项目管理师】【信息项目十大管理】第八天:项目人力资源管理
  4. html 注释 实例,超详细的HTML !–…– 注释标签使用实例
  5. 计算机组成原理简单模型机实验,CPU 与简单模型机设计实验
  6. Zotero文献管理工具使用指南
  7. web百度离线地图开发(详细教程)2019
  8. java 调整图片分辨率_java 改变图片的分辨率。。。可以吗?
  9. 解决cvxpy报错The solver GLPK_MI is not installed
  10. 萌新向Python数据分析及数据挖掘 第二章 pandas 第一节 pandas使用基础QA 1-15