精华内容
下载资源
问答
  • 用Python中的pygame写个简单小游戏,用Python中的pygame写个简单小游戏
  • python pygame 简单小游戏

    千次阅读 多人点赞 2020-04-01 12:57:35
    最近学习了pygame,感觉十分有意思,花了一点时间制作了一个简单小游戏 模块区 开头导入几个需要使用的模块和一个 Player类 import jieba import os import sys import math import random import pygame import ...

    python pygame 简单小游戏

    最近学习了pygame,感觉十分有意思,花了一点时间制作了一个简单的小游戏

    效果图

    在这里插入图片描述
    这是一个很简单的防守类小游戏
    玩家可以使用wasd控制人物移动,并且鼠标控制人物旋转,发射元气弹消除敌人。敌人顺利到达城墙则玩家扣血,血量清零后游戏结束,反之坚持200秒则游戏胜利。

    模块区

    开头导入几个需要使用的模块和一个 Player类

    import jieba
    import os
    import sys
    import math
    import random
    import pygame
    import datetime
    from pygame.locals import *
    
    
    class Player(object):  #玩家 类
        def __init__(self, img, rect, speed):
            self.ful_img = img
            self.img = self.ful_img
            self.rect = rect
            self.speed = speed
            self.num = 0
    
        def update(self, screen, press_keys):  #键盘控制
            if press_keys[K_a]:
                self.rect.left -= self.speed
                if self.rect.left <= 0:
                    self.rect.left = 0
            if press_keys[K_d]:
                self.rect.left += self.speed
                if self.rect.right >= 250:
                    self.rect.right = 250
            if press_keys[K_w]:
                self.rect.top -= self.speed
                if self.rect.top <= 0:
                      self.rect.top = 0
            if press_keys[K_s]:
                self.rect.top += self.speed
                if self.rect.bottom >= 800:
                      self.rect.bottom = 800
            self.num += 1
            if self.num % 3 == 0:
                self.num = 0
            return [(self.rect.left + self.rect.right)/2, (self.rect.top + self.rect.bottom)/2], self.img
    

    设置区

    设置区包含了窗口设置区和基础设置区
    基础设计区包含了游戏时间,玩家,城墙,元气弹,敌人等设计

    if __name__ == '__main__':
    
        # 1 - 设置区
    
        # 1.1 - 窗口设置区
        white = (255, 255, 255)
        screen_width, screen_height = 1368, 800
        os.environ['SDL_VIDEO_CENTERED'] = '1'
        screen = pygame.display.set_mode((screen_width, screen_height))
        pygame.display.set_caption("Python_Game")
    
        # 1.2 - 基础设置区
        pygame.init()
    
        pygame.font.init()
        
        font = pygame.font.SysFont('SimHei',32)
        start = 0
        win = 0
        running = 0
    
        distance = 200
        health_value = 194  
        health_value_max = 194  #最大血量
        fin_time = 200   #游戏时间
        start_time = datetime.datetime.now()
    
        rect_player = Rect(50, 50, 133, 142)   #玩家设置
        player_speed = 2
        player_pos = []
    
        monsters = []  #怪物设置
        monster_speed = 1
    
        wave_set = []  #元气弹设置
        wave_speed = 1.5
        wave_max = 2
    
        fig_path = r'C:\Users\Sakura\Desktop\pythongame\gamefile/'   
        paper = pygame.image.load(fig_path + 'paper.jpg').convert_alpha()   #背景
        paper = pygame.transform.scale(paper, (1368, 800))
    
        wall = pygame.image.load(fig_path + 'walls.png').convert_alpha()  #城墙
        wall_width = wall.get_width()
        wall_height = wall.get_height()
    
        player = pygame.image.load(fig_path + 'beggers.png').convert_alpha()  #玩家
        player_width = player.get_width()
        player_height = player.get_height()
    
        waves = pygame.image.load(fig_path + 'waves.png').convert_alpha()  #元气弹
        sub_wave = waves.subsurface(Rect((0, 0), (waves.get_width() / 5, waves.get_height())))
        sub_wave_width = sub_wave.get_width()
        sub_wave_height = sub_wave.get_height()
    
        monster_img1 = pygame.image.load(fig_path + 'monster1.png').convert_alpha()  #怪物图片
        monster_width = monster_img1.get_width()
        monster_height = monster_img1.get_height()
        monster_img = monster_img1
    
        health_bar_img = pygame.image.load(fig_path + "health.png")  #血条图片
        health_bar_height = health_bar_img.get_height()
    
        health_img = pygame.image.load(fig_path + "health.png")
        health_height = health_img.get_height()
    
        victory = pygame.image.load(fig_path + 'victory.jpg')   #胜利图片
        victory = pygame.transform.scale(victory, (1368, 800))
        game_over = pygame.image.load(fig_path + 'game_over.jpg')  #失败图片
        game_over = pygame.transform.scale(game_over, (1368, 800))
    
        start_img = pygame.image.load(fig_path + 'start.jpg').convert_alpha()  #游戏开始图片
    

    游戏区

    游戏区包含了 游戏开始,进行,结束三个区块
    布局了玩家,城墙,元气弹,以及怪物的生成。此外还有元气弹于怪物抵消,血量扣除,胜负判断等数个操作。

        # 2 - 游戏区
        # 2.1 - 游戏开始区
        while not start:   #游戏开始前
            screen.fill(white)
            screen.blit(start_img, (0, 0))
            
            
            text = font.render("按空格开始游戏!",
                               True, (250, 50, 200))
            text_Rect = text.get_rect()
            text_Rect.centerx = screen.get_rect().centerx
            text_Rect.centery = screen.get_rect().centery + 200
            screen.blit(text, text_Rect)
    
            pygame.display.flip()
    
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == K_SPACE:
                        start = 1
                        running = 1
                        pygame.mixer.music.load(fig_path + "bgm.mp3")
                        pygame.mixer.music.play(1, 0.0)
                        pygame.mixer.music.set_volume(0.15)
                        start_time = datetime.datetime.now()
    
        PL = Player(player, rect_player, player_speed)  #生成玩家
        # 2.2 - 游戏进行区
        while running:
            # 2.2.1 - 游戏显示区
            screen.fill(white)
            screen.blit(paper, (0, 0))
            for height in range(0, screen_height, wall_height):  #城墙布局
                screen.blit(wall, (distance, height))
    
            press_keys = pygame.key.get_pressed()
            player_pos, player_img = PL.update(screen, press_keys)
    
            position = pygame.mouse.get_pos()  #鼠标控制玩家旋转
            angle = math.atan2(position[1] - (player_pos[1] + player_height),
                               position[0] - (player_pos[0] + player_width))
            player_rot = pygame.transform.rotate(player_img, 360 - angle * 57.29)
            player_pos1 = (player_pos[0] - player_rot.get_rect().width / 2,
                           player_pos[1] - player_rot.get_rect().height / 2)
            screen.blit(player_rot, player_pos1)
    
            for wave in wave_set:  #元气弹
                index = 0
                vel_x = math.cos(wave[0]) * wave_speed
                vel_y = math.sin(wave[0]) * wave_speed
                wave[1] += vel_x
                wave[2] += vel_y
                if wave[1] < - sub_wave_width or wave[1] > screen_width \
                        or wave[2] < - sub_wave_height or wave[2] > screen_height:
                    wave_set.pop(index)
                index += 1
                for projectile in wave_set:
                    wave1 = pygame.transform.rotate(sub_wave, 360 - projectile[0] * 57.29)
                    screen.blit(wave1, (projectile[1], projectile[2]))
            monster_timer = random.choice(range(200))
            if monster_timer < 1:
                monsters.append([screen_width,
                                 random.randint(monster_height, screen_height - monster_height)])
            index = 0
    
            for monster in monsters:   #怪物生成
                if monster[0] < - monster_width:
                    monsters.pop(index)
                monster[0] -= monster_speed
                monster_rect = pygame.Rect(monster_img.get_rect())
                monster_rect.top = monster[1]
                monster_rect.left = monster[0]
                if monster_rect.left < wall_width + distance:
                    health_value -= random.randint(20, 50)
                    monsters.pop(index)
                index1 = 0
                for wave in wave_set:
                    wave_rect = pygame.Rect(sub_wave.get_rect())
                    wave_rect.left = wave[1]
                    wave_rect.top = wave[2]
                    # 检查两个矩形块即怪物和元气弹是否交叉
                    if monster_rect.colliderect(wave_rect):
                        wave_set.pop(index1)
                        try:
                            monsters.pop(index)
                        except IndexError as error:
                            print("IndexError: " + str(error))
                    index1 += 1
                index += 1
    
            for monster in monsters:
                screen.blit(monster_img, monster)
    
            font = pygame.font.Font(None, 42)   #游戏时间
            cur_time = datetime.datetime.now()
            play_time = (cur_time - start_time).seconds
            if play_time % 60 < 10:
                time_str = ":0"
            else:
                time_str = ":"
            survived_text = font.render(
                str(play_time // 60) +
                time_str +
                str(play_time % 60),
                True, (0, 0, 0)
            )
            text_Rect = survived_text.get_rect()
            text_Rect.topright = [screen_width - 5, 5]
            screen.blit(survived_text, text_Rect)
    
            health_bar_img = pygame.transform.scale(health_bar_img,   #血量
                                                    (health_value_max, health_bar_height))
            screen.blit(health_bar_img, [0, 5])
    
            if health_value < 0:
                health_value = 0
            health_img = pygame.transform.smoothscale(health_img,
                                                (health_value, health_height))
            screen.blit(health_img, [0, 5])
    
            pygame.display.flip()
    
            # 2.2.2 - 游戏操作区
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.MOUSEBUTTONDOWN and len(wave_set) < wave_max:
                    position = pygame.mouse.get_pos()
                    wave_set.append([math.atan2(position[1] - (player_pos1[1] + player_height),
                                                position[0] - (player_pos1[0] + player_width)),
                                     player_pos1[0], player_pos1[1]])
    
            if pygame.time.get_ticks() >= fin_time * 1000:
                running = 0
                win = 1
            if health_value == 0:
                running = 0
                win = 0
    
        #  2.3 游戏结束区
        while not running and start:
    
            pygame.mixer.music.stop()
            if win:
                screen.blit(victory, (0, 0))
                pygame.font.init()
        
                font = pygame.font.SysFont('SimHei',32)
    
                text = font.render("胜利 !",
                                   True, (250, 50, 200))
                text_Rect = text.get_rect()
                text_Rect.centerx = screen.get_rect().centerx + 20
                text_Rect.centery = screen.get_rect().centery - 250
                screen.blit(text, text_Rect)
            if not win:
                screen.blit(game_over, (0, 0))
                
                pygame.font.init()
        
                font = pygame.font.SysFont('SimHei',32)
    
                text = font.render("失败 !",
                                   True, (250, 50, 200))
                text_Rect = text.get_rect()
                text_Rect.centerx = screen.get_rect().centerx + 20
                text_Rect.centery = screen.get_rect().centery - 250
                screen.blit(text, text_Rect)
                
            pygame.display.flip()
    
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
    

    源代码链接

    源代码 github

    展开全文
  • 使用pygame制作Flappy bird小游戏

    千次阅读 多人点赞 2020-03-12 16:31:28
    最近看到很多大佬用强化学习玩Flappy bird。所以打算也上手玩一玩,但是苦于没找到pc上的这个游戏,找了点资料,发现并不是很难,所以来自己做一个。本文持续更新,欢迎关注~

    原文链接:
    使用pygame制作Flappy bird小游戏

    本文需要的素材全部放到公众号【拇指笔记】里了,需要的同学回复"FPB"即可。

    0. 最终效果:

    1. 搭建一个最小框架

    1.1 需要的函数

    1. 初始化所有导入的pygame模块。
    pygame.init()
    
    1. 生成一个窗口。返回的是一个surface对象。通过resolution设置窗口大小,flags代表扩展选项,depth代表设置颜色,但不建议设置。
    pygame.display.set_mode((resolution =(0,0),flags = 0,depth = 0))
    
    1. 设置窗口标题。
    pygame.display.set_caption("Flappy bird_Lin")
    
    1. 检测事件。
    pygame.event.get()
    
    1. 更新显示。
    pygame.display.update()
    
    1. 结束程序。
    pygame.quit()
    sys.exit()
    

    1.2 搭建框架

    首先,导入需要的库。

    import sys
    import pygame
    from pygame.locals import *
    

    其次,进行模块初始化并设置。

    pygame.init()
    screen = pygame.display.set_mode((288,512))
    pygame.display.set_caption("Flappy bird_Lin")
    

    最后,获取事件并响应。

    #在本例中,唯一需要检测的事件就是是否退出
    while True:
    	for event in pygame.event.get():
    		if event.type == pygame.QUIT:
                pygame.quit()
    			sys.exit()
        pygame.display.update()	#刷新屏幕
    

    1.3 完整框架

    import sys
    import pygame
    from pygame.locals import *
    
    pygame.init()
    screen = pygame.display.set_mode((288,512))
    pygame.display.set_caption("Flappy bird_Lin")
    
    #在本例中,唯一需要检测的事件就是是否退出
    while True:
    	for event in pygame.event.get():
    		if event.type == pygame.QUIT:
                pygame.quit()
    			sys.exit()
        pygame.display.update()	#更新屏幕
    

    2. 添加图片元素

    2.2 实现效果

    2.1 需要的函数

    1. 从文件中加载新文件。返回一个Surface
    pygame.image.load('图片路径')
    
    1. 在窗口上添加图片。source:第一步返回的Surface;dest:指定绘制位置。
    screen.blit(source,dest)
    
    1. 更新屏幕
    pygame.display.update()	#更新屏幕
    

    2.2 添加到框架

    因为我要实现的是Flappy_bird,所以我将Flappy_bird开始界面的图像元素添加到框架。

    background_image = 'K:/bird/background-night.png'
    green = 'K:/bird/base.png'
    mid_b = 'K:/bird/bluebird-midflap.png'
    welcome = 'K:/bird/message.png'
    
    import pygame
    from pygame.locals import *
    import sys
    
    pygame.init()
    screen = pygame.display.set_mode((288,512))
    pygame.display.set_caption("Flappy bird_Lin")
    
    background = pygame.image.load(background_image)
    green_base = pygame.image.load(green)
    mid_bird = pygame.image.load(mid_b)
    welcome1 = pygame.image.load(welcome)
    
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        screen.blit(background,(0,0))
        screen.blit(green_base,(0,400))
        screen.blit(mid_bird,(52,225))
        screen.blit(welcome1,(52,52))
        pygame.display.update()
    

    3. 实现小鸟飞行效果

    让图片动起来其实很容易,只需要有规律的改变图片的位置坐标。但这种方式会导致在不同情况下,图片的移动速度不一样(程序的运行速度变化了)。因此,我们使用另一种方法解决这个问题。

    为了保证在相同时间里小鸟运动的距离相同,我们引入了Clock对象,用来计算每一帧经过的时间,速度*时间=距离,所以我们只需要设定一个不变的速度值,就可以保证图片在任何情况下运动速度均相同。

    3.0 实现效果

    3.1 需要的函数

    1. 初始化Clock对象。
    pygame.time.Clock()
    
    1. 更新时钟,计算自上次调用以来经过了多少毫秒。
    clock.tick()
    

    3.2 思路实现

    首先需要在进入循环之前,初始化Clock对象并设定一个速度值。然后在循环中每一帧都记录一次运行时间。最后将运行时间乘以速度值,就得到了本次应该运行的距离。

    #进入循环之前
    clock = pygame.time.Clock()
    speed = 100
    
    #进入循环
    	time_passed = clock.tick()
    	time_passed_ms = time_passed/1000	#毫秒转换为秒
    	distance = speed*time_passed_ms
    	x += distance	#图片的坐标位置
        
        if x >lim:
        	x -= lim	#清0,为了减少运行时间不直接归零
    

    3.3 添加到框架

    background_image = 'K:/bird/background-night.png'
    green = 'K:/bird/base.png'
    mid_b = 'K:/bird/bluebird-midflap.png'
    welcome = 'K:/bird/message.png'
    
    import pygame
    from pygame.locals import *
    import sys
    
    pygame.init()
    screen = pygame.display.set_mode((288,512))
    pygame.display.set_caption("Flappy bird_Lin")
    
    background = pygame.image.load(background_image)#.convert()
    green_base = pygame.image.load(green)
    mid_bird = pygame.image.load(mid_b)
    welcome1 = pygame.image.load(welcome)
    
    base_x = 0
    bird_y = 225
    speed = 100
    clock = pygame.time.Clock()
    
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        screen.blit(background,(0,0))
        screen.blit(green_base,(base_x,400))
        screen.blit(mid_bird,(52,bird_y))
        screen.blit(welcome1,(52,52))
    
        time_passed = clock.tick()
        time_passed_seconds = time_passed / 1000.0
     
        distance_moved = time_passed_seconds * speed
        base_x -= distance_moved
        if base_x<-40:
            base_x += 40
        
        pygame.display.update()
    

    4. 实现小鸟煽动翅膀效果

    实现小鸟飞行效果一共需要两步,首先是需要让小鸟上下移动,其次是切换图片以实现扇动翅膀的效果。

    4.1 小鸟上下移动

    这一步实现很简单,方法和上面的一致。不再赘述,直接上代码了。

    #进入循环前
    base_y = 225
    bird_speed = 50
    #进入循环
    	time_passed_seconds = time_passed / 1000.0 
        bird_distance = time_passed_seconds * bird_speed    
        base_y = base_y + dir*bird_distance
        if base_y >240:
            dir = -1
        if base_y <210:
            dir = 1
    

    添加到框架的步骤也不再赘述了,与前面一致。

    4.2 小鸟扇动翅膀

    实现小鸟扇动翅膀的效果只需要每隔几帧切换一次图像。但同样容易随着机器性能等原因,出现时快时慢的现象,为了解决这个问题,可以采用与绿砖运动相似的方法,基于时间的图像切换。

    #在进入循环前的部分需要添加切换速度和计数值
    change_speed = 500
    count = 0
    #进入循环后
    	#需要根据运行时间,决定计数增大的幅度(变化的快慢)
    	count +=change_speed*time_passed_seconds
        if 0<=(count)<=50:
            screen.blit(mid_bird,(52,base_y))
            
        elif 50<(count)<=100:
            screen.blit(up_bird,(52,base_y))
            
        elif 100<(count)<=150:
            screen.blit(down_bird,(52,base_y))
        #当计数值过大时,归零,以减少运行时间
        if count>140:
            count -= 140 
    

    最后


    在学习Python一年中,收集了很多Python学习资料,在这里整理一下,分享给各位!

    Python入门、数据分析、爬虫、运维、机器学习方面的学习资料

    干货 | Python学习资源整理分享

    展开全文
  • 用Python和Pygame小游戏1

    千次阅读 2020-02-18 14:15:49
    ​掌握一门语言最好的办法就是写个小游戏,这样又有趣味性,又可以学到很多这门语言的知识。因为游戏对性能要求比较高,你就必须找出各种方式去优化。基本上一个复杂点的游戏写完后, 就基本算掌握了这门语言 pygame...


    ​掌握一门语言最好的办法就是写个小游戏,这样又有趣味性,又可以学到很多这门语言的知识。因为游戏对性能要求比较高,你就必须找出各种方式去优化。基本上一个复杂点的游戏写完后, 就基本算掌握了这门语言

    pygame是python上最出名的游戏引擎,安装好后我们写个简单的窗口测试下
    1.png
    运行后就出来个黑乎乎的窗口,说明安装正确。程序很简单,初始化pygame后,创建个screen, 就是窗口的。然后就进入主循环。这里我们只是简单的调用pygame退出事件去退出循环。而实际游戏里,一般还要创建个游戏菜单,在“退出游戏”里调用退出循环。
    2.png
    做为一个游戏,肯定是需要加载大量图片的,pygame自带了图片加载功能 ,然后用screen的blit方法把图片放在一个位置。50,50就是屏幕横轴和纵轴坐标,还记着初中数学讲过的XY轴吗?就是这个概念
    3.png
    因为图片过大没有全部显示,可以看到图片的左上角显示在(50,50)的位置。我们需要把图片缩小一下。因为玩家的屏幕大小和分辨率不一样,所以我们最好是编程实现图片的缩放,而不是直接用ps改变图片的大小。
    4.png

    5.png
    游戏是交互性的,所以我们要捕捉用户的输入,然后给予反馈。这里我们要实现图片的向右滑动。老玩家都是会用方向键的,在按下方向键后,就需要更新屏幕,然后把图片更新放在新的坐标,也就是把增加x轴的坐标值。这就是游戏的核心编程思路了,玩家的输入都是要转换成数学公式后更新屏幕。
    7.png

    8.png

    fill函数就是用RGB颜色更新屏幕。所谓RGB就是三原色的二进制表示, (0,0,0)就是黑色。x就是坐标值,每次按下方向键,我们就递增10。然后显示图片和更新屏幕。这就是一个简陋的游戏了。

    好了,留个课后作业,怎么让图片加速滑动呢?

    扫码关注公众号,获取最新文章
    qrcode_for_gh_49497593f54f_258 (2).jpg

    展开全文
  • 使用pygame制作一个贪吃蛇的小游戏

    千次阅读 2019-07-17 14:55:38
    首先我们需要导入待使用的模块: 首先我们需要导入待使用的模块: 如果你依然在编程的世界里迷茫, 不知道自己的未来规划, 对python感兴趣, 这里推荐一下我的学习交流圈Q群号:...pygame.locals 模块包含pyga...

    首先我们需要导入待使用的模块:

    • 首先我们需要导入待使用的模块:

    如果你依然在编程的世界里迷茫,
    不知道自己的未来规划,
    对python感兴趣,
    这里推荐一下我的学习交流圈Q群号:895 797 751,
    里面都是学习python的,

    import pygame, sys, random
    from pygame.locals import *
    

    pygame.locals 模块包含pygame使用的各种常量,它的内容会被自动放入到 Pygame 模块的名字空间中。

    • 模块导入之后我们可以先定义好会用到的颜色,根据大家的喜好定义:
    # 定义颜色
    ```python
    pinkColor = pygame.Color(255, 182, 193)
    blackColor = pygame.Color(0, 0, 0)
    whiteColor = pygame.Color(255, 255, 255)
    

    pygame.Color()是用于描述颜色的对象,

    Color(name) -> Color
    Color(r, g, b , a) -> Color
    Color(rgbvalue)>Color
    
    # Color对象的方法&属性
    pygame.Color.r  :获取或者设置Color对象的红色值
    pygame.Color.g :获取或者设置Color对象的绿色值
    pygame.Color.b :获取或者设置Color对象的蓝色值
    pygame.Color.a :获取或者设置Color对象的alpha值
    pygame.Color.cmy :获取或者设置Color对象的cmy值
    pygame.Color.hsva :获取或者设置Color对象的hsav值
    pygame.Color.hsla :获取或者设置Color对象的hsla值
    pygame.Color.i 1i2i3 :获取或者设置Color对象的I1I2I3描述
    pygame.Color.normalize : 返回一个Color对象的RGBA(显示通道)值
    pygame.Color.correct gamma :Color对象请求一个确定gamma值
    pygame.Color.set length  :设置在Color对象中元素的数值为123,或4
    
    • 当游戏结束时,我们需要退出这个游戏,所我们需要给游戏定义一个用于退出的函数,很简单,就是先退出pygame窗口,再退出程序:
    # 定义游戏结束的函数
    def gameover():
        # 退出pygame窗口
        pygame.quit()
        # 退出程序
        sys.exit()
    
    
    • 定义好结束函数之后,我们需要定义一个入口函数,用于进入游戏,游戏的主要代码都写在这里面:
    def main():
        # 初始化
        pygame.init()
        # 定义一个变量来控制速度
        time_clock = pygame.time.Clock()
    
        # 创建窗口,定义标题
        screen = pygame.display.set_mode((640, 480))
        pygame.display.set_caption("贪吃蛇")
    
    • 首先我们需要初始化pygame,创建好游戏窗口,顺便定义一个用来控制速度的变量,这个变量用于贪吃蛇的移动。

    • 接着初始化一些贪吃蛇和食物用到的变量,将整个界面看成许多20x20的小方块,每个方块代表一个单位

        # 定义蛇的初始化变量
        snakePosition = [100, 100]  # 蛇头位置
        # 定义一个贪吃蛇的长度列表,其中有几个元素就代表有几段身体,这里我们定义5段身体
        snakeSegments = [[100, 100], [80, 100], [60, 100], [40, 100], [20, 100]]
    
        # 初始化食物位置
        foodPostion = [300, 300]
       
        # 食物数量,0表示被吃了,1表示没被吃
        foodTotal = 1
        
        # 初始方向,向右
        direction = 'right'
        # 定义一个改变方向的变量,按键
        changeDirection = direction
    
    
    • 初始化好数据之后,使用while循环来侦听事件,通过不断地循环使蛇不断地前进
        while True:
            # 从队列中获取事件
            for event in pygame.event.get():
                # 判断是否为退出事件
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                # 按键事件
                elif event.type == KEYDOWN:
                    # 如果是右键头或者是d,蛇向右移动
                    if event.key == K_RIGHT or event.key == K_d:
                        changeDirection = 'right'
                    # 如果是左键头或者是a,蛇向左移动
                    if event.key == K_LEFT or event.key == K_a:
                        changeDirection = 'left'
                    if event.key == K_UP or event.key == K_w:
                        changeDirection = 'up'
                    if event.key == K_DOWN or event.key == K_s:
                        changeDirection = 'down'
                    # 对应键盘上的Esc键,表示退出
                    if event.key == K_ESCAPE:
                        pygame.event.post(pygame.event.Event(QUIT))
    

    KEYDOWN是键盘按键事件,而K_RIGHT 、K_LEFT 、K_d、K_a等这些表示对应键盘上的按键。

    • 确认蛇的移动方向,不能向反方向移动,比如此时蛇是向右移动的,则不能控制它向左移动,只向上或向下
            # 确认方向,判断是否输入了反方向运动
            if changeDirection == 'right' and not direction == 'left':
                direction = changeDirection
            if changeDirection == 'left' and not direction == 'right':
                direction = changeDirection
            if changeDirection == 'up' and not direction == 'down':
                direction = changeDirection
            if changeDirection == 'down' and not direction == 'up':
                direction = changeDirection
    
    
    • 通过像素的加减确定蛇头的移动向上或向下加减20px相当于向上下移动一步
            # 根据方向移动蛇头
            if direction == 'right':
                snakePosition[0] += 20
            if direction == 'left':
                snakePosition[0] -= 20
            if direction == 'up':
                snakePosition[1] -= 20
            if direction == 'down':
                snakePosition[1] += 20
    
            # 增加蛇的长度
            snakeSegments.insert(0, list(snakePosition))
            # 判断是否吃到食物
            if snakePosition[0] == foodPostion[0] and snakePosition[1] == foodPostion[1]:
                foodTotal = 0
            else:
                snakeSegments.pop()  # 每次将最后一单位蛇身剔除列表
            # 如果食物为0 重新生成食物
            if foodTotal == 0:
                x = random.randrange(1, 32)
                y = random.randrange(1, 24)
                foodPostion = [int(x * 20), int(y * 20)]
                foodTotal = 1
            # 绘制pygame显示层
            screen.fill(blackColor)
    
    
    • 设置蛇与食物的颜色长宽
            for position in snakeSegments:  # 蛇身为白色
                # 化蛇
                pygame.draw.rect(screen, pinkColor, Rect(position[0], position[1], 20, 20))
                pygame.draw.rect(screen, whiteColor, Rect(foodPostion[0], foodPostion[1], 20, 20))
    
    • 更新显示到屏幕表面

    pygame.display.flip()

    • 判断游戏是否结束
             # 判断游戏是否结束
            if snakePosition[0] > 620 or snakePosition[0] < 0:
                gameover()
            elif snakePosition[1] > 460 or snakePosition[1] < 0:
                gameover()
            # 如果碰到自己的身体
            for body in snakeSegments[1:]:
                if snakePosition[0] == body[0] and snakePosition[1] == body[1]:
                    gameover()
    
            # 控制游戏速度
            time_clock.tick(5)
    
    • 入口函数
    if __name__ == '__main__':
        main()
    

    效果图
    在这里插入图片描述
    在这里插入图片描述
    完整代码

    import pygame, sys, random
    from pygame.locals import *
    
    
    # 定义颜色
    pinkColor = pygame.Color(255, 182, 193)
    blackColor = pygame.Color(0, 0, 0)
    whiteColor = pygame.Color(255, 255, 255)
    
    
    # 定义游戏结束的函数
    def gameover():
        pygame.quit()
        sys.exit()
    
    
    def main():
        # 初始化
        pygame.init()
        # 定义一个变量来控制速度
        time_clock = pygame.time.Clock()
    
        # 创建窗口,定义标题
        screen = pygame.display.set_mode((640, 480))
        pygame.display.set_caption("贪吃蛇")
    
        # 定义蛇的初始化变量
        snakePosition = [100, 100]  # 蛇头位置
        # 定义一个贪吃蛇的长度列表,其中有几个元素就代表有几段身体
        snakeSegments = [[100, 100], [80, 100], [60, 100], [40, 100], [20, 100]]
        # 初始化食物位置
        foodPostion = [300, 300]
        # 食物数量,1是没被吃,0是被吃了
        foodTotal = 1
        # 初始方向,向右
        direction = 'right'
        # 定义一个改变方向的变量,按键
        changeDirection = direction
    
        # 通过键盘控制蛇的运动
        while True:
            # 从队列中获取事件
            for event in pygame.event.get():
                # 判断是否为退出事件
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                # 按键事件
                elif event.type == KEYDOWN:
                    # 如果是右键头或者是d,蛇向右移动
                    if event.key == K_RIGHT or event.key == K_d:
                        changeDirection = 'right'
                    # 如果是左键头或者是a,蛇向左移动
                    if event.key == K_LEFT or event.key == K_a:
                        changeDirection = 'left'
                    if event.key == K_UP or event.key == K_w:
                        changeDirection = 'up'
                    if event.key == K_DOWN or event.key == K_s:
                        changeDirection = 'down'
                    # 对应键盘上的Esc键,表示退出
                    if event.key == K_ESCAPE:
                        pygame.event.post(pygame.event.Event(QUIT))
    
            # 确认方向,判断是否输入了反方向运动
            if changeDirection == 'right' and not direction == 'left':
                direction = changeDirection
            if changeDirection == 'left' and not direction == 'right':
                direction = changeDirection
            if changeDirection == 'up' and not direction == 'down':
                direction = changeDirection
            if changeDirection == 'down' and not direction == 'up':
                direction = changeDirection
    
            # 根据方向移动蛇头
            if direction == 'right':
                snakePosition[0] += 20
            if direction == 'left':
                snakePosition[0] -= 20
            if direction == 'up':
                snakePosition[1] -= 20
            if direction == 'down':
                snakePosition[1] += 20
    
            # 增加蛇的长度
            snakeSegments.insert(0, list(snakePosition))
            # 判断是否吃到食物
            if snakePosition[0] == foodPostion[0] and snakePosition[1] == foodPostion[1]:
                foodTotal = 0
            else:
                snakeSegments.pop()  # 每次将最后一单位蛇身剔除列表
    
            # 如果食物为0 重新生成食物
            if foodTotal == 0:
                x = random.randrange(1, 32)
                y = random.randrange(1, 24)
                foodPostion = [int(x * 20), int(y * 20)]
                foodTotal = 1
    
            # 绘制pygame显示层
            screen.fill(blackColor)
    
    
            for position in snakeSegments:  # 蛇身为白色
                # 化蛇
                pygame.draw.rect(screen, pinkColor, Rect(position[0], position[1], 20, 20))
                pygame.draw.rect(screen, whiteColor, Rect(foodPostion[0], foodPostion[1], 20, 20))
    
            # 更新显示到屏幕表面
            pygame.display.flip()
    
            # 判断游戏是否结束
            if snakePosition[0] > 620 or snakePosition[0] < 0:
                gameover()
            elif snakePosition[1] > 460 or snakePosition[1] < 0:
                gameover()
            # 如果碰到自己的身体
            for body in snakeSegments[1:]:
                if snakePosition[0] == body[0] and snakePosition[1] == body[1]:
                    gameover()
    
            # 控制游戏速度
            time_clock.tick(5)
    
    
    
    #  启动入口函数
    if __name__ == '__main__':
        main()
    
    如果你依然在编程的世界里迷茫,
    不知道自己的未来规划,
    对python感兴趣,
    这里推荐一下我的学习交流圈QQ群号:895 797 751,
    里面都是学习python的,
    
    展开全文
  • 使用Pygame制作2048小游戏

    千次阅读 多人点赞 2020-07-28 21:23:51
    好久没有写文章了,暑假一直没有怎么学习计算机方面的相关...现在先来分享一下我的python课两个期末大作业之一——Pygame开发的2048 一、游戏效果展示 1.运行程序,出现欢迎界面。点击鼠标左键后,出现主菜单界面。.
  • pygame初探——制作简单小游戏

    千次阅读 2019-08-04 21:27:55
    pygame是Python中用于游戏编写的扩展模块,是利用SDL库编写的游戏库,而SDL全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛写的。SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言...
  • import pygame import random # 设置标题、背景和图标 pygame.init () screen = pygame.display.set_mode ( (800 , 600) ) pygame.display.set_caption ( '飞机大战BETA' ) icon = pygame.image.load ( 'fly.png' )...
  • pygame做一个简单的python小游戏---七彩同心圆

    万次阅读 多人点赞 2020-12-13 10:00:58
    pygame做一个简单的python小游戏—七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便加强一下pygame库的学习。 玩法:每次点击鼠标时,会以鼠标为圆心,不断向外扩展圆...
  • Python Pygame制作简单五子棋游戏(详细代码+解释)

    千次阅读 多人点赞 2021-08-08 21:58:45
    希望本文有助于你制作自己期望的简单的五子棋。 效果如下: 右边白色的矩形框表示你鼠标当前的位置,然后点击鼠标左键落子。 如果已经落子的地方,不会显示这个白色矩形框。 一、pygame初始化画布界面 #调用pygame...
  • 作者 |周萝卜来源| 萝卜大杂烩相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了。用到的 Pygame 函数 贪吃蛇小游戏用到的函数...
  • 这篇博客是用书本项目的前半段知识,自己写出来的小游戏,一些计分之类的功能还没有加上去。主要内容是控制一个挡板,躲避从上空掉落下来的球。 我把下面的挡板和上面的球都设置为黑色长方体了,可以自己把上面的...
  • 往期回顾python制作小游戏(十九)python制作小游戏(二十)python制作小游戏(二十一)python制作小游戏(二十二)python制作小游戏(二十三)python制作小游戏(二十四)导语最近脑子不太好使,儿童节到了,也没想出可以做点啥...
  • pygame做一个简单的python小游戏—生命游戏 生命游戏(Game of Life) 生命游戏(Game of Life)是剑桥大学约翰·何顿·康威(John Horton Conway)教授设计的一个计算机程序。这个计算机程序是因为它模拟和显示的图像...
  • pygame2048(功能不完全版)
  • pygame做的一个小游戏,可以当成是python课程的大作业
  • pygame制作贪吃蛇游戏(详细)

    万次阅读 多人点赞 2019-05-09 17:11:48
    首先我们要做的这款游戏界面是很low的,因为我们做的这款游戏算是最简单最入门的一款游戏 玩过这个游戏的人都很清楚,这个蛇在行走时的每一个格子都会移动到他前一个格子的位置,类似于这样一个一个跟随着往前走,最...
  • pygame写的一个简单地拼图游戏,有注释
  • 使用 Python 的 PyGame 做了一个弹球游戏,第一次使用Py做游戏,分享一下。 下载地址 下载链接: http://101.201.112.95/2021/PyGame_Pong.zip 复制到浏览器 执行 index.py 就可以运行游戏了 . PyGame开发游戏...
  • 一个用python和pygame制作简单乒乓球游戏 这个程序最初是由 pygame.org 创建者 Baris Bayrak (garib) 创建的他的代码: ://www.pygame.org/project-Very+simple+Pong+game-816-.html 我刚加了两个玩家,一局11胜...
  • pygame实现贪吃蛇小游戏 由于这段时间实在是太聊了,没什么事做,游戏也玩腻了,所以玩起来pygamepygame是真的容易上手,但用来做游戏也有很大的局限性,做一些小游戏还是没什么问题的。 首先,制作游戏最大的问题...
  • 【Python_pygame制作一个游戏

    千次阅读 2020-05-16 11:33:11
        ▊ 效果图 :   ▊ 代码框架 : 《飞机大战》(by甲鱼)           > > 传送门 《【Python_pygame】经典的飞机大战》    > > 传送门   ...
  • 二、源程序 alien_invasion.py import sys #退出游戏 import pygame #包含开发所需功能 from settings import Settings from ship import Ship from alien import Alien import game_functions as gf from pygame....
  • 这里行哥分享一下十个python可以制作的经典游戏,看看有没有你的菜,代码链接放在文末对了以下游戏皆是小学六年级的代码水平如有不适,赶快学习1、小鸟管道使用模块:pygame代码长度:139行行哥评语:强迫症的克星2....
  • python版小黄脸大战(Pygame写的小游戏

    千次阅读 多人点赞 2019-11-14 16:32:49
    是一个仿飞机大战的小游戏,挺有意思的。那个时候我每天晚上都在弄这个,写了两个多星期,完成后满满的自豪。现在回想起来,年轻真好! 因为大二的时候换了台电脑,以前的很多东西都在旧电脑里。(它被我放在了柜子...
  • Pygame:编写一个小游戏

    万次阅读 多人点赞 2017-06-20 15:06:55
    偶然接触了pygame,觉得很感兴趣,所以打算使用pygame制作一个小游戏作为对Python学习和练习。 废话不多说了,先介绍一下pygame。简要介绍:请原谅本人比较懒,直接上百度百科进行介绍:(点我打开链接)
  • 使用python和pygame制作一款战机小游戏 目录 摘要 1 引言 1.1 背景 1.2 意义 1.3 玩法概述 2 系统结构 2.1 系统整体结构 2.2 相关技术 2.2.1 python 2.2.2 pygame 2.2.3 random 2.3 模块介绍 2.3.1 界面...
  • 此文转载自:... 用pygame做一个简单的python小游戏—贪吃蛇 贪吃蛇游戏链接: c++贪吃蛇:https://blog.csdn.net/weixin_46791942/article/details/106850986 python贪吃蛇:htt...
  • 翻译自Will McGugan的《Beginning GameDevelopment withPython and Pygame –From Novice to Professional》,有兴趣的朋友可以搜一下,有英文版的PDF可以下载。其实也不是翻译,把精华摘出来,共同学习。 看这个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,794
精华内容 717
关键字:

pygame制作简单小游戏