|
一、初始pygame1.游戏框架搭建pygame游戏框架搭建大体分为四个步骤,如下图所示:参考代码:#导入pygameimportpygame#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:480,高:700#游戏退出pygame.quit()12345678910112.添加循环以上代码执行后,游戏窗口闪一下就关闭了。我们需要在窗口下方添加一个无限循环,让窗口一直显示。#导入pygameimportpygame#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700#添加无限循环,让窗口一直显示whileTrue:pass#游戏退出pygame.quit()123456789101112131415163.监听事件以上代码执行后,窗口可以一直显示,但无法关闭。所以我们需要监听事件消息,例如关闭窗口事件,按下键盘事件等等。#导入pygameimportpygame#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()1234567891011121314151617184.最终代码基本设置完成后,我们可以设置窗口,更改背景颜色等等#导入pygameimportpygame#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700#窗口pygame.display.set_caption('原神')#自定义颜色bg_color1=(255,0,0)#游戏窗口背景颜色screen.fill(bg_color1)#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()12345678910111213141516171819202122232425以上代码结束后,颜色无法更改,我们需要加一行代码pygame.display.flip,去刷新屏幕。代码如下:#导入pygameimportpygame#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700#窗口pygame.display.set_caption('原神')#自定义颜色bg_color1=(255,0,0)#游戏窗口背景颜色screen.fill(bg_color1)#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()#刷新屏幕 pygame.display.flip()123456789101112131415161718192021222324252627二、Pygame进阶1.游戏窗口坐标系2.画圆#导入pygameimportpygame#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700#窗口pygame.display.set_caption('原神')#自定义颜色bg_color1=(255,0,0)#游戏窗口背景颜色screen.fill(bg_color1)#绘制一个蓝色实心的圆形,其中[60,250]表示圆心的位置,40为半径,width默认为0pygame.draw.circle(screen,(0,0,255),[60,250],40,0)#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()#刷新屏幕pygame.display.flip()12345678910111213141516171819202122232425262728293.插入图片#导入pygameimportpygame#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700#窗口pygame.display.set_caption('原神')ball=pygame.image.load("ball.jpg")#加载图片WHITE=(255,255,255)#白色#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()screen.fill(WHITE)#重新背景颜色为白色screen.blit(ball,(0,0))#在原点位置放置图片pygame.display.update()#刷新屏幕1234567891011121314151617181920212223242526272829304.让图片移动#导入pygameimportpygameimporttime#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700ball=pygame.image.load("ball.jpg")#加载图片RED=(255,0,0)#红色ballrect=ball.get_rect()#获取矩形的区域speed=[5,5]#偏移量#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()ballrect=ballrect.move(speed)#让图片移动screen.fill(RED)#背景颜色为红色screen.blit(ball,ballrect)#将图片画到窗口pygame.display.flip()#刷新屏幕time.sleep(0.1)#间接控制图片移动速度,越短越快1234567891011121314151617181920212223242526272829305.碰撞反弹#导入pygameimportpygameimporttime#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700ball=pygame.image.load("ball.jpg")#加载图片RED=(255,0,0)#红色ballrect=ball.get_rect()#获取矩形的区域speed=[5,5]#偏移量#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()#碰到左右边缘反弹ifballrect.left480:speed[0]=-speed[0]#碰到上下边缘反弹ifballrect.top700:speed[1]=-speed[1]ballrect=ballrect.move(speed)#让图片移动screen.fill(RED)#背景颜色为红色screen.blit(ball,ballrect)#将图片画到窗口pygame.display.flip()#刷新屏幕time.sleep(0.1)#间接控制图片移动速度,越短越快1234567891011121314151617181920212223242526272829303132333435363738三、Pygame进阶(一)1.绘制矩形#导入pygameimportpygameimporttime#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700RED=(255,0,0)#红色#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()pygame.draw.rect(screen,RED,(50,50,150,50),0)#绘制矩形,第三个参数为矩形的范围:(left,top,width,height),最后一个参数,0表示填充矩形pygame.draw.rect(screen,RED,(250,50,150,50),1)pygame.draw.rect(screen,RED,(50,150,150,50),10)pygame.display.flip()#刷新屏幕123456789101112131415161718192021222324252.绘制三角形#导入pygameimportpygameimporttime#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700BLACK=(0,0,0)#黑色WHITE=(255,255,255)#白色RED=(255,0,0)#红色GREEN=(0,255,0)#绿色BLUE=(0,0,255)#蓝色screen.fill(WHITE)#填充背景色#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()"""绘制三角形"""points=[(60,0),(0,50),(120,50)]pygame.draw.polygon(screen,GREEN,points,0)"""绘制多边形"""points=[(200,75),(300,25),(400,75),(450,25),(450,125),(400,75),(300,125)]pygame.draw.polygon(screen,RED,points,0)pygame.display.flip()#刷新屏幕1234567891011121314151617181920212223242526272829303132333435363.显示文字#导入pygameimportpygame#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((480,700))#宽:640,高:700#窗口pygame.display.set_caption('原神')#定义颜色BLACK=(0,0,0)#黑色WHITE=(255,255,255)#白色RED=(255,0,0)#红色GREEN=(0,255,0)#绿色BLUE=(0,0,255)#蓝色#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()text=pygame.font.SysFont("SimHei",60)#创建一个font文本对象text_font=text.render("游戏结束",1,RED,BLUE)#渲染文本对象screen.blit(text_font,(100,200))#绘制文本内容pygame.display.update()#刷新屏幕123456789101112131415161718192021222324252627282930313.乒乓球创意#导入pygameimportpygameimporttime#初始化游戏pygame.init()#游戏代码【这里写我们的游戏代码主体部分,比如游戏窗口,,背景颜色等等】#游戏窗口screen=pygame.display.set_mode((600,550))#宽:600,高:550#窗口pygame.display.set_caption('乒乓球争霸赛')#定义颜色BLACK=(0,0,0)#黑色WHITE=(255,255,255)#白色RED=(255,0,0)#红色GREEN=(0,255,0)#绿色BLUE=(0,0,255)#蓝色Orange=(225,121,21)#橙色x=120#乒乓球的x坐标y=120#乒乓球的y坐标vx=1#乒乓球的x轴初始速度vy=1#乒乓球的y轴初始速度#boost=0#boost是加速器,如果接了10次,那么加速score=0#score是分数,接到一次乒乓球就加分#Bpc=1#基础加分量英文:Basicpluscomponent的缩写#打印文本defprinttext(font,text,x,y,color):#渲染文本text_font=font.render(text,True,color)#绘制文本screen.blit(text_font,(x,y))#循环whileTrue:screen.fill(Orange)#填充背景为橙色#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()###显示文字###script1=pygame.font.SysFont('stkaiti',24)#文字:移动鼠标控制乒乓板左右移动script2=pygame.font.SysFont('stkaiti',20)#文字:得分printtext(script1,"移动鼠标控制乒乓板左右移动",10,12,BLACK)printtext(script2,"得分",550,12,BLACK)printtext(script2,str(score),560,32,WHITE)###乒乓球和球拍###mx,my=pygame.mouse.get_pos()#获得鼠标的x,y坐标pygame.draw.circle(screen,BLUE,(x,y),40,0)#绘制乒乓球pygame.draw.rect(screen,GREEN,(mx,530,100,20),0)#绘制球板【鼠标x坐标就是乒乓板的坐标,因此移动鼠标乒乓板也移动】#改变乒乓球的速度x=x+vxy=y+vy#如果乒乓球碰到左右屏幕边缘,vx取反ifx>550orx530)and(ymx)and(x0:vy=-vy#如果判定没落到球板,则游戏结束,跳出循环elify>530andabs(mx-x)>50:print("游戏结束!")breakpygame.display.update()#刷新屏幕12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485四、滑雪大冒险1.第一节课#-*-coding:GBK-*-#导入pygameimportpygame#导入时间库importtime#滑雪者方向不同对应不同的图片skier_images=['./images/skier_forward.png',"./images/skier_right1.png","./images/skier_right2.png","./images/skier_left2.png","./images/skier_left1.png"]#滑雪者类classSkierClass(pygame.sprite.Sprite):def__init__(self):#创建一个pygameSprite类的子类pygame.sprite.Sprite.__init__(self)#初始化加载滑雪者向下滑的图片self.image=pygame.image.load('./images/skier_fall.png')#初始化获取图片的矩形大小self.rect=self.image.get_rect()#指定滑雪者的中心位置self.rect.center=[320,100]#初始化默认标记滑雪者当前面对的方向(0:代表向下滑)self.angle=0#转弯defturn(self,direction):#滑雪者当前的移动速度self.angle+=direction#用于将滑雪者的移动方式固定到这3个方式当中ifself.angle2:self.angle=2#获取人的位置center=self.rect.center#加载滑雪者此时应有的图片self.image=pygame.image.load(skier_images[self.angle])#初始化图形,注意这里改变了位置self.rect=self.image.get_rect()#重新定位到人的位置self.rect.center=center###滑雪者左右移动defmove(self,speed):#更改滑雪者所在的横向位置self.rect.centerx+=speed#滑雪者所在位置不应该超过的最大最小值ifself.rect.centerx620:self.rect.centerx=620#初始化游戏pygame.init()#游戏窗口screen=pygame.display.set_mode((640,640))#宽:640,高:640#窗口pygame.display.set_caption('滑雪大冒险')#创建滑雪者类的实例对象skier=SkierClass()#设置移动的x轴距离speed=0#设置时钟clock=pygame.time.Clock()#循环whileTrue:clock.tick(30)#每秒钟执行30次#监听所有事件foreventinpygame.event.get():#点击?号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()ifevent.type==pygame.KEYDOWN:#如果点击左键则向左转ifevent.key==pygame.K_LEFT:skier.turn(-1)speed=-1#如果点击右键则向右转elifevent.key==pygame.K_RIGHT:skier.turn(1)speed=1#滑雪者移动skier.move(speed)#白色背景screen.fill([255,255,255])#绘制滑雪者screen.blit(skier.image,skier.rect)#刷新屏幕pygame.display.flip()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495962.第二节课#-*-coding:GBK-*-#导入pygameimportpygame#导入时间库importtime#导入随机库importrandom#滑雪者方向不同对应不同的图片skier_images=['./images/skier_forward.png',"./images/skier_right1.png","./images/skier_right2.png","./images/skier_left2.png","./images/skier_left1.png"]#滑雪者类classSkierClass(pygame.sprite.Sprite):def__init__(self):#创建一个pygameSprite类的子类pygame.sprite.Sprite.__init__(self)#初始化加载滑雪者向下滑的图片self.image=pygame.image.load('./images/skier_fall.png')#初始化获取图片的矩形大小self.rect=self.image.get_rect()#指定滑雪者的中心位置self.rect.center=[320,100]#初始化默认标记滑雪者当前面对的方向(0:代表向下滑)self.angle=0#转弯defturn(self,direction):#滑雪者当前的移动速度self.angle+=direction#用于将滑雪者的移动方式固定到这3个方式当中ifself.angle2:self.angle=2#获取人的位置center=self.rect.center#加载滑雪者此时应有的图片self.image=pygame.image.load(skier_images[self.angle])#初始化图形,注意这里改变了位置self.rect=self.image.get_rect()#重新定位到人的位置self.rect.center=center###滑雪者左右移动defmove(self,speed):#更改滑雪者所在的横向位置self.rect.centerx+=speed#滑雪者所在位置不应该超过的最大最小值ifself.rect.centerx620:self.rect.centerx=620#树类classTreeClass(pygame.sprite.Sprite):def__init__(self,location):pygame.sprite.Sprite.__init__(self)#加载树的图片self.image=pygame.image.load('./images/tree.png')#初始化树的位置self.location=location#获取图片大小self.rect=self.image.get_rect()#指定图片中心位置self.rect.center=location#移动defupdate(self):globalspeedyself.rect.centery-=speedy#判断树是否移除屏幕ifself.rect.centery=640:create_map()map_position=0clock.tick(30)#每秒钟执行30次#监听所有事件foreventinpygame.event.get():#点击?号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()ifevent.type==pygame.KEYDOWN:#如果点击左键则向左转ifevent.key==pygame.K_LEFT:skier.turn(-1)speed=-1#如果点击右键则向右转elifevent.key==pygame.K_RIGHT:skier.turn(1)speed=1#滑雪者移动skier.move(speed)#白色背景screen.fill([255,255,255])#把树和旗子绘制到窗口obstacles.draw(screen)#屏幕更新显示obstacles.update()#绘制滑雪者screen.blit(skier.image,skier.rect)#刷新屏幕pygame.display.flip()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771783.第三节课#-*-coding:GBK-*-#导入pygameimportpygame#导入时间库importtime#导入随机库importrandom#滑雪者方向不同对应不同的图片skier_images=['./images/skier_forward.png',"./images/skier_right1.png","./images/skier_right2.png","./images/skier_left2.png","./images/skier_left1.png"]#滑雪者类classSkierClass(pygame.sprite.Sprite):def__init__(self):#创建一个pygameSprite类的子类pygame.sprite.Sprite.__init__(self)#初始化加载滑雪者向下滑的图片self.image=pygame.image.load('./images/skier_fall.png')#初始化获取图片的矩形大小self.rect=self.image.get_rect()#指定滑雪者的中心位置self.rect.center=[320,100]#初始化默认标记滑雪者当前面对的方向(0:代表向下滑)self.angle=0#转弯defturn(self,direction):#滑雪者当前的移动速度self.angle+=direction#用于将滑雪者的移动方式固定到这3个方式当中ifself.angle2:self.angle=2#获取人的位置center=self.rect.center#加载滑雪者此时应有的图片self.image=pygame.image.load(skier_images[self.angle])#初始化图形,注意这里改变了位置self.rect=self.image.get_rect()#重新定位到人的位置self.rect.center=center#滑雪者左右移动defmove(self,speed):#更改滑雪者所在的横向位置self.rect.centerx+=speed#滑雪者所在位置不应该超过的最大最小值ifself.rect.centerx620:self.rect.centerx=620#树类classTreeClass(pygame.sprite.Sprite):def__init__(self,location):pygame.sprite.Sprite.__init__(self)#加载树的图片self.image=pygame.image.load('./images/tree.png')#初始化树的位置self.location=location#获取图片大小self.rect=self.image.get_rect()#指定图片中心位置self.rect.center=locationself.type='tree'#移动defupdate(self):globalspeedyself.rect.centery-=speedy#判断树是否移除屏幕ifself.rect.centery=640:create_map()map_position=0clock.tick(30)#每秒钟执行30次#监听所有事件foreventinpygame.event.get():#点击?号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()ifevent.type==pygame.KEYDOWN:#如果点击左键则向左转ifevent.key==pygame.K_LEFT:skier.turn(-1)speed=-1#如果点击右键则向右转elifevent.key==pygame.K_RIGHT:skier.turn(1)speed=1#碰撞检测hit=pygame.sprite.spritecollide(skier,obstacles,False)ifhit:#如果碰到树ifhit[0].type=='tree':score-=50#将树隐藏hit[0].kill()#显示碰撞的图片skier.image=pygame.image.load("./images/skier_fall.png")updateGame()#摔倒后暂停一会重新再站起来time.sleep(1)skier.image=pygame.image.load('./images/skier_forward.png')skier.angle=0speed=0elifhit[0].type=='flag':score+=10hit[0].kill()updateGame()#滑雪者移动skier.move(speed)#白色背景screen.fill([255,255,255])#把树和旗子绘制到窗口obstacles.draw(screen)#屏幕更新显示obstacles.update()#绘制滑雪者screen.blit(skier.image,skier.rect)#显示得分score_text=font.render("Score:"+str(score),1,(0,0,0))#将分数绘制在指定位置screen.blit(score_text,[10,10])#刷新屏幕pygame.display.flip()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231五、玛丽冒险1.第一节课#导入pygameimportpygameSCREENWIDTH=673#窗口宽度根据地图宽度定SCREENHEIGHT=224#窗口高度根据地图高度定FPS=30#4.更新画面时间#定义一个移动地图类classMyMap():def__init__(self,x,y):#加载背景图片self.bg=pygame.image.load("image/ditutu.png").convert_alpha()#初始化x的坐标self.x=x#初始化y的坐标self.y=ydefmap_rolling(self):ifself.x=self.lowest_y:#以5个像素值向上移动self.jumpValue=-5#玛丽到达顶部回落ifself.rect.y=self.lowest_y:#关闭跳跃状态self.jumpState=FalsedefmainGame()ver=False#游戏结束标记globalscreen#1.初始化游戏pygame.init()#2.使用python时钟控制每个循环多长时间运行一次,在使用时钟前必须先创建clock对象的一个实例fpsclock=pygame.time.Clock()#3.游戏窗口screen=pygame.display.set_mode((SCREENWIDTH,SCREENHEIGHT))#4.窗口pygame.display.set_caption('玛丽冒险')#创建地图对象bg1=MyMap(0,0)bg2=MyMap(673,0)#创建玛丽对象marie=Marie()#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()#按下键盘上的空格键,开启跳的状态ifevent.type==pygame.KEYDOWNandevent.key==pygame.K_SPACE:#1.如果玛丽在地面上ifmarie.rect.y>=marie.lowest_y:#2.播放玛丽跳跃音效marie.jump_music.play()#3.开启玛丽跳的状态marie.jump()ifover==False:#绘制地图,起到更新地图的作用bg1.map_update()#地图移动bg1.map_rolling()bg2.map_update()bg2.map_rolling()#绘制玛丽marie.draw_marie()#玛丽移动marie.move()#5.更新整个窗体pygame.display.update()#6.循环应该多长时间运行一次fpsclock.tick(FPS)if__name__=='__main__':mainGame()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421433.第三节课#导入pygameimportpygamefromitertoolsimportcycle#导入迭代工具importrandomSCREENWIDTH=673#窗口宽度根据地图宽度定SCREENHEIGHT=224#窗口高度根据地图高度定FPS=30#4.更新画面时间#定义一个移动地图类classMyMap():def__init__(self,x,y):#加载背景图片self.bg=pygame.image.load("image/ditutu.png").convert_alpha()#初始化x的坐标self.x=x#初始化y的坐标self.y=ydefmap_rolling(self):ifself.x=self.lowest_y:#以5个像素值向上移动self.jumpValue=-5#玛丽到达顶部回落ifself.rect.y=self.lowest_y:#关闭跳跃状态self.jumpState=False#障碍物类classobstacle():def__init__(self):#初始化障碍物矩形self.rect=pygame.Rect(0,0,0,0)#加载障碍物图片self.missile=pygame.image.load("image/missile.png")self.pipe=pygame.image.load("image/pipe.png")#0和1随机数判断是管道还是导弹number=random.randint(0,1)ifnumber==0:#如果随机数为0显示导弹障碍物相反显示管道self.image=self.missile#显示导弹障碍self.move=15#导弹移动速度加快self.obstacle_y=150#导弹坐标在天上else:self.image=self.pipe#显示管道障碍self.move=5#管道移动速度慢self.obstacle_y=160#管道在地面上#障碍物绘制坐标self.rect.x=673self.rect.y=self.obstacle_y#障碍物移动defobstacle_move(self):self.rect.x-=self.move#绘制障碍物defdraw_obstacle(self):screen.blit(self.image,(self.rect.x,self.rect.y))defmainGame()ver=False#游戏结束标记globalscreen#1.初始化游戏pygame.init()#2.使用python时钟控制每个循环多长时间运行一次,在使用时钟前必须先创建clock对象的一个实例fpsclock=pygame.time.Clock()#3.游戏窗口screen=pygame.display.set_mode((SCREENWIDTH,SCREENHEIGHT))#4.窗口pygame.display.set_caption('玛丽冒险')#创建地图对象bg1=MyMap(0,0)bg2=MyMap(673,0)#创建玛丽对象marie=Marie()#添加障碍物的时间addobstacleTimer=0#障碍物对象列表list=[]#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()#按下键盘上的空格键,开启跳的状态ifevent.type==pygame.KEYDOWNandevent.key==pygame.K_SPACE:#1.如果玛丽在地面上ifmarie.rect.y>=marie.lowest_y:#2.播放玛丽跳跃音效marie.jump_music.play()#3.开启玛丽跳的状态marie.jump()ifover==False:#绘制地图,起到更新地图的作用bg1.map_update()#地图移动bg1.map_rolling()bg2.map_update()bg2.map_rolling()#绘制玛丽marie.draw_marie()#玛丽移动marie.move()#计算障碍物间隔时间ifaddobstacleTimer>=1200:#创建障碍物对象obs=obstacle()#将障碍物对象添加到列表中list.append(obs)#重置添加障碍物时间addobstacleTimer=0#循环遍历障碍物foriinrange(len(list)):#障碍物移动list[i].obstacle_move()#绘制障碍物list[i].draw_obstacle()#增加障碍物时间addobstacleTimer+=20#5.更新整个窗体pygame.display.update()#6.循环应该多长时间运行一次fpsclock.tick(FPS)if__name__=='__main__':mainGame()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961974.第四节课#导入pygameimportpygamefromitertoolsimportcycle#导入迭代工具importrandomSCREENWIDTH=673#窗口宽度根据地图宽度定SCREENHEIGHT=224#窗口高度根据地图高度定FPS=40#4.更新画面时间#游戏结束defgame_over():bump_music=pygame.mixer.Sound("music/bump.wav")#撞击bump_music.play()#播放撞击音效#加载游戏结束的图片over_img=pygame.image.load("image/gameover.png")#将游戏结束的图片绘制在窗体的中间位置screen.blit(over_img,(230,90))defmainGame():score=0#得分over=False#游戏结束标记globalscreen#1.初始化游戏pygame.init()#2.使用python时钟控制每个循环多长时间运行一次,在使用时钟前必须先创建clock对象的一个实例fpsclock=pygame.time.Clock()#3.游戏窗口screen=pygame.display.set_mode((SCREENWIDTH,SCREENHEIGHT))#4.窗口pygame.display.set_caption('玛丽冒险')#创建地图对象bg1=MyMap(0,0)bg2=MyMap(673,0)#创建玛丽对象marie=Marie()#添加障碍物的时间addobstacleTimer=0#障碍物对象列表list=[]#循环whileTrue:#监听所有事件foreventinpygame.event.get():#点击❌号关闭,退出游戏ifevent.type==pygame.QUIT:#游戏退出pygame.quit()#按下键盘上的空格键,开启跳的状态ifevent.type==pygame.KEYDOWNandevent.key==pygame.K_SPACE:#1.如果玛丽在地面上ifmarie.rect.y>=marie.lowest_y:#2.播放玛丽跳跃音效marie.jump_music.play()#3.开启玛丽跳的状态marie.jump()ifover==False:#绘制地图,起到更新地图的作用bg1.map_update()#地图移动bg1.map_rolling()bg2.map_update()bg2.map_rolling()#绘制玛丽marie.draw_marie()#玛丽移动marie.move()#计算障碍物间隔时间ifaddobstacleTimer>=1200:#创建障碍物对象obs=obstacle()#将障碍物对象添加到列表中list.append(obs)#重置添加障碍物时间addobstacleTimer=0list1=[]#循环遍历障碍物foriinrange(len(list)):#障碍物移动list[i].obstacle_move()#绘制障碍物list[i].draw_obstacle()iflist[i].rect.x=self.lowest_y:#以5个像素值向上移动self.jumpValue=-5#玛丽到达顶部回落ifself.rect.y=self.lowest_y:#关闭跳跃状态self.jumpState=False#障碍物类classobstacle():def__init__(self):#初始化障碍物矩形self.rect=pygame.Rect(0,0,0,0)#加载障碍物图片self.missile=pygame.image.load("image/missile.png")self.pipe=pygame.image.load("image/pipe.png")#加载分数图片self.numbers=(pygame.image.load("image/0.png"),pygame.image.load("image/1.png"),pygame.image.load("image/2.png"),pygame.image.load("image/3.png"),pygame.image.load("image/4.png"),pygame.image.load("image/5.png"),pygame.image.load("image/6.png"),pygame.image.load("image/7.png"),pygame.image.load("image/8.png"),pygame.image.load("image/9.png"))#0和1随机数判断是管道还是导弹number=random.randint(0,1)ifnumber==0:#如果随机数为0显示导弹障碍物相反显示管道self.image=self.missile#显示导弹障碍self.move=15#导弹移动速度加快self.obstacle_y=150#导弹坐标在天上self.rect.size=self.image.get_size()else:self.image=self.pipe#显示管道障碍self.move=5#管道移动速度慢self.obstacle_y=160#管道在地面上self.rect.size=self.image.get_size()#障碍物绘制坐标self.rect.x=673self.rect.y=self.obstacle_y#障碍物移动defobstacle_move(self):self.rect.x-=self.move#绘制障碍物defdraw_obstacle(self):screen.blit(self.image,(self.rect.x,self.rect.y))#显示分数defshowScore(self,score):#分数横向位置X=546a=list(str(score))foriina:#绘制分数screen.blit(self.numbers[int(i)],(X,22.4))#随着数字增加改变位置X+=24if__name__=='__main__':mainGame()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252六、创意课-flappybird1.地图importpygameimportrandom#游戏窗口SCREENWIDTH=500#窗口宽度根据地图宽度定SCREENHEIGHT=375#窗口高度根据地图高度定FPS=30#更新画面时间#地图类classMyMap():def__init__(self,x,y):#加载背景图片self.bg=pygame.image.load("image/地图.jpg").convert_alpha()#初始化x的坐标self.x=x#初始化y的坐标self.y=y#地图滚动defmap_rolling(self):ifself.x
|
|