使用python设计2048小游戏

本文介绍了如何使用Python的pygame模块设计2048小游戏,重点在于类的设计,包括背景格子类和球类。通过初始化图片和语音信息,创建游戏界面,并实现对键盘输入的响应,进行小球的移动和合并操作。在移动和合并过程中,处理合并规则,确保游戏逻辑正确。文章强调了良好的Python基础和清晰的思维对于游戏设计的重要性。
摘要由CSDN通过智能技术生成

使用python设计2048小游戏


使用pygame模块进行游戏的设计,但是没有做到2048最后对游戏胜利的判断算法。后期有时间进行修改。
附上github代码和csdn源代码下载链接:

github链接

这个游戏的设计,其实除了pygame模块的使用,更多的是你python的基本功,一些列表的操作等,都是很基本的操作,如果你python基础够扎实,思维清晰,很容易就可以设计出一个游戏。(虽然我这游戏代码才400多行就可以实现,但是在设计的过程中出现了很多bug,改了很久。)

类的设定

整体思路是这样,首先创建两个类,一个是后边的background类,用来实现16个框的分布(也就是小球能存在的16个格子)。第二个类是ball类,也就是小球类,从而能够产生游戏的小球。球有很多种等级,也就是对应2048的不同级别。
首先创建16个background对象,组成4行4列的背景。它们有各自的属性(学过类的应该都懂),在初始化的时候基于self.possess属性,也就是你这个格子上面有没有球,如果有球的话,那么你操作之后生成的小球就不能再在这个格子出现了。还有包括这个格子的行、列数,从而能够唯一识别一个格子。下面是球类和格子类的代码:

class Glass(pygame.sprite.Sprite):
    def __init__(self,glass_image,position,line,column,level):
        pygame.sprite.Sprite.__init__(self)
        self.glass_image = pygame.image.load(glass_image).convert()
        self.rect = self.glass_image.get_rect()
        self.rect.left,self.rect.top = position
        self.line = line
        self.column = column
        self.possess = False
        self.level = level

class Ball(pygame.sprite.Sprite):
    def __init__(self,ball_image,position,line,column,level):
        pygame.sprite.Sprite.__init__(self)
        self.ball_image = pygame.image.load(ball_image).convert_alpha()
        self.rect = self.ball_image.get_rect()
        self.rect.left,self.rect.top = position
        self.line = line
        self.column = column
        self.level = level

初始化图片、语音信息

在进行类的设计之后,需要初始化一些图片、语音等信息,比如你边框的图片,你小球的图片(游戏说白了,也就是一些图片在你电脑上移动,然后不停地刷新。这些图片都是要你自己实现存放好的。因此做游戏要个美工…)

#初始化pygame和混音器
    pygame.init()
    pygame.mixer.init()


    #设定小球图片
    one_ball = '1.png'
    two_ball = '2.png'
    three_ball = '3.png'
    four_ball = '4.png'
    five_ball = '5.png'
    six_ball = '6.png'
    seven_ball = '7.png'
    eight_ball = '8.png'
    nine_ball = '9.png'
    ten_ball = '10.png'
    eleven_ball = '11.png'
    #设定玻璃图片
    glass_image = 'ui.png'

    defeated_image = 'defeated.png'
    win_img = 'win.png'

    #设定游戏界面尺寸
    bg_size = width,height = 200,200
    screen = pygame.display.set_mode(bg_size)
    pygame.display.set_caption('移动篮球')
    #使游戏可以开始的标志running
    running = True

    glasses = []
    balls = []

这样,就可以实现整个游戏界面图片与声音的初始化了。定义两个列表用来存放球和边框,如上最后两行。
之后,要创建背景,显示背景,这样把你所设计的背景呈现出来。

#创建游戏背景
    for i in range(4):
        for p in range(4):
            position = p*50,i*50
            glass = Glass(glass_image,position,p,i,0)
            glasses.append(glass)

    #显示背景边框
    for each in glasses:
        screen.blit(each.glass_image,each.rect)

在背景被实例化显示之后,可以开始实例化显示小球了。

#创建小球
    for i in range(2):
        line = randint(0,3)
        column = randint(0,3)
        for each in balls:
            while line == each.line and column == each.column:
                line = randint(0,3)
                column = randint(0,3)
        position = glasses[line*4+column].rect.left,glasses[line*4+column].rect.top
        glasses[line*4+column].level=1
        ball = Ball(one_ball,position,line,column,1)
        balls.append(ball)
        glasses[line*4+column].possess = True

    #显示小球
    for each in balls:
        screen.blit(each.ball_image,each.rect)    

之后,就是循环对键盘的检测了。如果你按得是w,那么就往上。
下面我直接贴代码了。不要以为这一段很简单…很多bug,只有你自己设计过游戏你才会知道,根本不是你想的那么简单…

    while running:
        for each in glasses:
            if len(balls) == 16:
                pygame.time.delay(3000)
                lose = pygame.image.load('defeated.png').convert_alpha()
                screen.blit(lose,(width - lose.get_width()//2,height - lose.get_height()//2))
            if each.level == 11:
                pygame.time.delay(3000)
                win = pygame.image.load('win.png').convert.alpha()
                screen.blit(win,(width - win.get_width()//2,height - win.get_height()//2))
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
    


                #w键向上
                if event.key == K_w:
                    for each in balls:
                        #判断等级是否一样的标志rank
                        rank = False
                        screen.blit(glasses[0].glass_image,(each.rect.left,each.rect.top))
                        for i in range(each.line):
          
  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值