卡卷网
当前位置:卡卷网 / 每日看点 / 正文

Python 有那么神吗?

作者:卡卷网发布时间:2024-12-01 20:04浏览数量:100次评论数量:0次

废话不多说直接展示

目录:

1.坦克大战

Python 有那么神吗?  第1张

''' 添加音效 1.创建我方坦克 2.我方坦克发射子弹 ''' import pygame,time,random from pygame.sprite import Sprite #定义常量 SCREEN_WIDTH = 750 SCREEN_HEIGHT= 500 BG_COLOR = pygame.Color(0,0,0) TEXT_COLOR = pygame.Color(255,0,0) #创建精灵基类 class BaseItem(Sprite): pass class MainGame(): window = None myTank = None enemyCount = 5 enemyList = [] #定义我方坦克发射的子弹列表 myBulletList = [] #定义敌方坦克发射的子弹列表 enemyBulletList = [] #定义存储爆炸效果类列表 explodeList =[] #定义墙壁列表 wallList = [] #初始化方法 def __init__(self) -> None: pass #创建敌方坦克 def createEnemyTank(self): top = 100 for i in range(MainGame.enemyCount): left = random.randint(0,600) speed = random.randint(1,4) enemyTank = EnemyTank(left,top,speed) #添加到列表 MainGame.enemyList.append(enemyTank) #加载敌方坦克 def displayEnemyTank(self): for enemyTank in MainGame.enemyList: #判断敌方坦克是否存活 if enemyTank.live: enemyTank.displayTank() #调用move进行移动 enemyTank.randMove() #初始化敌方坦克发射的子弹 #调用检测敌方坦克是否与墙壁发生碰撞 enemyTank.tank_hit_wall() #调用检测敌方坦克是否与我方坦克发生碰撞 if MainGame.myTank and MainGame.myTank.live: enemyTank.enemyTank_hit_myTank() enemyBullet = enemyTank.shot() #判断子弹是否有值 if enemyBullet: MainGame.enemyBulletList.append(enemyBullet) else:#当前敌方坦克已经死亡,从敌方坦克列表移除 MainGame.enemyList.remove(enemyTank) #显示我方坦克发射的子弹 def displayMyBullet(self): for myBullet in MainGame.myBulletList: #判断子弹是否存活 if myBullet.live : myBullet.displayBullet() #调用子弹的移动方法 myBullet.move() #调用我方子弹是否与敌方坦克碰撞 myBullet.myBullet_hit_enemyTank() #调用检测我方子弹是否与墙壁发生碰撞 myBullet.bullet_hit_wall() else: #从子弹列表中删除子弹 MainGame.myBulletList.remove(myBullet) #显示敌方坦克发射的子弹 def displayEnemyBullet(self): for enemyBullet in MainGame.enemyBulletList: #判断子弹是否存活 if enemyBullet.live: enemyBullet.displayBullet() #调用子弹移动的方法 enemyBullet.move() #调用敌方子弹与我方坦克碰撞检测 enemyBullet.enemyBullet_hit_myTank() #调用检测敌方子弹是否与墙壁发生碰撞 enemyBullet.bullet_hit_wall() else: #从子弹列表删除 MainGame.enemyBulletList.remove(enemyBullet) #循环遍历爆炸效果列表展示爆炸效果 def displayExplodeList(self): for explode in MainGame.explodeList: #判断是否存活 if explode.live: #展示 explode.displayExplode() else: #从爆炸效果列表中移除 MainGame.explodeList.remove(explode) #创建我方坦克 def createMyTank(self): MainGame.myTank = MyTank(350,300) #添加音效 music = Music('./img/start.wav') #播放 music.playMusic() #创建墙壁 def createWall(self): top = 220 for i in range(6): #初始化墙壁 wall = Wall(i*130,top) #添加到墙壁列表 MainGame.wallList.append(wall) #加载墙壁 def displayWallList(self): #循环遍历墙壁列表 for wall in MainGame.wallList: if wall.live: wall.displayWall() else: #从墙壁列表中移除 MainGame.wallList.remove(wall) #开始游戏 def startGame(self): #初始化窗口 pygame.display.init() #设置窗口大小 MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) #设置窗口的标题 pygame.display.set_caption('坦克大战1.05') #初始化我方坦克 self.createMyTank() #调用创建敌方坦克 self.createEnemyTank() #创建墙壁 self.createWall() while True: time.sleep(0.02) #给窗口设置填充色 MainGame.window.fill(BG_COLOR) #添加文字信息提示 textSurface = self.getTextSurface('敌方坦克剩余数量%d'%len(MainGame.enemyList)) #主窗口显示文字信息 MainGame.window.blit(textSurface,(10,10)) #添加事件监听 self.getEvent() #调用坦克的显示方法 if MainGame.myTank and MainGame.myTank.live: MainGame.myTank.displayTank() else: #删除我方坦克 del MainGame.myTank MainGame.myTank = None #调用坦克移动的方法 if MainGame.myTank and MainGame.myTank.live : if not MainGame.myTank.stop: MainGame.myTank.move() #调用检测我方坦克是否与墙壁发生碰撞 MainGame.myTank.tank_hit_wall() #调用检测我方坦克是否与敌方坦克发生碰撞 MainGame.myTank.myTank_hit_enemyTank() #加载敌方坦克 self.displayEnemyTank() #加载我方坦克发射的子弹 self.displayMyBullet() #加载敌方坦克发射的子弹 self.displayEnemyBullet() #加载爆炸效果 self.displayExplodeList() #加载墙壁 self.displayWallList() pygame.display.update() #结束游戏 def endGame(self): print('谢谢使用,欢迎再次使用') exit() #添加文字信息提示 def getTextSurface(self,text): #初始化字体模块 pygame.font.init() #获取所有字体 # print(pygame.font.get_fonts()) #获取字体对象 font = pygame.font.SysFont('kaiti',18) #绘制文字信息 textSurface = font.render(text,True,TEXT_COLOR) return textSurface #添加事件监听 def getEvent(self): #获取所有的事件 eventList = pygame.event.get() #遍历事件 for event in eventList: #判断按下是否是关闭 if event.type == pygame.QUIT: self.endGame() #判断是否是键盘事件 if event.type == pygame.KEYDOWN: #判断我方坦克是否消亡 if not MainGame.myTank: #判断键盘按下的是Esc键 if event.key == pygame.K_ESCAPE: #调用创建我方坦克的方法 self.createMyTank() if MainGame.myTank and MainGame.myTank.live: #判断按下的是上 下 左 右 if event.key == pygame.K_LEFT: print('按下左键,坦克向左移动') #修改我方坦克的方向 MainGame.myTank.direction='L' #修改坦克移动开关 MainGame.myTank.stop=False elif event.key == pygame.K_RIGHT: print('按下右键,坦克向右移动') #修改我方坦克的方向 MainGame.myTank.direction='R' #修改坦克移动开关 MainGame.myTank.stop=False elif event.key == pygame.K_UP: print('按下上键,坦克向上移动') #修改我方坦克的方向 MainGame.myTank.direction='U' #修改坦克移动开关 MainGame.myTank.stop=False elif event.key == pygame.K_DOWN: print('按下下键,坦克向下移动') #修改我方坦克的方向 MainGame.myTank.direction='D' #修改坦克移动开关 MainGame.myTank.stop=False elif event.key == pygame.K_SPACE: print('发射子弹') #子弹列表的数量如果小于3,可以初始化子弹 if len(MainGame.myBulletList)<3: #初始化子弹 myBullet = Bullet(MainGame.myTank) MainGame.myBulletList.append(myBullet) #添加音效 music = Music('./img/fire.wav') music.playMusic() #判断键盘键是否松开 if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT or event.key == pygame.K_UP or event.key == pygame.K_RIGHT or event.key == pygame.K_DOWN: if MainGame.myTank and MainGame.myTank.live: MainGame.myTank.stop = True class Tank(BaseItem): def __init__(self,left,top) -> None: #保存加载的图片 self.images = { 'U':pygame.image.load('./img/p1tankU.gif'), 'D':pygame.image.load('./img/p1tankD.gif'), 'L':pygame.image.load('./img/p1tankL.gif'), 'R':pygame.image.load('./img/p1tankR.gif'), } #设置坦克的方向 self.direction = 'D' #根据坦克方向,获取加载的图片 self.image = self.images.get(self.direction) #根据图片获取图片的矩形区域 self.rect = self.image.get_rect() #设置区域的left和top self.rect.left = left self.rect.top = top #速度 self.speed = 5 #坦克移动开关 self.stop = True #生存状态 self.live = True #移动之前的位置 self.oldleft = self.rect.left self.oldtop = self.rect.top #展示坦克的方法 def displayTank(self): self.image = self.images.get(self.direction) #调用blit方法展示坦克 MainGame.window.blit(self.image,self.rect) #移动坦克 def move(self): #记录移动之前的位置 self.oldleft = self.rect.left self.oldtop = self.rect.top #判断坦克的方向 if self.direction == 'L': if self.rect.left>0: self.rect.left -= self.speed elif self.direction == 'R': if self.rect.left+self.rect.height<SCREEN_WIDTH: self.rect.left += self.speed elif self.direction == 'U': if self.rect.top >0: self.rect.top -= self.speed elif self.direction == 'D': if self.rect.top+self.rect.height<SCREEN_HEIGHT: self.rect.top += self.speed #射击 def shot(self): pass #设置坦克位置为移动之前的位置 def stay(self): self.rect.left = self.oldleft self.rect.top = self.oldtop #检测坦克是否与墙壁发生碰撞 def tank_hit_wall(self): #循环遍历墙壁列表 for wall in MainGame.wallList: if pygame.sprite.collide_rect(self,wall): #设置坦克的坐标为移动之前的位置 self.stay() #我方坦克 class MyTank(Tank): #初始化方法 def __init__(self,left,top) -> None: #调用父类的初始方法 super(MyTank,self).__init__(left,top) #检测我方坦克是否与敌方坦克发生碰撞 def myTank_hit_enemyTank(self): #循环遍历敌方坦克列表 for enemyTank in MainGame.enemyList: if pygame.sprite.collide_rect(self,enemyTank): self.stay() #敌方坦克 class EnemyTank(Tank): def __init__(self,left,top,speed) -> None: #调用父类的初始化方法 super(EnemyTank,self).__init__(left,top) #加载保存的图片集 self.images= { 'U':pygame.image.load('./img/enemy1U.gif'), 'D':pygame.image.load('./img/enemy1D.gif'), 'L':pygame.image.load('./img/enemy1L.gif'), 'R':pygame.image.load('./img/enemy1R.gif'), } #设置敌方坦克方向 self.direction = self.randDirection() #根据方向获取图片 self.image = self.images.get(self.direction) #获取矩形区域 self.rect = self.image.get_rect() #设置left top self.rect.left = left self.rect.top = top self.speed = speed #步数 self.step = 60 #随机生成方向 def randDirection(self): num = random.randint(1,4) if num == 1: return 'U' elif num == 2: return 'D' elif num == 3: return 'L' elif num == 4: return 'R' #随机移动的方法 def randMove(self): if self.step <=0: #修改敌方坦克的方向 self.direction = self.randDirection() #让步数复位 self.step = 60 else: self.move() #步数递减 self.step-=1 def shot(self): #随机生成100以内的数 num = random.randint(0,100) if num<10: return Bullet(self) #检测敌方坦克是否与我方坦克发生碰撞 def enemyTank_hit_myTank(self): if pygame.sprite.collide_rect(self,MainGame.myTank): self.stay() #子弹类 class Bullet(BaseItem): def __init__(self,tank) -> None: #加载图片 self.image = pygame.image.load('./img/enemymissile.gif') #子弹的方向 self.direction = tank.direction #根据图片获取区域 self.rect = self.image.get_rect() #设置left top if self.direction == 'U': self.rect.left = tank.rect.left + tank.rect.width/2 - self.rect.width/2 self.rect.top = tank.rect.top - self.rect.height elif self.direction == 'D': self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2 self.rect.top = tank.rect.top + tank.rect.height elif self.direction == 'L': self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2 self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2 elif self.direction == 'R': self.rect.left = tank.rect.left + tank.rect.width self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2 #子弹的速度 self.speed = 6 #是否存活 self.live = True #展示子弹 def displayBullet(self): #将图片加载到窗口 MainGame.window.blit(self.image,self.rect) #移动 def move(self): if self.direction == 'U': if self.rect.top>0: self.rect.top -= self.speed else: #碰到墙壁 self.live = False elif self.direction == 'D': if self.rect.top + self.rect.height < SCREEN_HEIGHT: self.rect.top += self.speed else: self.live = False elif self.direction == 'L': if self.rect.left>0: self.rect.left -= self.speed else: self.live = False elif self.direction == 'R': if self.rect.left + self.rect.width < SCREEN_WIDTH: self.rect.left += self.speed else: self.live = False #我方子弹与敌方坦克碰撞检测 def myBullet_hit_enemyTank(self): #循环遍历敌方坦克列表 for enemyTank in MainGame.enemyList: if pygame.sprite.collide_rect(self,enemyTank): #修改敌方坦克与我方子弹的生存状态 enemyTank.live = False self.live = False #初始化爆炸效果类 explode = Explode(enemyTank) #添加爆炸效果类到爆炸效果列表中 MainGame.explodeList.append(explode) #敌方子弹与我方坦克发生碰撞 def enemyBullet_hit_myTank(self): if MainGame.myTank and MainGame.myTank.live: if pygame.sprite.collide_rect(self,MainGame.myTank): #产生爆炸效果 explode = Explode(MainGame.myTank) #将爆炸效果添加到爆炸效果列表 MainGame.explodeList.append(explode) #修改敌方子弹与我方坦克的生存状态 self.live = False MainGame.myTank.live = False #检测子弹是否与墙壁发生碰撞 def bullet_hit_wall(self): #循环遍历墙壁列表 for wall in MainGame.wallList: if pygame.sprite.collide_rect(self,wall): #设置子弹生存状态修改 self.live = False #让墙壁的生命值减减 wall.hp -=1 #判断墙壁生命值是否小于等于0 if wall.hp<=0: #设置墙壁的生存状态 wall.live = False #墙壁类 class Wall(): def __init__(self,left,top) -> None: #加载墙壁图片 self.image = pygame.image.load('./img/steels.gif') #根据图片获取区域 self.rect = self.image.get_rect() #设置left top self.rect.left = left self.rect.top = top #生存状态 self.live = True #生命值 self.hp = 3 #展示墙壁方法 def displayWall(self): MainGame.window.blit(self.image,self.rect) #爆炸效果类 class Explode(): def __init__(self,tank) -> None: #爆炸的位置是当前子弹击中坦克的位置 self.rect = tank.rect self.images = [ pygame.image.load('./img/blast0.gif'), pygame.image.load('./img/blast1.gif'), pygame.image.load('./img/blast2.gif'), pygame.image.load('./img/blast3.gif'), pygame.image.load('./img/blast4.gif'), ] self.step = 0 self.image = self.images[self.step] #生存状态 self.live = True #展示爆炸效果 def displayExplode(self): if self.step<len(self.images): self.image = self.images[self.step] self.step+=1 #添加到主窗口 MainGame.window.blit(self.image,self.rect) else: #修改存活状态 self.live = False self.step = 0 #音效类 class Music(): def __init__(self,filename) -> None: self.filename = filename #初始化混合器 pygame.mixer.init() #加载音乐 pygame.mixer.music.load(self.filename) #播放音乐 def playMusic(self): pygame.mixer.music.play() #主方法 if __name__ == '__main__': #调用主类中startGame() MainGame().startGame() # MainGame().getTextSurface('aa')

2.吃豆豆

Python 有那么神吗?  第2张

import os import sys import pygame import Levels '''定义一些必要的参数''' BLACK = (0, 0, 0) WHITE = (255, 255, 255) BLUE = (0, 0, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) YELLOW = (255, 255, 0) PURPLE = (255, 0, 255) SKYBLUE = (0, 191, 255) BGMPATH = os.path.join(os.getcwd(), 'resources/sounds/bg.mp3') ICONPATH = os.path.join(os.getcwd(), 'resources/images/icon.png') FONTPATH = os.path.join(os.getcwd(), 'resources/font/ALGER.TTF') HEROPATH = os.path.join(os.getcwd(), 'resources/images/pacman.png') BlinkyPATH = os.path.join(os.getcwd(), 'resources/images/Blinky.png') ClydePATH = os.path.join(os.getcwd(), 'resources/images/Clyde.png') InkyPATH = os.path.join(os.getcwd(), 'resources/images/Inky.png') PinkyPATH = os.path.join(os.getcwd(), 'resources/images/Pinky.png') '''开始某一关游戏''' def startLevelGame(level, screen, font): clock = pygame.time.Clock() SCORE = 0 wall_sprites = level.setupWalls(SKYBLUE) gate_sprites = level.setupGate(WHITE) hero_sprites, ghost_sprites = level.setupPlayers(HEROPATH, [BlinkyPATH, ClydePATH, InkyPATH, PinkyPATH]) food_sprites = level.setupFood(YELLOW, WHITE) is_clearance = False while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit(-1) pygame.quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: for hero in hero_sprites: hero.changeSpeed([-1, 0]) hero.is_move = True elif event.key == pygame.K_RIGHT: for hero in hero_sprites: hero.changeSpeed([1, 0]) hero.is_move = True elif event.key == pygame.K_UP: for hero in hero_sprites: hero.changeSpeed([0, -1]) hero.is_move = True elif event.key == pygame.K_DOWN: for hero in hero_sprites: hero.changeSpeed([0, 1]) hero.is_move = True if event.type == pygame.KEYUP: if (event.key == pygame.K_LEFT) or (event.key == pygame.K_RIGHT) or (event.key == pygame.K_UP) or (event.key == pygame.K_DOWN): hero.is_move = False screen.fill(BLACK) for hero in hero_sprites: hero.update(wall_sprites, gate_sprites) hero_sprites.draw(screen) for hero in hero_sprites: food_eaten = pygame.sprite.spritecollide(hero, food_sprites, True) SCORE += len(food_eaten) wall_sprites.draw(screen) gate_sprites.draw(screen) food_sprites.draw(screen) for ghost in ghost_sprites: # 幽灵随机运动() ''' res = ghost.update(wall_sprites, None) while not res: ghost.changeSpeed(ghost.randomDirection()) res = ghost.update(wall_sprites, None) ''' # 指定幽灵运动路径 if ghost.tracks_loc[1] < ghost.tracks[ghost.tracks_loc[0]][2]: ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2]) ghost.tracks_loc[1] += 1 else: if ghost.tracks_loc[0] < len(ghost.tracks) - 1: ghost.tracks_loc[0] += 1 elif ghost.role_name == 'Clyde': ghost.tracks_loc[0] = 2 else: ghost.tracks_loc[0] = 0 ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2]) ghost.tracks_loc[1] = 0 if ghost.tracks_loc[1] < ghost.tracks[ghost.tracks_loc[0]][2]: ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2]) else: if ghost.tracks_loc[0] < len(ghost.tracks) - 1: loc0 = ghost.tracks_loc[0] + 1 elif ghost.role_name == 'Clyde': loc0 = 2 else: loc0 = 0 ghost.changeSpeed(ghost.tracks[loc0][0: 2]) ghost.update(wall_sprites, None) ghost_sprites.draw(screen) score_text = font.render("Score: %s" % SCORE, True, RED) screen.blit(score_text, [10, 10]) if len(food_sprites) == 0: is_clearance = True break if pygame.sprite.groupcollide(hero_sprites, ghost_sprites, False, False): is_clearance = False break pygame.display.flip() clock.tick(10) return is_clearance '''显示文字''' def showText(screen, font, is_clearance, flag=False): clock = pygame.time.Clock() msg = 'Game Over!' if not is_clearance else 'Congratulations, you won!' positions = [[235, 233], [65, 303], [170, 333]] if not is_clearance else [[145, 233], [65, 303], [170, 333]] surface = pygame.Surface((400, 200)) surface.set_alpha(10) surface.fill((128, 128, 128)) screen.blit(surface, (100, 200)) texts = [font.render(msg, True, WHITE), font.render('Press ENTER to continue or play again.', True, WHITE), font.render('Press ESCAPE to quit.', True, WHITE)] while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() pygame.quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: if is_clearance: if not flag: return else: main(initialize()) else: main(initialize()) elif event.key == pygame.K_ESCAPE: sys.exit() pygame.quit() for idx, (text, position) in enumerate(zip(texts, positions)): screen.blit(text, position) pygame.display.flip() clock.tick(10) '''初始化''' def initialize(): pygame.init() icon_image = pygame.image.load(ICONPATH) pygame.display.set_icon(icon_image) screen = pygame.display.set_mode([606, 606]) pygame.display.set_caption('吃豆人') return screen '''主函数''' def main(screen): pygame.mixer.init() pygame.mixer.music.load(BGMPATH) pygame.mixer.music.play(-1, 0.0) pygame.font.init() font_small = pygame.font.Font(FONTPATH, 18) font_big = pygame.font.Font(FONTPATH, 24) for num_level in range(1, Levels.NUMLEVELS+1): if num_level == 1: level = Levels.Level1() is_clearance = startLevelGame(level, screen, font_small) if num_level == Levels.NUMLEVELS: showText(screen, font_big, is_clearance, True) else: showText(screen, font_big, is_clearance) '''test''' if __name__ == '__main__': main(initialize())

3.飞机大战

Python 有那么神吗?  第3张

#-*- coding:utf-8 -*- import pygame import sys from sprites import * class PlaneGame(object): """飞机大战主游戏""" def __init__(self): # print("游戏初始化") # 1. 创建游戏窗口 self.screen = pygame.display.set_mode(SCREEN_RECT.size) # 2. 创建游戏的时钟 self.clock = pygame.time.Clock() # 3. 调用私有方法,精灵和精灵组的创建 self.__create_sprites() # 4. 设定定时器事件,创建敌机 1s创建一个 pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000) # 5. 设定子弹的定时器时间,每0.4s发射一颗子弹 pygame.time.set_timer(HERO_FIRE_EVENT, 400) # 6. 设置定时器事件,创建敌机2 4s创建一个 pygame.time.set_timer(CREATE_ENEMY2_EVENT, 4000) # 初始化记分牌,来获取玩家的得分情况 self.count_die_enemy = 0 self.hero_life = 3 def __create_sprites(self): # 创建背景精灵和精灵组 bg1 = Background() bg2 = Background(True) self.back_group = pygame.sprite.Group(bg1, bg2) # 创建敌机的精灵组 self.enemy_group = pygame.sprite.Group() # 英雄初始化 self.hero = Hero() self.hero_group = pygame.sprite.Group(self.hero) def start_game(self): # print("游戏开始") while True: # 1. 设置刷新帧率 self.clock.tick(FRAME_PER_SEC) # 2. 事件监听 self.__event_handler() # 3. 碰撞检测 self.__check_collide() # 4. 更新精灵组 self.__update_sprites() # 5. 更新屏幕显示 pygame.display.update() def __event_handler(self): for event in pygame.event.get(): # 判断是否退出游戏 if event.type == pygame.QUIT: self.__game_over() elif event.type == CREATE_ENEMY_EVENT: # print("敌机出场") # 创建敌机精灵 enemy = Enemy() # 将敌机精灵添加到敌机精灵组里面去 self.enemy_group.add(enemy) elif event.type == HERO_FIRE_EVENT: # 判断是否是英雄开火的事件,如果是,就开火 self.hero.fire() elif event.type == CREATE_ENEMY2_EVENT: # print("敌机2出场") # 创建敌机精灵 enemy2 = Enemy() # 这里要更换敌机2的图片 enemy2.image = pygame.image.load("./images/enemy2.png") self.enemy_group.add(enemy2) keys_pressed = pygame.key.get_pressed() if keys_pressed[pygame.K_RIGHT]: self.hero.speed = 3 self.hero.goto = 1 elif keys_pressed[pygame.K_LEFT]: self.hero.speed = -3 self.hero.goto = 1 elif keys_pressed[pygame.K_UP]: self.hero.speed = -3 self.hero.goto = 2 elif keys_pressed[pygame.K_DOWN]: self.hero.speed = 3 self.hero.goto = 2 else: self.hero.speed = 0 def __check_collide(self): # 1. 子弹摧毁敌机--参数都是精灵组 cal_num = pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True) if len(cal_num) > 0: self.count_die_enemy += 1 if self.count_die_enemy > 30 and self.count_die_enemy <= 90: pygame.time.set_timer(CREATE_ENEMY_EVENT, 500) pygame.time.set_timer(CREATE_ENEMY2_EVENT, 2000) elif self.count_die_enemy > 90 and self.count_die_enemy <= 150: pygame.time.set_timer(CREATE_ENEMY_EVENT, 250) pygame.time.set_timer(CREATE_ENEMY2_EVENT, 1000) elif self.count_die_enemy > 150: print("游戏结束,你通关了") time.sleep(2) sys.exit() # 2. 敌机撞毁英雄-这里会返回精灵组的一个列表-如果没有发生碰撞,列表为空列表 enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True) if len(enemies) > 0: self.hero_life -= 1 if self.hero_life == 0: print("The Game Over, Your Score is :【%s】" % self.count_die_enemy) time.sleep(1) self.hero.kill() # 结束游戏 self.__game_over() def __update_sprites(self): self.back_group.update() self.back_group.draw(self.screen) self.enemy_group.update() self.enemy_group.draw(self.screen) self.hero_group.update() self.hero_group.draw(self.screen) self.hero.bullets.update() self.hero.bullets.draw(self.screen) def __game_over(self): # print("游戏结束") pygame.quit() sys.exit() if __name__ == '__main__': # 创建游戏对象 game = PlaneGame() # 启动游戏 game.start_game()

4.象棋

Python 有那么神吗?  第4张

import pygame import time import constants from button import Button import pieces import computer class MainGame(): window = None Start_X = constants.Start_X Start_Y = constants.Start_Y Line_Span = constants.Line_Span Max_X = Start_X + 8 * Line_Span Max_Y = Start_Y + 9 * Line_Span player1Color = constants.player1Color player2Color = constants.player2Color Putdownflag = player1Color piecesSelected = None button_go = None piecesList = [] def start_game(self): MainGame.window = pygame.display.set_mode([constants.SCREEN_WIDTH, constants.SCREEN_HEIGHT]) pygame.display.set_caption("天青-中国象棋") MainGame.button_go = Button(MainGame.window, "重新开始", constants.SCREEN_WIDTH - 100, 300) # 创建开始按钮 self.piecesInit() while True: time.sleep(0.1) # 获取事件 MainGame.window.fill(constants.BG_COLOR) self.drawChessboard() #MainGame.button_go.draw_button() self.piecesDisplay() self.VictoryOrDefeat() self.Computerplay() self.getEvent() pygame.display.update() pygame.display.flip() def drawChessboard(self): mid_end_y = MainGame.Start_Y + 4 * MainGame.Line_Span min_start_y = MainGame.Start_Y + 5 * MainGame.Line_Span for i in range(0, 9): x = MainGame.Start_X + i * MainGame.Line_Span if i==0 or i ==8: y = MainGame.Start_Y + i * MainGame.Line_Span pygame.draw.line(MainGame.window, constants.BLACK, [x, MainGame.Start_Y], [x, MainGame.Max_Y], 1) else: pygame.draw.line(MainGame.window, constants.BLACK, [x, MainGame.Start_Y], [x, mid_end_y], 1) pygame.draw.line(MainGame.window, constants.BLACK, [x, min_start_y], [x, MainGame.Max_Y], 1) for i in range(0, 10): x = MainGame.Start_X + i * MainGame.Line_Span y = MainGame.Start_Y + i * MainGame.Line_Span pygame.draw.line(MainGame.window, constants.BLACK, [MainGame.Start_X, y], [MainGame.Max_X, y], 1) speed_dial_start_x = MainGame.Start_X + 3 * MainGame.Line_Span speed_dial_end_x = MainGame.Start_X + 5 * MainGame.Line_Span speed_dial_y1 = MainGame.Start_Y + 0 * MainGame.Line_Span speed_dial_y2 = MainGame.Start_Y + 2 * MainGame.Line_Span speed_dial_y3 = MainGame.Start_Y + 7 * MainGame.Line_Span speed_dial_y4 = MainGame.Start_Y + 9 * MainGame.Line_Span pygame.draw.line(MainGame.window, constants.BLACK, [speed_dial_start_x, speed_dial_y1], [speed_dial_end_x, speed_dial_y2], 1) pygame.draw.line(MainGame.window, constants.BLACK, [speed_dial_start_x, speed_dial_y2], [speed_dial_end_x, speed_dial_y1], 1) pygame.draw.line(MainGame.window, constants.BLACK, [speed_dial_start_x, speed_dial_y3], [speed_dial_end_x, speed_dial_y4], 1) pygame.draw.line(MainGame.window, constants.BLACK, [speed_dial_start_x, speed_dial_y4], [speed_dial_end_x, speed_dial_y3], 1) def piecesInit(self): MainGame.piecesList.append(pieces.Rooks(MainGame.player2Color, 0,0)) MainGame.piecesList.append(pieces.Rooks(MainGame.player2Color, 8, 0)) MainGame.piecesList.append(pieces.Elephants(MainGame.player2Color, 2, 0)) MainGame.piecesList.append(pieces.Elephants(MainGame.player2Color, 6, 0)) MainGame.piecesList.append(pieces.King(MainGame.player2Color, 4, 0)) MainGame.piecesList.append(pieces.Knighs(MainGame.player2Color, 1, 0)) MainGame.piecesList.append(pieces.Knighs(MainGame.player2Color, 7, 0)) MainGame.piecesList.append(pieces.Cannons(MainGame.player2Color, 1, 2)) MainGame.piecesList.append(pieces.Cannons(MainGame.player2Color, 7, 2)) MainGame.piecesList.append(pieces.Mandarins(MainGame.player2Color, 3, 0)) MainGame.piecesList.append(pieces.Mandarins(MainGame.player2Color, 5, 0)) MainGame.piecesList.append(pieces.Pawns(MainGame.player2Color, 0, 3)) MainGame.piecesList.append(pieces.Pawns(MainGame.player2Color, 2, 3)) MainGame.piecesList.append(pieces.Pawns(MainGame.player2Color, 4, 3)) MainGame.piecesList.append(pieces.Pawns(MainGame.player2Color, 6, 3)) MainGame.piecesList.append(pieces.Pawns(MainGame.player2Color, 8, 3)) MainGame.piecesList.append(pieces.Rooks(MainGame.player1Color, 0, 9)) MainGame.piecesList.append(pieces.Rooks(MainGame.player1Color, 8, 9)) MainGame.piecesList.append(pieces.Elephants(MainGame.player1Color, 2, 9)) MainGame.piecesList.append(pieces.Elephants(MainGame.player1Color, 6, 9)) MainGame.piecesList.append(pieces.King(MainGame.player1Color, 4, 9)) MainGame.piecesList.append(pieces.Knighs(MainGame.player1Color, 1, 9)) MainGame.piecesList.append(pieces.Knighs(MainGame.player1Color, 7, 9)) MainGame.piecesList.append(pieces.Cannons(MainGame.player1Color, 1, 7)) MainGame.piecesList.append(pieces.Cannons(MainGame.player1Color, 7, 7)) MainGame.piecesList.append(pieces.Mandarins(MainGame.player1Color, 3, 9)) MainGame.piecesList.append(pieces.Mandarins(MainGame.player1Color, 5, 9)) MainGame.piecesList.append(pieces.Pawns(MainGame.player1Color, 0, 6)) MainGame.piecesList.append(pieces.Pawns(MainGame.player1Color, 2, 6)) MainGame.piecesList.append(pieces.Pawns(MainGame.player1Color, 4, 6)) MainGame.piecesList.append(pieces.Pawns(MainGame.player1Color, 6, 6)) MainGame.piecesList.append(pieces.Pawns(MainGame.player1Color, 8, 6)) def piecesDisplay(self): for item in MainGame.piecesList: item.displaypieces(MainGame.window) #MainGame.window.blit(item.image, item.rect) def getEvent(self): # 获取所有的事件 eventList = pygame.event.get() for event in eventList: if event.type == pygame.QUIT: self.endGame() elif event.type == pygame.MOUSEBUTTONDOWN: pos = pygame.mouse.get_pos() mouse_x = pos[0] mouse_y = pos[1] if ( mouse_x > MainGame.Start_X - MainGame.Line_Span / 2 and mouse_x < MainGame.Max_X + MainGame.Line_Span / 2) and ( mouse_y > MainGame.Start_Y - MainGame.Line_Span / 2 and mouse_y < MainGame.Max_Y + MainGame.Line_Span / 2): # print( str(mouse_x) + "" + str(mouse_y)) # print(str(MainGame.Putdownflag)) if MainGame.Putdownflag != MainGame.player1Color: return click_x = round((mouse_x - MainGame.Start_X) / MainGame.Line_Span) click_y = round((mouse_y - MainGame.Start_Y) / MainGame.Line_Span) click_mod_x = (mouse_x - MainGame.Start_X) % MainGame.Line_Span click_mod_y = (mouse_y - MainGame.Start_Y) % MainGame.Line_Span if abs(click_mod_x - MainGame.Line_Span / 2) >= 5 and abs( click_mod_y - MainGame.Line_Span / 2) >= 5: # print("有效点:x="+str(click_x)+" y="+str(click_y)) # 有效点击点 self.PutdownPieces(MainGame.player1Color, click_x, click_y) else: print("out") if MainGame.button_go.is_click(): #self.restart() print("button_go click") else: print("button_go click out") def PutdownPieces(self, t, x, y): selectfilter=list(filter(lambda cm: cm.x == x and cm.y == y and cm.player == MainGame.player1Color,MainGame.piecesList)) if len(selectfilter): MainGame.piecesSelected = selectfilter[0] return if MainGame.piecesSelected : #print("1111") arr = pieces.listPiecestoArr(MainGame.piecesList) if MainGame.piecesSelected.canmove(arr, x, y): self.PiecesMove(MainGame.piecesSelected, x, y) MainGame.Putdownflag = MainGame.player2Color else: fi = filter(lambda p: p.x == x and p.y == y, MainGame.piecesList) listfi = list(fi) if len(listfi) != 0: MainGame.piecesSelected = listfi[0] def PiecesMove(self,pieces, x , y): for item in MainGame.piecesList: if item.x ==x and item.y == y: MainGame.piecesList.remove(item) pieces.x = x pieces.y = y print("move to " +str(x) +" "+str(y)) return True def Computerplay(self): if MainGame.Putdownflag == MainGame.player2Color: print("轮到电脑了") computermove = computer.getPlayInfo(MainGame.piecesList) #if computer==None: #return piecemove = None for item in MainGame.piecesList: if item.x == computermove[0] and item.y == computermove[1]: piecemove= item self.PiecesMove(piecemove, computermove[2], computermove[3]) MainGame.Putdownflag = MainGame.player1Color #判断游戏胜利 def VictoryOrDefeat(self): txt ="" result = [MainGame.player1Color,MainGame.player2Color] for item in MainGame.piecesList: if type(item) ==pieces.King: if item.player == MainGame.player1Color: result.remove(MainGame.player1Color) if item.player == MainGame.player2Color: result.remove(MainGame.player2Color) if len(result)==0: return if result[0] == MainGame.player1Color : txt = "失败!" else: txt = "胜利!" MainGame.window.blit(self.getTextSuface("%s" % txt), (constants.SCREEN_WIDTH - 100, 200)) MainGame.Putdownflag = constants.overColor def getTextSuface(self, text): pygame.font.init() # print(pygame.font.get_fonts()) font = pygame.font.SysFont('kaiti', 18) txt = font.render(text, True, constants.TEXT_COLOR) return txt def endGame(self): print("exit") exit() if __name__ == '__main__': MainGame().start_game()

5.扫雷

Python 有那么神吗?  第5张

6.五子棋

Python 有那么神吗?  第6张

7.200行贪吃蛇

Python 有那么神吗?  第7张

8.150行贪吃蛇

Python 有那么神吗?  第8张

9.拼图

Python 有那么神吗?  第9张

10.滑雪小游戏

Python 有那么神吗?  第10张

11.俄罗斯方块

Python 有那么神吗?  第11张

12.植物大战僵尸

Python 有那么神吗?  第12张

import pygame import random #1 配置图片地址 IMAGE_PATH = 'imgs/' #1 设置页面宽高 scrrr_width=800 scrrr_height =560 #1 创建控制游戏结束的状态 GAMEOVER = False #4 图片加载报错处理 LOG = '文件:{}中的方法:{}出错'.format(__file__,__name__) #3 创建地图类 class Map(): #3 存储两张不同颜色的图片名称 map_names_list = [IMAGE_PATH + 'map1.png', IMAGE_PATH + 'map2.png'] #3 初始化地图 def __init__(self, x, y, img_index): self.image = pygame.image.load(Map.map_names_list[img_index]) self.position = (x, y) # 是否能够种植 self.can_grow = True #3 加载地图 def load_map(self): MainGame.window.blit(self.image,self.position) #4 植物类 class Plant(pygame.sprite.Sprite): def __init__(self): super(Plant, self).__init__() self.live=True # 加载图片 def load_image(self): if hasattr(self, 'image') and hasattr(self, 'rect'): MainGame.window.blit(self.image, self.rect) else: print(LOG) #5 向日葵类 class Sunflower(Plant): def __init__(self,x,y): super(Sunflower, self).__init__() self.image = pygame.image.load('imgs/sunflower.png') self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.price = 50 self.hp = 100 #5 时间计数器 self.time_count = 0 #5 新增功能:生成阳光 def produce_money(self): self.time_count += 1 if self.time_count == 25: MainGame.money += 5 self.time_count = 0 #5 向日葵加入到窗口中 def display_sunflower(self): MainGame.window.blit(self.image,self.rect) #6 豌豆射手类 class PeaShooter(Plant): def __init__(self,x,y): super(PeaShooter, self).__init__() # self.image 为一个 surface self.image = pygame.image.load('imgs/peashooter.png') self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.price = 50 self.hp = 200 #6 发射计数器 self.shot_count = 0 #6 增加射击方法 def shot(self): #6 记录是否应该射击 should_fire = False for zombie in MainGame.zombie_list: if zombie.rect.y == self.rect.y and zombie.rect.x < 800 and zombie.rect.x > self.rect.x: should_fire = True #6 如果活着 if self.live and should_fire: self.shot_count += 1 #6 计数器到25发射一次 if self.shot_count == 25: #6 基于当前豌豆射手的位置,创建子弹 peabullet = PeaBullet(self) #6 将子弹存储到子弹列表中 MainGame.peabullet_list.append(peabullet) self.shot_count = 0 #6 将豌豆射手加入到窗口中的方法 def display_peashooter(self): MainGame.window.blit(self.image,self.rect) #7 豌豆子弹类 class PeaBullet(pygame.sprite.Sprite): def __init__(self,peashooter): self.live = True self.image = pygame.image.load('imgs/peabullet.png') self.damage = 50 self.speed = 10 self.rect = self.image.get_rect() self.rect.x = peashooter.rect.x + 60 self.rect.y = peashooter.rect.y + 15 def move_bullet(self): #7 在屏幕范围内,实现往右移动 if self.rect.x < scrrr_width: self.rect.x += self.speed else: self.live = False #7 新增,子弹与僵尸的碰撞 def hit_zombie(self): for zombie in MainGame.zombie_list: if pygame.sprite.collide_rect(self,zombie): #打中僵尸之后,修改子弹的状态, self.live = False #僵尸掉血 zombie.hp -= self.damage if zombie.hp <= 0: zombie.live = False self.nextLevel() #7闯关方法 def nextLevel(self): MainGame.score += 20 MainGame.remnant_score -=20 for i in range(1,100): if MainGame.score==100*i and MainGame.remnant_score==0: MainGame.remnant_score=100*i MainGame.shaoguan+=1 MainGame.produce_zombie+=50 def display_peabullet(self): MainGame.window.blit(self.image,self.rect) #9 僵尸类 class Zombie(pygame.sprite.Sprite): def __init__(self,x,y): super(Zombie, self).__init__() self.image = pygame.image.load('imgs/zombie.png') self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.hp = 1000 self.damage = 2 self.speed = 1 self.live = True self.stop = False #9 僵尸的移动 def move_zombie(self): if self.live and not self.stop: self.rect.x -= self.speed if self.rect.x < -80: #8 调用游戏结束方法 MainGame().gameOver() #9 判断僵尸是否碰撞到植物,如果碰撞,调用攻击植物的方法 def hit_plant(self): for plant in MainGame.plants_list: if pygame.sprite.collide_rect(self,plant): #8 僵尸移动状态的修改 self.stop = True self.eat_plant(plant) #9 僵尸攻击植物 def eat_plant(self,plant): #9 植物生命值减少 plant.hp -= self.damage #9 植物死亡后的状态修改,以及地图状态的修改 if plant.hp <= 0: a = plant.rect.y // 80 - 1 b = plant.rect.x // 80 map = MainGame.map_list[a][b] map.can_grow = True plant.live = False #8 修改僵尸的移动状态 self.stop = False #9 将僵尸加载到地图中 def display_zombie(self): MainGame.window.blit(self.image,self.rect) #1 主程序 class MainGame(): #2 创建关数,得分,剩余分数,钱数 shaoguan = 1 score = 0 remnant_score = 100 money = 500 #3 存储所有地图坐标点 map_points_list = [] #3 存储所有的地图块 map_list = [] #4 存储所有植物的列表 plants_list = [] #7 存储所有豌豆子弹的列表 peabullet_list = [] #9 新增存储所有僵尸的列表 zombie_list = [] count_zombie = 0 produce_zombie = 100 #1 加载游戏窗口 def init_window(self): #1 调用显示模块的初始化 pygame.display.init() #1 创建窗口 MainGame.window = pygame.display.set_mode([scrrr_width,scrrr_height]) #2 文本绘制 def draw_text(self, content, size, color): pygame.font.init() font = pygame.font.SysFont('kaiti', size) text = font.render(content, True, color) return text #2 加载帮助提示 def load_help_text(self): text1 = self.draw_text('1.按左键创建向日葵 2.按右键创建豌豆射手', 26, (255, 0, 0)) MainGame.window.blit(text1, (5, 5)) #3 初始化坐标点 def init_plant_points(self): for y in range(1, 7): points = [] for x in range(10): point = (x, y) points.append(point) MainGame.map_points_list.append(points) print("MainGame.map_points_list", MainGame.map_points_list) #3 初始化地图 def init_map(self): for points in MainGame.map_points_list: temp_map_list = list() for point in points: # map = None if (point[0] + point[1]) % 2 == 0: map = Map(point[0] * 80, point[1] * 80, 0) else: map = Map(point[0] * 80, point[1] * 80, 1) # 将地图块加入到窗口中 temp_map_list.append(map) print("temp_map_list", temp_map_list) MainGame.map_list.append(temp_map_list) print("MainGame.map_list", MainGame.map_list) #3 将地图加载到窗口中 def load_map(self): for temp_map_list in MainGame.map_list: for map in temp_map_list: map.load_map() #6 增加豌豆射手发射处理 def load_plants(self): for plant in MainGame.plants_list: #6 优化加载植物的处理逻辑 if plant.live: if isinstance(plant, Sunflower): plant.display_sunflower() plant.produce_money() elif isinstance(plant, PeaShooter): plant.display_peashooter() plant.shot() else: MainGame.plants_list.remove(plant) #7 加载所有子弹的方法 def load_peabullets(self): for b in MainGame.peabullet_list: if b.live: b.display_peabullet() b.move_bullet() # v1.9 调用子弹是否打中僵尸的方法 b.hit_zombie() else: MainGame.peabullet_list.remove(b) #8事件处理 def deal_events(self): #8 获取所有事件 eventList = pygame.event.get() #8 遍历事件列表,判断 for e in eventList: if e.type == pygame.QUIT: self.gameOver() elif e.type == pygame.MOUSEBUTTONDOWN: # print('按下鼠标按键') print(e.pos) # print(e.button)#左键1 按下滚轮2 上转滚轮为4 下转滚轮为5 右键 3 x = e.pos[0] // 80 y = e.pos[1] // 80 print(x, y) map = MainGame.map_list[y - 1][x] print(map.position) #8 增加创建时候的地图装填判断以及金钱判断 if e.button == 1: if map.can_grow and MainGame.money >= 50: sunflower = Sunflower(map.position[0], map.position[1]) MainGame.plants_list.append(sunflower) print('当前植物列表长度:{}'.format(len(MainGame.plants_list))) map.can_grow = False MainGame.money -= 50 elif e.button == 3: if map.can_grow and MainGame.money >= 50: peashooter = PeaShooter(map.position[0], map.position[1]) MainGame.plants_list.append(peashooter) print('当前植物列表长度:{}'.format(len(MainGame.plants_list))) map.can_grow = False MainGame.money -= 50 #9 新增初始化僵尸的方法 def init_zombies(self): for i in range(1, 7): dis = random.randint(1, 5) * 200 zombie = Zombie(800 + dis, i * 80) MainGame.zombie_list.append(zombie) #9将所有僵尸加载到地图中 def load_zombies(self): for zombie in MainGame.zombie_list: if zombie.live: zombie.display_zombie() zombie.move_zombie() # v2.0 调用是否碰撞到植物的方法 zombie.hit_plant() else: MainGame.zombie_list.remove(zombie) #1 开始游戏 def start_game(self): #1 初始化窗口 self.init_window() #3 初始化坐标和地图 self.init_plant_points() self.init_map() #9 调用初始化僵尸的方法 self.init_zombies() #1 只要游戏没结束,就一直循环 while not GAMEOVER: #1 渲染白色背景 MainGame.window.fill((255, 255, 255)) #2 渲染的文字和坐标位置 MainGame.window.blit(self.draw_text('当前钱数$: {}'.format(MainGame.money), 26, (255, 0, 0)), (500, 40)) MainGame.window.blit(self.draw_text( '当前关数{},得分{},距离下关还差{}分'.format(MainGame.shaoguan, MainGame.score, MainGame.remnant_score), 26, (255, 0, 0)), (5, 40)) self.load_help_text() #3 需要反复加载地图 self.load_map() #6 调用加载植物的方法 self.load_plants() #7 调用加载所有子弹的方法 self.load_peabullets() #8 调用事件处理的方法 self.deal_events() #9 调用展示僵尸的方法 self.load_zombies() #9 计数器增长,每数到100,调用初始化僵尸的方法 MainGame.count_zombie += 1 if MainGame.count_zombie == MainGame.produce_zombie: self.init_zombies() MainGame.count_zombie = 0 #9 pygame自己的休眠 pygame.time.wait(10) #1 实时更新 pygame.display.update() #10 程序结束方法 def gameOver(self): MainGame.window.blit(self.draw_text('游戏结束', 50, (255, 0, 0)), (300, 200)) print('游戏结束') pygame.time.wait(400) global GAMEOVER GAMEOVER = True #1 启动主程序 if __name__ == '__main__': game = MainGame() game.start_game()

码到这里感觉有点多,代码+配套文档+视频都有

Python 有那么神吗?  第13张

END

免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。

卡卷网

卡卷网 主页 联系他吧

请记住:卡卷网 Www.Kajuan.Net

欢迎 发表评论:

请填写验证码