失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 8个Python小游戏 可以上班摸鱼玩一天

8个Python小游戏 可以上班摸鱼玩一天

时间:2018-09-19 15:16:13

相关推荐

8个Python小游戏 可以上班摸鱼玩一天

1、吃金币

源码分享:

importosimportcfgimportsysimportpygameimportrandomfrommodulesimport*'''游戏初始化'''definitGame():#初始化pygame,设置展示窗口pygame.init()screen=pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('catchcoins——九歌')#加载必要的游戏素材game_images={}forkey,valueincfg.IMAGE_PATHS.items():ifisinstance(value,list):images=[]foriteminvalue:images.append(pygame.image.load(item))game_images[key]=imageselse:game_images[key]=pygame.image.load(value)game_sounds={}forkey,valueincfg.AUDIO_PATHS.items():ifkey=='bgm':continuegame_sounds[key]=pygame.mixer.Sound(value)#返回初始化数据returnscreen,game_images,game_sounds'''主函数'''defmain():#初始化screen,game_images,game_sounds=initGame()#播放背景音乐pygame.mixer.music.load(cfg.AUDIO_PATHS['bgm'])pygame.mixer.music.play(-1,0.0)#字体加载font=pygame.font.Font(cfg.FONT_PATH,40)#定义herohero=Hero(game_images['hero'],position=(375,520))#定义食物组food_sprites_group=pygame.sprite.Group()generate_food_freq=random.randint(10,20)generate_food_count=0#当前分数/历史最高分score=0highest_score=0ifnotos.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH)elseint(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())#游戏主循环clock=pygame.time.Clock()whileTrue:#--填充背景screen.fill(0)screen.blit(game_images['background'],(0,0))#--倒计时信息countdown_text='Countdown:'+str((90000-pygame.time.get_ticks())//60000)+":"+str((90000-pygame.time.get_ticks())//1000%60).zfill(2)countdown_text=font.render(countdown_text,True,(0,0,0))countdown_rect=countdown_text.get_rect()countdown_rect.topright=[cfg.SCREENSIZE[0]-30,5]screen.blit(countdown_text,countdown_rect)#--按键检测foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()key_pressed=pygame.key.get_pressed()ifkey_pressed[pygame.K_a]orkey_pressed[pygame.K_LEFT]:hero.move(cfg.SCREENSIZE,'left')ifkey_pressed[pygame.K_d]orkey_pressed[pygame.K_RIGHT]:hero.move(cfg.SCREENSIZE,'right')#--随机生成食物generate_food_count+=1ifgenerate_food_count>generate_food_freq:generate_food_freq=random.randint(10,20)generate_food_count=0food=Food(game_images,random.choice(['gold',]*10+['apple']),cfg.SCREENSIZE)food_sprites_group.add(food)#--更新食物forfoodinfood_sprites_group:iffood.update():food_sprites_group.remove(food)#--碰撞检测forfoodinfood_sprites_group:ifpygame.sprite.collide_mask(food,hero):game_sounds['get'].play()food_sprites_group.remove(food)score+=food.scoreifscore>highest_score:highest_score=score#--画herohero.draw(screen)#--画食物food_sprites_group.draw(screen)#--显示得分score_text=f'Score:{score},Highest:{highest_score}'score_text=font.render(score_text,True,(0,0,0))score_rect=score_text.get_rect()score_rect.topleft=[5,5]screen.blit(score_text,score_rect)#--判断游戏是否结束ifpygame.time.get_ticks()>=90000:break#--更新屏幕pygame.display.flip()clock.tick(cfg.FPS)#游戏结束,记录最高分并显示游戏结束画面fp=open(cfg.HIGHEST_SCORE_RECORD_FILEPATH,'w')fp.write(str(highest_score))fp.close()returnshowEndGameInterface(screen,cfg,score,highest_score)'''run'''if__name__=='__main__':whilemain():pass

2、打乒乓

源码分享:

importsysimportcfgimportpygamefrommodulesimport*'''定义按钮'''defButton(screen,position,text,button_size=(200,50)):left,top=positionbwidth,bheight=button_sizepygame.draw.line(screen,(150,150,150),(left,top),(left+bwidth,top),5)pygame.draw.line(screen,(150,150,150),(left,top-2),(left,top+bheight),5)pygame.draw.line(screen,(50,50,50),(left,top+bheight),(left+bwidth,top+bheight),5)pygame.draw.line(screen,(50,50,50),(left+bwidth,top+bheight),(left+bwidth,top),5)pygame.draw.rect(screen,(100,100,100),(left,top,bwidth,bheight))font=pygame.font.Font(cfg.FONTPATH,30)text_render=font.render(text,1,(255,235,205))returnscreen.blit(text_render,(left+50,top+10))'''Function:开始界面Input:--screen:游戏界面Return:--game_mode:1(单人模式)/2(双人模式)'''defstartInterface(screen):clock=pygame.time.Clock()whileTrue:screen.fill((41,36,33))button_1=Button(screen,(150,175),'1Player')button_2=Button(screen,(150,275),'2Player')foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()ifevent.type==pygame.MOUSEBUTTONDOWN:ifbutton_1.collidepoint(pygame.mouse.get_pos()):return1elifbutton_2.collidepoint(pygame.mouse.get_pos()):return2clock.tick(10)pygame.display.update()'''结束界面'''defendInterface(screen,score_left,score_right):clock=pygame.time.Clock()font1=pygame.font.Font(cfg.FONTPATH,30)font2=pygame.font.Font(cfg.FONTPATH,20)msg='Playeronleftwon!'ifscore_left>score_rightelse'Playeronrightwon!'texts=[font1.render(msg,True,cfg.WHITE),font2.render('PressESCAPEtoquit.',True,cfg.WHITE),font2.render('PressENTERtocontinueorplayagain.',True,cfg.WHITE)]positions=[[120,200],[155,270],[80,300]]whileTrue:screen.fill((41,36,33))foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()ifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_RETURN:returnelifevent.key==pygame.K_ESCAPE:sys.exit()pygame.quit()fortext,posinzip(texts,positions):screen.blit(text,pos)clock.tick(10)pygame.display.update()'''运行游戏Demo'''defrunDemo(screen):#加载游戏素材hit_sound=pygame.mixer.Sound(cfg.HITSOUNDPATH)goal_sound=pygame.mixer.Sound(cfg.GOALSOUNDPATH)pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.play(-1,0.0)font=pygame.font.Font(cfg.FONTPATH,50)#开始界面game_mode=startInterface(screen)#游戏主循环#--左边球拍(ws控制,仅双人模式时可控制)score_left=0racket_left=Racket(cfg.RACKETPICPATH,'LEFT',cfg)#--右边球拍(↑↓控制)score_right=0racket_right=Racket(cfg.RACKETPICPATH,'RIGHT',cfg)#--球ball=Ball(cfg.BALLPICPATH,cfg)clock=pygame.time.Clock()whileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit(-1)screen.fill((41,36,33))#玩家操作pressed_keys=pygame.key.get_pressed()ifpressed_keys[pygame.K_UP]:racket_right.move('UP')elifpressed_keys[pygame.K_DOWN]:racket_right.move('DOWN')ifgame_mode==2:ifpressed_keys[pygame.K_w]:racket_left.move('UP')elifpressed_keys[pygame.K_s]:racket_left.move('DOWN')else:racket_left.automove(ball)#球运动scores=ball.move(ball,racket_left,racket_right,hit_sound,goal_sound)score_left+=scores[0]score_right+=scores[1]#显示#--分隔线pygame.draw.rect(screen,cfg.WHITE,(247,0,6,500))#--球ball.draw(screen)#--拍racket_left.draw(screen)racket_right.draw(screen)#--得分screen.blit(font.render(str(score_left),False,cfg.WHITE),(150,10))screen.blit(font.render(str(score_right),False,cfg.WHITE),(300,10))ifscore_left==11orscore_right==11:returnscore_left,score_rightclock.tick(100)pygame.display.update()'''主函数'''defmain():#初始化pygame.init()pygame.mixer.init()screen=pygame.display.set_mode((cfg.WIDTH,cfg.HEIGHT))pygame.display.set_caption('pingpong——九歌')#开始游戏whileTrue:score_left,score_right=runDemo(screen)endInterface(screen,score_left,score_right)'''run'''if__name__=='__main__':main()

3、滑雪

源码分享:

importsysimportcfgimportpygameimportrandom'''滑雪者类'''classSkierClass(pygame.sprite.Sprite):def__init__(self):pygame.sprite.Sprite.__init__(self)#滑雪者的朝向(-2到2)self.direction=0self.imagepaths=cfg.SKIER_IMAGE_PATHS[:-1]self.image=pygame.image.load(self.imagepaths[self.direction])self.rect=self.image.get_rect()self.rect.center=[320,100]self.speed=[self.direction,6-abs(self.direction)*2]'''改变滑雪者的朝向.负数为向左,正数为向右,0为向前'''defturn(self,num):self.direction+=numself.direction=max(-2,self.direction)self.direction=min(2,self.direction)center=self.rect.centerself.image=pygame.image.load(self.imagepaths[self.direction])self.rect=self.image.get_rect()self.rect.center=centerself.speed=[self.direction,6-abs(self.direction)*2]returnself.speed'''移动滑雪者'''defmove(self):self.rect.centerx+=self.speed[0]self.rect.centerx=max(20,self.rect.centerx)self.rect.centerx=min(620,self.rect.centerx)'''设置为摔倒状态'''defsetFall(self):self.image=pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])'''设置为站立状态'''defsetForward(self):self.direction=0self.image=pygame.image.load(self.imagepaths[self.direction])'''Function:障碍物类Input:img_path:障碍物图片路径location:障碍物位置attribute:障碍物类别属性'''classObstacleClass(pygame.sprite.Sprite):def__init__(self,img_path,location,attribute):pygame.sprite.Sprite.__init__(self)self.img_path=img_pathself.image=pygame.image.load(self.img_path)self.location=locationself.rect=self.image.get_rect()self.rect.center=self.locationself.attribute=attributeself.passed=False'''移动'''defmove(self,num):self.rect.centery=self.location[1]-num'''创建障碍物'''defcreateObstacles(s,e,num=10):obstacles=pygame.sprite.Group()locations=[]foriinrange(num):row=random.randint(s,e)col=random.randint(0,9)location=[col*64+20,row*64+20]iflocationnotinlocations:locations.append(location)attribute=random.choice(list(cfg.OBSTACLE_PATHS.keys()))img_path=cfg.OBSTACLE_PATHS[attribute]obstacle=ObstacleClass(img_path,location,attribute)obstacles.add(obstacle)returnobstacles'''合并障碍物'''defAddObstacles(obstacles0,obstacles1):obstacles=pygame.sprite.Group()forobstacleinobstacles0:obstacles.add(obstacle)forobstacleinobstacles1:obstacles.add(obstacle)returnobstacles'''显示游戏开始界面'''defShowStartInterface(screen,screensize):screen.fill((255,255,255))tfont=pygame.font.Font(cfg.FONTPATH,screensize[0]//5)cfont=pygame.font.Font(cfg.FONTPATH,screensize[0]//20)title=tfont.render(u'滑雪游戏',True,(255,0,0))content=cfont.render(u'按任意键开始游戏',True,(0,0,255))trect=title.get_rect()trect.midtop=(screensize[0]/2,screensize[1]/5)crect=content.get_rect()crect.midtop=(screensize[0]/2,screensize[1]/2)screen.blit(title,trect)screen.blit(content,crect)whileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()elifevent.type==pygame.KEYDOWN:returnpygame.display.update()'''显示分数'''defshowScore(screen,score,pos=(10,10)):font=pygame.font.Font(cfg.FONTPATH,30)score_text=font.render("Score:%s"%score,True,(0,0,0))screen.blit(score_text,pos)'''更新当前帧的游戏画面'''defupdateFrame(screen,obstacles,skier,score):screen.fill((255,255,255))obstacles.draw(screen)screen.blit(skier.image,skier.rect)showScore(screen,score)pygame.display.update()'''主程序'''defmain():#游戏初始化pygame.init()pygame.mixer.init()pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.set_volume(0.4)pygame.mixer.music.play(-1)#设置屏幕screen=pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('滑雪游戏——九歌')#游戏开始界面ShowStartInterface(screen,cfg.SCREENSIZE)#实例化游戏精灵#--滑雪者skier=SkierClass()#--创建障碍物obstacles0=createObstacles(20,29)obstacles1=createObstacles(10,19)obstaclesflag=0obstacles=AddObstacles(obstacles0,obstacles1)#游戏clockclock=pygame.time.Clock()#记录滑雪的距离distance=0#记录当前的分数score=0#记录当前的速度speed=[0,6]#游戏主循环whileTrue:#--事件捕获foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()ifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_LEFTorevent.key==pygame.K_a:speed=skier.turn(-1)elifevent.key==pygame.K_RIGHTorevent.key==pygame.K_d:speed=skier.turn(1)#--更新当前游戏帧的数据skier.move()distance+=speed[1]ifdistance>=640andobstaclesflag==0:obstaclesflag=1obstacles0=createObstacles(20,29)obstacles=AddObstacles(obstacles0,obstacles1)ifdistance>=1280andobstaclesflag==1:obstaclesflag=0distance-=1280forobstacleinobstacles0:obstacle.location[1]=obstacle.location[1]-1280obstacles1=createObstacles(10,19)obstacles=AddObstacles(obstacles0,obstacles1)forobstacleinobstacles:obstacle.move(distance)#--碰撞检测hitted_obstacles=pygame.sprite.spritecollide(skier,obstacles,False)ifhitted_obstacles:ifhitted_obstacles[0].attribute=="tree"andnothitted_obstacles[0].passed:score-=50skier.setFall()updateFrame(screen,obstacles,skier,score)pygame.time.delay(1000)skier.setForward()speed=[0,6]hitted_obstacles[0].passed=Trueelifhitted_obstacles[0].attribute=="flag"andnothitted_obstacles[0].passed:score+=10obstacles.remove(hitted_obstacles[0])#--更新屏幕updateFrame(screen,obstacles,skier,score)clock.tick(cfg.FPS)'''run'''if__name__=='__main__':main();

4、并夕夕版飞机大战

源码分享:

importsysimportcfgimportpygamefrommodulesimport*'''游戏界面'''defGamingInterface(num_player,screen):#初始化pygame.mixer.music.load(cfg.SOUNDPATHS['CoolSpaceMusic'])pygame.mixer.music.set_volume(0.4)pygame.mixer.music.play(-1)explosion_sound=pygame.mixer.Sound(cfg.SOUNDPATHS['boom'])fire_sound=pygame.mixer.Sound(cfg.SOUNDPATHS['shot'])font=pygame.font.Font(cfg.FONTPATH,20)#游戏背景图bg_imgs=[cfg.IMAGEPATHS['bg_big'],cfg.IMAGEPATHS['seamless_space'],cfg.IMAGEPATHS['space3']]bg_move_dis=0bg_1=pygame.image.load(bg_imgs[0]).convert()bg_2=pygame.image.load(bg_imgs[1]).convert()bg_3=pygame.image.load(bg_imgs[2]).convert()#玩家,子弹和小行星精灵组player_group=pygame.sprite.Group()bullet_group=pygame.sprite.Group()asteroid_group=pygame.sprite.Group()#产生小行星的时间间隔asteroid_ticks=90foriinrange(num_player):player_group.add(Ship(i+1,cfg))clock=pygame.time.Clock()#分数score_1,score_2=0,0#游戏主循环whileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()#--玩家一:↑↓←→控制,j射击;玩家二:wsad控制,空格射击pressed_keys=pygame.key.get_pressed()foridx,playerinenumerate(player_group):direction=Noneifidx==0:ifpressed_keys[pygame.K_UP]:direction='up'elifpressed_keys[pygame.K_DOWN]:direction='down'elifpressed_keys[pygame.K_LEFT]:direction='left'elifpressed_keys[pygame.K_RIGHT]:direction='right'ifdirection:player.move(direction)ifpressed_keys[pygame.K_j]:ifplayer.cooling_time==0:fire_sound.play()bullet_group.add(player.shot())player.cooling_time=20elifidx==1:ifpressed_keys[pygame.K_w]:direction='up'elifpressed_keys[pygame.K_s]:direction='down'elifpressed_keys[pygame.K_a]:direction='left'elifpressed_keys[pygame.K_d]:direction='right'ifdirection:player.move(direction)ifpressed_keys[pygame.K_SPACE]:ifplayer.cooling_time==0:fire_sound.play()bullet_group.add(player.shot())player.cooling_time=20ifplayer.cooling_time>0:player.cooling_time-=1if(score_1+score_2)<500:background=bg_1elif(score_1+score_2)<1500:background=bg_2else:background=bg_3#--向下移动背景图实现飞船向上移动的效果screen.blit(background,(0,-background.get_rect().height+bg_move_dis))screen.blit(background,(0,bg_move_dis))bg_move_dis=(bg_move_dis+2)%background.get_rect().height#--生成小行星ifasteroid_ticks==0:asteroid_ticks=90asteroid_group.add(Asteroid(cfg))else:asteroid_ticks-=1#--画飞船forplayerinplayer_group:ifpygame.sprite.spritecollide(player,asteroid_group,True,None):player.explode_step=1explosion_sound.play()elifplayer.explode_step>0:ifplayer.explode_step>3:player_group.remove(player)iflen(player_group)==0:returnelse:player.explode(screen)else:player.draw(screen)#--画子弹forbulletinbullet_group:bullet.move()ifpygame.sprite.spritecollide(bullet,asteroid_group,True,None):bullet_group.remove(bullet)ifbullet.player_idx==1:score_1+=1else:score_2+=1else:bullet.draw(screen)#--画小行星forasteroidinasteroid_group:asteroid.move()asteroid.rotate()asteroid.draw(screen)#--显示分数score_1_text='玩家一得分:%s'%score_1score_2_text='玩家二得分:%s'%score_2text_1=font.render(score_1_text,True,(0,0,255))text_2=font.render(score_2_text,True,(255,0,0))screen.blit(text_1,(2,5))screen.blit(text_2,(2,35))#--屏幕刷新pygame.display.update()clock.tick(60)'''主函数'''defmain():pygame.init()pygame.font.init()pygame.mixer.init()screen=pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('飞机大战——九歌')num_player=StartInterface(screen,cfg)ifnum_player==1:whileTrue:GamingInterface(num_player=1,screen=screen)EndInterface(screen,cfg)else:whileTrue:GamingInterface(num_player=2,screen=screen)EndInterface(screen,cfg)'''run'''if__name__=='__main__':main()

5、消消乐

玩法:三个相连就能消除

源码分享:

importosimportsysimportcfgimportpygamefrommodulesimport*'''游戏主程序'''defmain():pygame.init()screen=pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('Gemgem——九歌')#加载背景音乐pygame.mixer.init()pygame.mixer.music.load(os.path.join(cfg.ROOTDIR,"resources/audios/bg.mp3"))pygame.mixer.music.set_volume(0.6)pygame.mixer.music.play(-1)#加载音效sounds={}sounds['mismatch']=pygame.mixer.Sound(os.path.join(cfg.ROOTDIR,'resources/audios/badswap.wav'))sounds['match']=[]foriinrange(6):sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR,'resources/audios/match%s.wav'%i)))#加载字体font=pygame.font.Font(os.path.join(cfg.ROOTDIR,'resources/font/font.TTF'),25)#图片加载gem_imgs=[]foriinrange(1,8):gem_imgs.append(os.path.join(cfg.ROOTDIR,'resources/images/gem%s.png'%i))#主循环game=gemGame(screen,sounds,font,gem_imgs,cfg)whileTrue:score=game.start()flag=False#一轮游戏结束后玩家选择重玩或者退出whileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUITor(event.type==pygame.KEYUPandevent.key==pygame.K_ESCAPE):pygame.quit()sys.exit()elifevent.type==pygame.KEYUPandevent.key==pygame.K_r:flag=Trueifflag:breakscreen.fill((135,206,235))text0='Finalscore:%s'%scoretext1='Press<R>torestartthegame.'text2='Press<Esc>toquitthegame.'y=150foridx,textinenumerate([text0,text1,text2]):text_render=font.render(text,1,(85,65,0))rect=text_render.get_rect()ifidx==0:rect.left,rect.top=(212,y)elifidx==1:rect.left,rect.top=(122.5,y)else:rect.left,rect.top=(126.5,y)y+=100screen.blit(text_render,rect)pygame.display.update()game.reset()'''run'''if__name__=='__main__':main()

6、俄罗斯方块

玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。

源码分享:

importosimportsysimportrandomfrommodulesimport*fromPyQt5.QtGuiimport*fromPyQt5.QtCoreimport*fromPyQt5.QtWidgetsimport*'''定义俄罗斯方块游戏类'''classTetrisGame(QMainWindow):def__init__(self,parent=None):super(TetrisGame,self).__init__(parent)#是否暂停ingself.is_paused=False#是否开始ingself.is_started=Falseself.initUI()'''界面初始化'''definitUI(self):#iconself.setWindowIcon(QIcon(os.path.join(os.getcwd(),'resources/icon.jpg')))#块大小self.grid_size=22#游戏帧率self.fps=200self.timer=QBasicTimer()#焦点self.setFocusPolicy(Qt.StrongFocus)#水平布局layout_horizontal=QHBoxLayout()self.inner_board=InnerBoard()self.external_board=ExternalBoard(self,self.grid_size,self.inner_board)layout_horizontal.addWidget(self.external_board)self.side_panel=SidePanel(self,self.grid_size,self.inner_board)layout_horizontal.addWidget(self.side_panel)self.status_bar=self.statusBar()self.external_board.score_signal[str].connect(self.status_bar.showMessage)self.start()self.center()self.setWindowTitle('Tetris——九歌')self.show()self.setFixedSize(self.external_board.width()+self.side_panel.width(),self.side_panel.height()+self.status_bar.height())'''游戏界面移动到屏幕中间'''defcenter(self):screen=QDesktopWidget().screenGeometry()size=self.geometry()self.move((screen.width()-size.width())//2,(screen.height()-size.height())//2)'''更新界面'''defupdateWindow(self):self.external_board.updateData()self.side_panel.updateData()self.update()'''开始'''defstart(self):ifself.is_started:returnself.is_started=Trueself.inner_board.createNewTetris()self.timer.start(self.fps,self)'''暂停/不暂停'''defpause(self):ifnotself.is_started:returnself.is_paused=notself.is_pausedifself.is_paused:self.timer.stop()self.external_board.score_signal.emit('Paused')else:self.timer.start(self.fps,self)self.updateWindow()'''计时器事件'''deftimerEvent(self,event):ifevent.timerId()==self.timer.timerId():removed_lines=self.inner_board.moveDown()self.external_board.score+=removed_linesself.updateWindow()else:super(TetrisGame,self).timerEvent(event)'''按键事件'''defkeyPressEvent(self,event):ifnotself.is_startedorself.inner_board.current_tetris==tetrisShape().shape_empty:super(TetrisGame,self).keyPressEvent(event)returnkey=event.key()#P键暂停ifkey==Qt.Key_P:self.pause()returnifself.is_paused:return#向左elifkey==Qt.Key_Left:self.inner_board.moveLeft()#向右elifkey==Qt.Key_Right:self.inner_board.moveRight()#旋转elifkey==Qt.Key_Up:self.inner_board.rotateAnticlockwise()#快速坠落elifkey==Qt.Key_Space:self.external_board.score+=self.inner_board.dropDown()else:super(TetrisGame,self).keyPressEvent(event)self.updateWindow()'''run'''if__name__=='__main__':app=QApplication([])tetris=TetrisGame()sys.exit(app.exec_())

7、24点小游戏

玩法:通过加减乘除操作,小学生都没问题的。

源码分享:

importosimportsysimportpygamefromcfgimport*frommodulesimport*fromfractionsimportFraction'''检查控件是否被点击'''defcheckClicked(group,mouse_pos,group_type='NUMBER'):selected=[]#数字卡片/运算符卡片ifgroup_type==GROUPTYPES[0]orgroup_type==GROUPTYPES[1]:max_selected=2ifgroup_type==GROUPTYPES[0]else1num_selected=0foreachingroup:num_selected+=int(each.is_selected)foreachingroup:ifeach.rect.collidepoint(mouse_pos):ifeach.is_selected:each.is_selected=noteach.is_selectednum_selected-=1each.select_order=Noneelse:ifnum_selected<max_selected:each.is_selected=noteach.is_selectednum_selected+=1each.select_order=str(num_selected)ifeach.is_selected:selected.append(each.attribute)#按钮卡片elifgroup_type==GROUPTYPES[2]:foreachingroup:ifeach.rect.collidepoint(mouse_pos):each.is_selected=Trueselected.append(each.attribute)#抛出异常else:raiseValueError('checkClicked.group_typeunsupport%s,expect%s,%sor%s...'%(group_type,*GROUPTYPES))returnselected'''获取数字精灵组'''defgetNumberSpritesGroup(numbers):number_sprites_group=pygame.sprite.Group()foridx,numberinenumerate(numbers):args=(*NUMBERCARD_POSITIONS[idx],str(number),NUMBERFONT,NUMBERFONT_COLORS,NUMBERCARD_COLORS,str(number))number_sprites_group.add(Card(*args))returnnumber_sprites_group'''获取运算符精灵组'''defgetOperatorSpritesGroup(operators):operator_sprites_group=pygame.sprite.Group()foridx,operatorinenumerate(operators):args=(*OPERATORCARD_POSITIONS[idx],str(operator),OPERATORFONT,OPREATORFONT_COLORS,OPERATORCARD_COLORS,str(operator))operator_sprites_group.add(Card(*args))returnoperator_sprites_group'''获取按钮精灵组'''defgetButtonSpritesGroup(buttons):button_sprites_group=pygame.sprite.Group()foridx,buttoninenumerate(buttons):args=(*BUTTONCARD_POSITIONS[idx],str(button),BUTTONFONT,BUTTONFONT_COLORS,BUTTONCARD_COLORS,str(button))button_sprites_group.add(Button(*args))returnbutton_sprites_group'''计算'''defcalculate(number1,number2,operator):operator_map={'+':'+','-':'-','×':'*','÷':'/'}try:result=str(eval(number1+operator_map[operator]+number2))returnresultif'.'notinresultelsestr(Fraction(number1+operator_map[operator]+number2))except:returnNone'''在屏幕上显示信息'''defshowInfo(text,screen):rect=pygame.Rect(200,180,400,200)pygame.draw.rect(screen,PAPAYAWHIP,rect)font=pygame.font.Font(FONTPATH,40)text_render=font.render(text,True,BLACK)font_size=font.size(text)screen.blit(text_render,(rect.x+(rect.width-font_size[0])/2,rect.y+(rect.height-font_size[1])/2))'''主函数'''defmain():#初始化,导入必要的游戏素材pygame.init()pygame.mixer.init()screen=pygame.display.set_mode(SCREENSIZE)pygame.display.set_caption('24point——九歌')win_sound=pygame.mixer.Sound(AUDIOWINPATH)lose_sound=pygame.mixer.Sound(AUDIOLOSEPATH)warn_sound=pygame.mixer.Sound(AUDIOWARNPATH)pygame.mixer.music.load(BGMPATH)pygame.mixer.music.play(-1,0.0)#24点游戏生成器game24_gen=game24Generator()game24_gen.generate()#精灵组#--数字number_sprites_group=getNumberSpritesGroup(game24_gen.numbers_now)#--运算符operator_sprites_group=getOperatorSpritesGroup(OPREATORS)#--按钮button_sprites_group=getButtonSpritesGroup(BUTTONS)#游戏主循环clock=pygame.time.Clock()selected_numbers=[]selected_operators=[]selected_buttons=[]is_win=FalsewhileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit(-1)elifevent.type==pygame.MOUSEBUTTONUP:mouse_pos=pygame.mouse.get_pos()selected_numbers=checkClicked(number_sprites_group,mouse_pos,'NUMBER')selected_operators=checkClicked(operator_sprites_group,mouse_pos,'OPREATOR')selected_buttons=checkClicked(button_sprites_group,mouse_pos,'BUTTON')screen.fill(AZURE)#更新数字iflen(selected_numbers)==2andlen(selected_operators)==1:noselected_numbers=[]foreachinnumber_sprites_group:ifeach.is_selected:ifeach.select_order=='1':selected_number1=each.attributeelifeach.select_order=='2':selected_number2=each.attributeelse:raiseValueError('Unknowselect_order%s,expect1or2...'%each.select_order)else:noselected_numbers.append(each.attribute)each.is_selected=Falseforeachinoperator_sprites_group:each.is_selected=Falseresult=calculate(selected_number1,selected_number2,*selected_operators)ifresultisnotNone:game24_gen.numbers_now=noselected_numbers+[result]is_win=game24_gen.check()ifis_win:win_sound.play()ifnotis_winandlen(game24_gen.numbers_now)==1:lose_sound.play()else:warn_sound.play()selected_numbers=[]selected_operators=[]number_sprites_group=getNumberSpritesGroup(game24_gen.numbers_now)#精灵都画到screen上foreachinnumber_sprites_group:each.draw(screen,pygame.mouse.get_pos())foreachinoperator_sprites_group:each.draw(screen,pygame.mouse.get_pos())foreachinbutton_sprites_group:ifselected_buttonsandselected_buttons[0]in['RESET','NEXT']:is_win=Falseifselected_buttonsandeach.attribute==selected_buttons[0]:each.is_selected=Falsenumber_sprites_group=each.do(game24_gen,getNumberSpritesGroup,number_sprites_group,button_sprites_group)selected_buttons=[]each.draw(screen,pygame.mouse.get_pos())#游戏胜利ifis_win:showInfo('Congratulations',screen)#游戏失败ifnotis_winandlen(game24_gen.numbers_now)==1:showInfo('GameOver',screen)pygame.display.flip()clock.tick(30)'''run'''if__name__=='__main__':main()

8、外星人入侵

玩法:这让我想起了魂斗罗那第几关的boss,有点类似,不过魂斗罗那个难度肯定高点。

源码分享:

importosimportsysimportcfgimportrandomimportpygamefrommodulesimport*'''开始游戏'''defstartGame(screen):clock=pygame.time.Clock()#加载字体font=pygame.font.SysFont('arial',18)ifnotos.path.isfile('score'):f=open('score','w')f.write('0')f.close()withopen('score','r')asf:highest_score=int(f.read().strip())#敌方enemies_group=pygame.sprite.Group()foriinrange(55):ifi<11:enemy=enemySprite('small',i,cfg.WHITE,cfg.WHITE)elifi<33:enemy=enemySprite('medium',i,cfg.WHITE,cfg.WHITE)else:enemy=enemySprite('large',i,cfg.WHITE,cfg.WHITE)enemy.rect.x=85+(i%11)*50enemy.rect.y=120+(i//11)*45enemies_group.add(enemy)boomed_enemies_group=pygame.sprite.Group()en_bullets_group=pygame.sprite.Group()ufo=ufoSprite(color=cfg.RED)#我方myaircraft=aircraftSprite(color=cfg.GREEN,bullet_color=cfg.WHITE)my_bullets_group=pygame.sprite.Group()#用于控制敌方位置更新#--移动一行enemy_move_count=24enemy_move_interval=24enemy_move_flag=False#--改变移动方向(改变方向的同时集体下降一次)enemy_change_direction_count=0enemy_change_direction_interval=60enemy_need_down=Falseenemy_move_right=Trueenemy_need_move_row=6enemy_max_row=5#用于控制敌方发射子弹enemy_shot_interval=100enemy_shot_count=0enemy_shot_flag=False#游戏进行中running=Trueis_win=False#主循环whilerunning:screen.fill(cfg.BLACK)foreventinpygame.event.get():#--点右上角的X或者按Esc键退出游戏ifevent.type==pygame.QUIT:pygame.quit()sys.exit()ifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_ESCAPE:pygame.quit()sys.exit()#--射击ifevent.type==pygame.MOUSEBUTTONDOWN:my_bullet=myaircraft.shot()ifmy_bullet:my_bullets_group.add(my_bullet)#--我方子弹与敌方/UFO碰撞检测forenemyinenemies_group:ifpygame.sprite.spritecollide(enemy,my_bullets_group,True,None):boomed_enemies_group.add(enemy)enemies_group.remove(enemy)myaircraft.score+=enemy.rewardifpygame.sprite.spritecollide(ufo,my_bullets_group,True,None):ufo.is_dead=Truemyaircraft.score+=ufo.reward#--更新并画敌方#----敌方子弹enemy_shot_count+=1ifenemy_shot_count>enemy_shot_interval:enemy_shot_flag=Trueenemies_survive_list=[enemy.numberforenemyinenemies_group]shot_number=random.choice(enemies_survive_list)enemy_shot_count=0#----敌方移动enemy_move_count+=1ifenemy_move_count>enemy_move_interval:enemy_move_count=0enemy_move_flag=Trueenemy_need_move_row-=1ifenemy_need_move_row==0:enemy_need_move_row=enemy_max_rowenemy_change_direction_count+=1ifenemy_change_direction_count>enemy_change_direction_interval:enemy_change_direction_count=1enemy_move_right=notenemy_move_rightenemy_need_down=True#----每次下降提高移动和射击速度enemy_move_interval=max(15,enemy_move_interval-3)enemy_shot_interval=max(50,enemy_move_interval-10)#----遍历更新forenemyinenemies_group:ifenemy_shot_flag:ifenemy.number==shot_number:en_bullet=enemy.shot()en_bullets_group.add(en_bullet)ifenemy_move_flag:ifenemy.numberinrange((enemy_need_move_row-1)*11,enemy_need_move_row*11):ifenemy_move_right:enemy.update('right',cfg.SCREENSIZE[1])else:enemy.update('left',cfg.SCREENSIZE[1])else:enemy.update(None,cfg.SCREENSIZE[1])ifenemy_need_down:ifenemy.update('down',cfg.SCREENSIZE[1]):running=Falseis_win=Falseenemy.change_count-=1enemy.draw(screen)enemy_move_flag=Falseenemy_need_down=Falseenemy_shot_flag=False#----敌方爆炸特效forboomed_enemyinboomed_enemies_group:ifboomed_enemy.boom(screen):boomed_enemies_group.remove(boomed_enemy)delboomed_enemy#--敌方子弹与我方飞船碰撞检测ifnotmyaircraft.one_dead:ifpygame.sprite.spritecollide(myaircraft,en_bullets_group,True,None):myaircraft.one_dead=Trueifmyaircraft.one_dead:ifmyaircraft.boom(screen):myaircraft.resetBoom()myaircraft.num_life-=1ifmyaircraft.num_life<1:running=Falseis_win=Falseelse:#----更新飞船myaircraft.update(cfg.SCREENSIZE[0])#----画飞船myaircraft.draw(screen)if(notufo.has_boomed)and(ufo.is_dead):ifufo.boom(screen):ufo.has_boomed=Trueelse:#----更新UFOufo.update(cfg.SCREENSIZE[0])#----画UFOufo.draw(screen)#--画我方飞船子弹forbulletinmy_bullets_group:ifbullet.update():my_bullets_group.remove(bullet)delbulletelse:bullet.draw(screen)#--画敌方子弹forbulletinen_bullets_group:ifbullet.update(cfg.SCREENSIZE[1]):en_bullets_group.remove(bullet)delbulletelse:bullet.draw(screen)ifmyaircraft.score>highest_score:highest_score=myaircraft.score#--得分每增加2000我方飞船增加一条生命if(myaircraft.score%2000==0)and(myaircraft.score>0)and(myaircraft.score!=myaircraft.old_score):myaircraft.old_score=myaircraft.scoremyaircraft.num_life=min(myaircraft.num_life+1,myaircraft.max_num_life)#--敌人都死光了的话就胜利了iflen(enemies_group)<1:is_win=Truerunning=False#--显示文字#----当前得分showText(screen,'SCORE:',cfg.WHITE,font,200,8)showText(screen,str(myaircraft.score),cfg.WHITE,font,200,24)#----敌人数量showText(screen,'ENEMY:',cfg.WHITE,font,370,8)showText(screen,str(len(enemies_group)),cfg.WHITE,font,370,24)#----历史最高分showText(screen,'HIGHEST:',cfg.WHITE,font,540,8)showText(screen,str(highest_score),cfg.WHITE,font,540,24)#----FPSshowText(screen,'FPS:'+str(int(clock.get_fps())),cfg.RED,font,8,8)#--显示剩余生命值showLife(screen,myaircraft.num_life,cfg.GREEN)pygame.display.update()clock.tick(cfg.FPS)withopen('score','w')asf:f.write(str(highest_score))returnis_win'''主函数'''defmain():#初始化pygame.init()pygame.display.set_caption('外星人入侵——九歌')screen=pygame.display.set_mode(cfg.SCREENSIZE)pygame.mixer.init()pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.set_volume(0.4)pygame.mixer.music.play(-1)whileTrue:is_win=startGame(screen)endInterface(screen,cfg.BLACK,is_win)'''run'''if__name__=='__main__':main()

【python学习】

学Python的伙伴,欢迎加入新的交流【君羊】:1020465983

一起探讨编程知识,成为大神,群里还有软件安装包,实战案例、学习资料

如果觉得《8个Python小游戏 可以上班摸鱼玩一天》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。