一款用Python编写的2048游戏,这或许就是程序员的乐趣吧。只需在游戏过程中组合尽可能多的数字块即可。”大致了解了游戏规则后,我们就可以开始写这个游戏了~首先进行游戏初始化操作,玩一个自己喜欢的游戏背景音乐:#游戏初始化pygame.init()screen=pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('2048——宇宇大胆')#播放背景音乐pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.play(-1,30)接下来我们定义一个2048游戏类,主要负责实现2048的各种游戏规则:'''2048game'''classGame2048(object):def__init__(self,matrix_size=(4,4),max_score_filepath=None,**kwargs):#matrix_size:(num_rows,num_cols)self.matrix_size=matrix_size#游戏最高分保存路径self.max_score_filepath=max_score_filepath#初始化self.initialize()具体来说,我们先用一个二维列表保存当前游戏状态:self.game_matrix=[['null'for_inrange(self.matrix_size[1])]for_inrange(self.matrix_size[0])]w这里的null表示当前块中没有数字。否则,相应的位置由当前数字表示。显然,2048小游戏当前的游戏状态可以用一个4*4的列表来表示:在游戏开始的时候,我们需要在这个二维列表中随机选择两个位置来生成数字(即2或4):'''在新位置随机生成一个数'''defrandomGenerateNumber(self):empty_pos=[]foriinrange(self.matrix_size[0]):forjinrange(self.matrix_size[1]):如果self.game_matrix[i][j]=='null':empty_pos.append([i,j])i,j=random.choice(empty_pos)self.game_matrix[i][j]=2如果random.random()>0.1else4self.randomGenerateNumber()self.randomGenerateNumber()那么当玩家按下方向键(↑↓←→)时,二维列表要根据玩家的操作指令进行更新,主要是分为两部分:移动所有数字块并进行必要的合并和评分;在还没有数字的位置随机生成一个数字。具体代码实现如下:'''更新游戏状态'''defupdate(self):game_matrix_before=copy.deepcopy(self.game_matrix)self.move()ifgame_matrix_before!=self.game_matrix:self.randomGenerateNumber()其中,移动所有数字并进行必要合并的代码如下:'''按指定方向移动所有数字块'''defmove(self):#提取非空数字defextract(array):array_new=[]foriteminarray:ifitem!='null':array_new.append(item)returnarray_new#mergenon-nullnumbersdefmerge(array):score=0iflen(array)<2:返回数组,在range(len(array)-1):ifarray[i]=='null':breakifarray[i]==array[i+1]:array[i]*=2中得分array.pop(i+1)array.append('null')score+=array[i]returnextract(array),score#如果不需要移动,如果self.move_direction为None则直接返回:return#Upifself.move_direction=='up':forjinrange(self.matrix_size[1]):col=[]foriinrange(self.matrix_size[0]):col.append(self.game_matrix[i][j])col=extract(col)col.reverse()col,score=merge(col)self.score+=scorecol.reverse()col=col+['null',]*(self.matrix_size[0]-len(col))复制代码foriinrange(self.matrix_size[0]):self.game_matrix[i][j]=col[i]#向下elifself.move_direction=='down':forjinrange(self.matrix_size[1]):col=[]foriinrange(self.matrix_size[0]):col.append(self.game_matrix[i][j])col=extract(col)col,score=merge(col)自我。分数+=分数col=['null',]*(self.matrix_size[0]-len(col))+colforiinrange(self.matrix_size[0]):self.game_matrix[i][j]=col[i]#向左elifself.move_direction=='left':foridx,rowinenumerate(copy.deepcopy(self.game_matrix)):row=extract(row)row.reverse()row,score=merge(row)self.score+=scorerow.reverse()row=row+['null',]*(self.matrix_size[1]-len(row))self.game_matrix[idx]=row#elifself.move_direction=='right':对于idx,rowinenumerate(copy.deepcopy(self.game_matrix)):row=extract(row)row,score=merge(row)self.score+=scorerow=['null',]*(self.matrix_size[1]-len(row))+rowself.game_matrix[idx]=rowself.move_direction=None懒得动脑子了(脑子有4*大4反正T_T),所以直接遍历这个二维链表就可以实现我们想要的所有操作最后再写一个函数,根据当前游戏状态判断游戏是否结束:'''游戏结束了吗'''@propertydefisgameover(self):foriinrange(self.matrix_size[0]):forjinrange(self.matrix_size[1]):ifself.game_matrix[i][j]=='null':returnFalseif(i==self.matrix_size[0]-1)and(j==self.matrix_size[1]-1):continueelif(i==self.matrix_size[0]-1):if(self.game_matrix[i][j]==self.game_matrix[i][j+1]):returnFalseelif(j==self.matrix_size[1]-1):if(self.game_matrix[i][j]==self.game_matrix[i+1][j]):returnFalseelse:如果(self.game_matrix[i][j]==self.game_matrix[i+1][j])或(self.game_matrix[i][j]==self.game_matrix[i][j+1]):returnFalse返回True其实很简单。如果二维列表中填满了数字,并且数字不能再合并,则游戏结束,否则,游戏没有结束。定义好2048游戏类别后,我们的游戏就基本完成了。你只需要在主游戏循环中根据用户的操作更新当前游戏状态,并在屏幕上显示游戏中所有必要的元素:#Gamemainloopclock=pygame.time.Clock()is_running=Truewhileis_running:screen.fill(pygame.Color(cfg.BG_COLOR))#--keydetectionforeventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit()elifevent.type==pygame.KEYDOWN:如果event.key在[pygame.K_UP,pygame.K_DOWN,pygame.K_LEFT,pygame.K_RIGHT]:game_2048.setDirection({pygame.K_UP:'up',pygame.K_DOWN:'down',pygame.K_LEFT:'left',pygame.K_RIGHT:'right'}[event.key])#--更新游戏状态game_2048.update()ifgame_2048.isgameover:game_2048.saveMaxScore()is_running=False#--绘制必要的游戏元素到屏幕drawGameMatrix(screen,game_2048.game_matrix,cfg)start_x,start_y=drawScore(screen,game_2048.score,game_2048.max_score,cfg)drawGameIntro(screen,start_x,start_y,cfg)#--屏幕更新pygame.display.update()clock.tick(cfg.FPS)returnendInterface(screen,cfg)最后的效果大概是这样的:写这个程序还行,但是玩这个网游我还是菜鸟。嘿~
