发布于2019-08-21 14:32 阅读(1102) 评论(0) 点赞(14) 收藏(4)
这个游戏的设计,其实除了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):
if each.line != 0:
glasses[each.line*4+each.column].possess = False
if not glasses[(each.line-1)*4+each.column].possess:
each.line = each.line-1
each.rect.top = (each.line)*50
glasses[each.line*4+each.column].possess = True
glasses[each.line*4+each.column].level = each.level
else:
if glasses[each.line*4+each.column].level == glasses[(each.line-1)*4+each.column].level:
rank = True
glasses[(each.line-1)*4+each.column].level = glasses[(each.line-1)*4+each.column].level + 1
screen.blit(glasses[0].glass_image,(each.rect.left,each.rect.top))
if glasses[(each.line-1)*4+each.column].level == 1:
picture = one_ball
if glasses[(each.line-1)*4+each.column].level == 2:
picture = two_ball
if glasses[(each.line-1)*4+each.column].level == 3:
picture = three_ball
if glasses[(each.line-1)*4+each.column].level == 4:
picture = four_ball
if glasses[(each.line-1)*4+each.column].level == 5:
picture = five_ball
if glasses[(each.line-1)*4+each.column].level == 6:
picture = six_ball
if glasses[(each.line-1)*4+each.column].level == 7:
picture = seven_ball
if glasses[(each.line-1)*4+each.column].level == 8:
picture = eight_ball
if glasses[(each.line-1)*4+each.column].level == 9:
picture = nine_ball
if glasses[(each.line-1)*4+each.column].level == 10:
picture = ten_ball
if glasses[(each.line-1)*4+each.column].level == 11:
picture = eleven_ball
ball = Ball(picture,(glasses[(each.line-1)*4+each.column].rect.left,glasses[(each.line-1)*4+each.column].rect.top),each.line-1,each.column,glasses[(each.line-1)*4+each.column].level)
balls.append(ball)
balls.remove(each)
else:
glasses[each.line*4+each.column].possess = True
glasses[each.line*4+each.column].level = each.level
break
if not rank:
screen.blit(each.ball_image,(each.rect.left,each.rect.top))
if rank:
screen.blit(ball.ball_image,(ball.rect.left,ball.rect.top))
#先进行移动 移动之后再创建新球
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
ball = Ball(one_ball,position,line,column,1)
balls.append(ball)
glasses[line*4+column].possess = True
glasses[line*4+column].level = 1
screen.blit(ball.ball_image,(ball.rect.left,ball.rect.top))
#s键向下
if event.key == K_s:
for each in balls:
#判断等级是否一样的标志rank
rank = False
screen.blit(glasses[0].glass_image,(each.rect.left,each.rect.top))
if each.line != 3:
for i in range(3-each.line):
glasses[each.line*4+each.column].possess = False
if not glasses[(each.line+1)*4+each.column].possess:
each.line = each.line+1
each.rect.top = (each.line)*50
glasses[each.line*4+each.column].possess = True
glasses[each.line*4+each.column].level = each.level
else:
if glasses[each.line*4+each.column].level == glasses[(each.line+1)*4+each.column].level:
rank = True
glasses[(each.line+1)*4+each.column].level = glasses[(each.line+1)*4+each.column].level + 1
screen.blit(glasses[0].glass_image,(each.rect.left,each.rect.top))
if glasses[(each.line+1)*4+each.column].level == 1:
picture = one_ball
if glasses[(each.line+1)*4+each.column].level == 2:
picture = two_ball
if glasses[(each.line+1)*4+each.column].level == 3:
picture = three_ball
if glasses[(each.line+1)*4+each.column].level == 4:
picture = four_ball
if glasses[(each.line+1)*4+each.column].level == 5:
picture = five_ball
if glasses[(each.line+1)*4+each.column].level == 6:
picture = six_ball
if glasses[(each.line+1)*4+each.column].level == 7:
picture = seven_ball
if glasses[(each.line+1)*4+each.column].level == 8:
picture = eight_ball
if glasses[(each.line+1)*4+each.column].level == 9:
picture = nine_ball
if glasses[(each.line+1)*4+each.column].level == 10:
picture = ten_ball
if glasses[(each.line+1)*4+each.column].level == 11:
picture = eleven_ball
ball = Ball(picture,(glasses[(each.line+1)*4+each.column].rect.left,glasses[(each.line+1)*4+each.column].rect.top),each.line+1,each.column,glasses[(each.line-1)*4+each.column].level)
balls.append(ball)
balls.remove(each)
else:
glasses[each.line*4+each.column].possess = True
glasses[each.line*4+each.column].level = each.level
break
if not rank:
screen.blit(each.ball_image,(each.rect.left,each.rect.top))
if rank:
screen.blit(ball.ball_image,(ball.rect.left,ball.rect.top))
elif each.line == 3:
pass
#先进行移动 移动之后再创建新球
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
ball = Ball(one_ball,position,line,column,1)
balls.append(ball)
glasses[line*4+column].possess = True
glasses[line*4+column].level = 1
screen.blit(ball.ball_image,(ball.rect.left,ball.rect.top))
#a键向左
if event.key == K_a:
for each in balls:
#判断等级是否一样的标志rank
rank = False
screen.blit(glasses[0].glass_image,(each.rect.left,each.rect.top))
for i in range(each.column):
if each.column != 0:
glasses[each.line*4+each.column].possess = False
if not glasses[each.line*4+each.column-1].possess:
each.column = each.column-1
each.rect.left = (each.column)*50
glasses[each.line*4+each.column].possess = True
glasses[each.line*4+each.column].level = each.level
else:
if glasses[each.line*4+each.column].level == glasses[each.line*4+each.column-1].level:
rank = True
glasses[each.line*4+each.column-1].level = glasses[each.line*4+each.column-1].level + 1
screen.blit(glasses[0].glass_image,(each.rect.left,each.rect.top))
if glasses[each.line*4+each.column-1].level == 1:
picture = one_ball
if glasses[each.line*4+each.column-1].level == 2:
picture = two_ball
if glasses[each.line*4+each.column-1].level == 3:
picture = three_ball
if glasses[each.line*4+each.column-1].level == 4:
picture = four_ball
if glasses[each.line*4+each.column-1].level == 5:
picture = five_ball
if glasses[each.line*4+each.column-1].level == 6:
picture = six_ball
if glasses[each.line*4+each.column-1].level == 7:
picture = seven_ball
if glasses[each.line*4+each.column-1].level == 8:
picture = eight_ball
if glasses[each.line*4+each.column-1].level == 9:
picture = nine_ball
if glasses[each.line*4+each.column-1].level == 10:
picture = ten_ball
if glasses[each.line*4+each.column-1].level == 11:
picture = eleven_ball
ball = Ball(picture,(glasses[each.line*4+each.column-1].rect.left,glasses[each.line*4+each.column-1].rect.top),each.line,each.column-1,glasses[each.line*4+each.column-1].level)
balls.append(ball)
balls.remove(each)
else:
glasses[each.line*4+each.column].possess = True
glasses[each.line*4+each.column].level = each.level
break
if not rank:
screen.blit(each.ball_image,(each.rect.left,each.rect.top))
if rank:
screen.blit(ball.ball_image,(ball.rect.left,ball.rect.top))
#先进行移动 移动之后再创建新球
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
ball = Ball(one_ball,position,line,column,1)
balls.append(ball)
glasses[line*4+column].possess = True
glasses[line*4+column].level = 1
screen.blit(ball.ball_image,(ball.rect.left,ball.rect.top))
#d键向右
if event.key == K_d:
for each in balls:
#判断等级是否一样的标志rank
rank = False
screen.blit(glasses[0].glass_image,(each.rect.left,each.rect.top))
if each.column != 3:
for i in range(3-each.column):
glasses[each.line*4+each.column].possess = False
if not glasses[each.line*4+each.column+1].possess:
each.column = each.column+1
each.rect.left = (each.column)*50
glasses[each.line*4+each.column].possess = True
glasses[each.line*4+each.column].level = each.level
else:
if glasses[each.line*4+each.column].level == glasses[each.line*4+each.column+1].level:
rank = True
glasses[each.line*4+each.column+1].level = glasses[each.line*4+each.column+1].level + 1
screen.blit(glasses[0].glass_image,(each.rect.left,each.rect.top))
if glasses[each.line*4+each.column+1].level == 1:
picture = one_ball
if glasses[each.line*4+each.column+1].level == 2:
picture = two_ball
if glasses[each.line*4+each.column+1].level == 3:
picture = three_ball
if glasses[each.line*4+each.column+1].level == 4:
picture = four_ball
if glasses[each.line*4+each.column+1].level == 5:
picture = five_ball
if glasses[each.line*4+each.column+1].level == 6:
picture = six_ball
if glasses[each.line*4+each.column+1].level == 7:
picture = seven_ball
if glasses[each.line*4+each.column+1].level == 8:
picture = eight_ball
if glasses[each.line*4+each.column+1].level == 9:
picture = nine_ball
if glasses[each.line*4+each.column+1].level == 10:
picture = ten_ball
if glasses[each.line*4+each.column+1].level == 11:
picture = eleven_ball
ball = Ball(picture,(glasses[each.line*4+each.column+1].rect.left,glasses[each.line*4+each.column+1].rect.top),each.line,each.column+1,glasses[each.line*4+each.column+1].level)
balls.append(ball)
balls.remove(each)
else:
glasses[each.line*4+each.column].possess = True
glasses[each.line*4+each.column].level = each.level
break
if not rank:
screen.blit(each.ball_image,(each.rect.left,each.rect.top))
if rank:
screen.blit(ball.ball_image,(ball.rect.left,ball.rect.top))
elif each.line == 3:
pass
#先进行移动 移动之后再创建新球
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
ball = Ball(one_ball,position,line,column,1)
balls.append(ball)
glasses[line*4+column].possess = True
glasses[line*4+column].level = 1
screen.blit(ball.ball_image,(ball.rect.left,ball.rect.top))
其主要思想就是,比如你按了w键,那么就首先让所有小球的位置往上移动,需要先检测所有小球的上面有没有球,如果有球,那么就移动到最近的上面那颗球那里。而且需要做的是,先判断上面球和下面球的等级是不是一样,如果一样可以合并,不一样的话就只能同时向上移动。合并之后新的位置是上面球的位置。
需要做的是,先判断好位置之后,再消除原来小球的图片信息,再把小球创建到最新的位置,再刷新界面。步骤不能错,错了之后你会发现你的界面不受你控制了。
在移动之后,你又要新建一个小球实例,这个实例用来充当每回合新增的那一个球。所以你又要在合并之后,让合并之后位置所对应的背景边框属性变成possess=True,这样在创建新球,在未被占有的边框上创建新球。也就是我后面写的,先进行移动,移动之后再创建新球。
之后,刷新界面。
pygame.display.flip()
让所有信息从内存搬移到你的界面上。
之后,执行主程序:
#执行主程序
if __name__ == "__main__":
try:
main()
except SystemExit:
pass
except:
traceback.print_exc()
pygame.quit()
input()
作者:坚持才能胜利
链接:https://www.pythonheidong.com/blog/article/50494/bbd8b0b7e447e82509f4/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!