使用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):
if each.line != 0:
glasses[each.line*4+each.column].possess = False
if not glasses[(each.line-1)*4+each.column].possess: