Python实现简单的2048小游戏
本文实例为大家分享了Python实现简单的2048小游戏的具体代码,供大家参考,具体内容如下
运行效果:
1.项目结构
2.代码
configs.py
importargparse
defparse_args():
parser=argparse.ArgumentParser(description='Game2048')
#Form
"""
screen_width:Widthoftheform
screen_height:Heightoftheform
"""
parser.add_argument('--screen_width',default=400)
parser.add_argument('--screen_height',default=500)
#Block
"""
block_gap:Gapbetweentwoblocks
block_size:Sizeofablock
block_arc:Arcofablock
"""
parser.add_argument('--block_gap',default=10)
parser.add_argument('--block_size',default=86)
parser.add_argument('--block_arc',default=10)
returnparser.parse_args()
main.py
importconfigs fromGame2048importGame2048 defmain(args): """ screen_width:Widthoftheform screen_height:Heightoftheform block_gap:Gapbetweentwoblocks block_size:Sizeofablock """ screen_width=args.screen_width screen_height=args.screen_height block_gap=args.block_gap block_size=args.block_size block_arc=args.block_arc game=Game2048(screen_width,screen_height,block_gap,block_size,block_arc) game.Form() if__name__=='__main__': args=configs.parse_args() main(args)
Game2048.py
importos
importsys
importnumpy
importrandom
importpygame
"""
Form():窗口的设置
Action():用户行为:按键/鼠标
InitGame():游戏初始化
CreatNum():随机在一个位置生成一个数
GetEmpty():获取空白方格
MoveUp():向上移动
MoveDown():向下移动
MoveLeft():向左移动
MoveRight():向右移动
JudgeGameOver():判断游戏是否结束
JudgeGameSuccess():判断游戏是否成功
Paint():绘制表格
"""
classGame2048(object):
#初始化函数
def__init__(self,screen_width,screen_height,block_gap,block_size,block_arc):
"""
:paramscreen_width:Widthoftheform
:paramscreen_height:Heightoftheform
:paramblock_gap:Gapbetweentwoblocks
:paramblock_size:Sizeofablock
:paramsize:Dimensionofmatrix
:parammartix:Zeromatrix
:paramis_over:Signoftheendofthegame
:paramis_success:Signofthesuccessofthegame
:paramform:Theform
:paramscore:score
:paramtitle_font:Titletypeandsizeofform
:paramscore_font:Scorestypeandsize
:paramtips_font:Tipstypeandtype
:paramfont:Thenumberes
:paramisadd:Addnumberornot
"""
"""窗口"""
self.screen_width=screen_width#窗口的宽400
self.screen_height=screen_height#窗口的高500
self.block_gap=block_gap#方块间隙10
self.block_size=block_size#方块大小86
self.block_arc=block_arc#方块的弧度
self.size=4#矩阵4*4
self.martix=[]#初始化矩阵4*4的0矩阵
self.form=''
"""其他"""
self.is_over=False#游戏是否结束
self.is_success=False#游戏是否成功
self.score=0#分数
self.isadd=True#是否添加数字
self.block_color={#方块颜色
0:(205,193,180),
2:(238,228,218),
4:(237,224,200),
8:(242,177,121),
16:(245,149,99),
32:(246,124,95),
64:(246,94,59),
128:(237,207,114),
256:(237,204,97),
512:(237,200,80),
1024:(237,197,63),
2048:(237,194,46)
}
self.nums_color={
#0:(0,0,0),
0:(205,193,180),
2:(0,0,0),
4:(0,0,0),
8:(255,255,255),
16:(255,255,255),
32:(255,255,255),
64:(255,255,255),
128:(255,255,255),
256:(255,255,255),
512:(255,255,255),
1024:(255,255,255),
2048:(255,255,255)
}
"""字体"""
self.title_font=''#窗口标题字体类型及大小:2048
self.score_font=''#分数字体类型及大小
self.tips_font=''#说明字体类型及大小
self.font=''#数字字体
#窗口的设置
defForm(self):
"""
init():初始化所有导入的pygame模块
display.set_caption(title):设置窗口的标题
display.set_mode():初始化一个准备显示的窗口或屏幕
display.update():使绘制的显示到窗口上
"""
pygame.init()#初始化所有导入的pygame模块
pygame.display.set_caption("Game2048")#窗口标题
os.environ['SDL_VIDEO_CENTERED']='1'#窗口居中显示
self.form=pygame.display.set_mode([self.screen_width,self.screen_height],0,0)#窗口大小
self.InitGame()#矩阵的初始化
whileTrue:
self.Action()#用户行为:按键/鼠标
self.Paint()#表格绘制
pygame.display.update()#使绘制的显示到窗口上
#用户行为:按键/鼠标
defAction(self):
foreventinpygame.event.get():#pygame.event.get():获取所有消息并将其从队列中删除
ifevent.type==pygame.QUIT:#pygame.QUIT:窗口右上角的红×
sys.exit()#sys.exit()函数是通过抛出异常的方式来终止进程的
elifevent.type==pygame.KEYDOWN:
"""
pygame.KEYDOWN按下键盘时
pygame.KEYUP释放键盘时
"""
"""
K_ESCAPE:ESC
K_UP:↑
K_DOWN:↓
K_LEFT:←
K_RIGHT:→
"""
"""重新开始游戏"""
ifevent.key==pygame.K_ESCAPE:
#print('ESC')
self.InitGame()#游戏初始化
"""↑"""
ifevent.key==pygame.K_UPandself.is_over==False:
#print('UP')
self.MoveUp()
#self.CreatNum()
"""↓"""
ifevent.key==pygame.K_DOWNandself.is_over==False:
#print('DOWN')
self.MoveDown()
#self.CreatNum()
"""←"""
ifevent.key==pygame.K_LEFTandself.is_over==False:
#print('LEFT')
self.MoveLeft()
#self.CreatNum()
"""→"""
ifevent.key==pygame.K_RIGHTandself.is_over==False:
#print('RIGHT')
self.MoveRight()
#self.CreatNum()
#游戏初始化
defInitGame(self):
self.score=0
self.is_over=False
self.is_success=False
self.martix=numpy.zeros([self.size,self.size])
#随机生成两个数
foriinrange(2):
self.isadd=True
self.CreatNum()
#随机在一个位置生成一个数
defCreatNum(self):
list=self.GetEmpty()#获取空白方格下标
iflistandself.isadd:
"""随机生成的数字"""
#2,4出现概率3:1
#random.randint(m,n):随机生成[m,n]
value=4ifrandom.randint(0,3)%3==0else2
"""获取随机位置下标"""
x,y=random.sample(list,1)[0]
"""在随机位置上生成随机数字"""
self.martix[x][y]=value
self.isadd=False
#print('CreatNum:{}'.format(value),(x,y))
#print(self.martix)
#获取空白方格
defGetEmpty(self):
list=[]
foriinrange(4):
forjinrange(4):
ifself.martix[i][j]==0:
list.append([i,j])
returnlist
#向上移动
defMoveUp(self):
#print('up')
"""MoveUp"""
"""
向上移动,只需考虑第二行到第四行
共分为两种情况:
1、当前数字上边无空格,即上边值不为0
a.当前数字与上边数字相等,合并
b.当前数字与上边数字不相等,continue
2、当前数字上边有空格,即上边值为0,上移
"""
forjinrange(4):
index=0
foriinrange(1,4):
ifself.martix[i][j]>0:
ifself.martix[i][j]==self.martix[index][j]:
#当前数字==上边数字
"""分数:当前数字+上边数字
数值:上边数字=上边数字+当前数字,当前数字=0"""
self.score+=self.martix[i][j]+self.martix[index][j]
self.martix[index][j]=self.martix[i][j]+self.martix[index][j]
self.martix[i][j]=0
index+=1
self.isadd=True
#当前数字与上边数字不相等,continue可以省略不写
elifself.martix[index][j]==0:
#当前数字上边有0
"""分数:不变
数值:上边数字=当前数字,当前数字=0"""
self.martix[index][j]=self.martix[i][j]
self.martix[i][j]=0
self.isadd=True
else:
index+=1
ifself.martix[index][j]==0:
#index相当于慢指针,j相当于快指针
#也就是说快指针和慢指针中间可能存在一个以上的空格,或者index和j并未相邻
#上边数字=0
"""分数:不变
数值:上边数字=当前数字,当前数字=0"""
self.martix[index][j]=self.martix[i][j]
self.martix[i][j]=0
self.isadd=True
#print('up')
#print(self.martix)
#向下移动
defMoveDown(self):
#print('down')
"""MoveDown"""
"""
向下移动,只需考虑第一列到第三列
共分为两种情况:
1、当前数字下边无空格,即下边值不为0
a.当前数字与下边数字相等,合并
b.当前数字与下边数字不相等,continue
2、当前数字下边有空格,即下边值为0,下移
"""
forjinrange(4):
index=3
foriinrange(2,-1,-1):
ifself.martix[i][j]>0:
ifself.martix[i][j]==self.martix[index][j]:
#当前数字==下边数字
"""分数:当前数字+下边数字
数值:下边数字=下边数字+当前数字,当前数字=0"""
self.score+=self.martix[i][j]+self.martix[index][j]
self.martix[index][j]=self.martix[i][j]+self.martix[index][j]
self.martix[i][j]=0
index-=1
self.isadd=True
#当前数字与下边数字不相等,continue可以省略不写
elifself.martix[index][j]==0:
#当前数字下边有0
"""分数:不变
数值:下边数字=当前数字,当前数字=0"""
self.martix[index][j]=self.martix[i][j]
self.martix[i][j]=0
self.isadd=True
else:
index-=1
ifself.martix[index][j]==0:
#index相当于慢指针,j相当于快指针
#也就是说快指针和慢指针中间可能存在一个以上的空格,或者index和j并未相邻
#下边数字=0
"""分数:不变
数值:下边数字=当前数字,当前数字=0"""
self.martix[index][j]=self.martix[i][j]
self.martix[i][j]=0
self.isadd=True
#print('down')
#print(self.martix)
#向左移动
defMoveLeft(self):
#print('left')
"""
MoveLeft
"""
"""
向左移动,只需考虑第二列到第四列
共分为两种情况:
1、当前数字左边无空格,即左边值不为0
a.当前数字与左边数字相等,合并
b.当前数字与左边数字不相等,continue
2、当前数字左边有空格,即左边值为0,左移
"""
foriinrange(4):
index=0
forjinrange(1,4):
ifself.martix[i][j]>0:
ifself.martix[i][j]==self.martix[i][index]:
#当前数字==左边数字
"""分数:当前数字+左边数字
数值:左边数字=左边数字+当前数字,当前数字=0"""
self.score+=self.martix[i][j]==self.martix[i][index]
self.martix[i][index]=self.martix[i][j]+self.martix[i][index]
self.martix[i][j]=0
index+=1
self.isadd=True
#当前数字与左边数字不相等,continue可以省略不写
elifself.martix[i][index]==0:
#当前数字左边有0
"""分数:不变
数值:左边数字=当前数字,当前数字=0"""
self.martix[i][index]=self.martix[i][j]
self.martix[i][j]=0
self.isadd=True
else:
index+=1
ifself.martix[i][index]==0:
#index相当于慢指针,j相当于快指针
#也就是说快指针和慢指针中间可能存在一个以上的空格,或者index和j并未相邻
#左边数字=0
"""分数:不变
数值:左边数字=当前数字,当前数字=0"""
self.martix[i][index]=self.martix[i][j]
self.martix[i][j]=0
self.isadd=True
#print('left')
#print(self.martix)
#向右移动
defMoveRight(self):
#print('right')
"""
MoveRight
"""
"""
向右移动,只需考虑第一列到第三列
共分为两种情况:
1、当前数字右边无空格,即右边值不为0
a.当前数字与右边数字相等,合并
b.当前数字与右边数字不相等,continue
2、当前数字右边有空格,即右边值为0,右移
"""
foriinrange(4):
index=3
forjinrange(2,-1,-1):
ifself.martix[i][j]>0:
ifself.martix[i][j]==self.martix[i][index]:
#当前数字==右边数字
"""分数:当前数字+右边数字
数值:右边数字=右边数字+当前数字,当前数字=0"""
self.score+=self.martix[i][j]+self.martix[i][index]
self.martix[i][index]=self.martix[i][j]+self.martix[i][index]
self.martix[i][j]=0
index-=1
self.isadd=True
#当前数字与左边数字不相等,continue可以省略不写
elifself.martix[i][index]==0:
#当前数字右边有0
"""分数:不变
数值:右边数字=当前数字,当前数字=0"""
self.martix[i][index]=self.martix[i][j]
self.martix[i][j]=0
self.isadd=True
else:
index-=1
ifself.martix[i][index]==0:
#index相当于慢指针,j相当于快指针
#也就是说快指针和慢指针中间可能存在一个以上的空格,或者index和j并未相邻
#右边数字=0
"""分数:不变
数值:右边数字=当前数字,当前数字=0"""
self.martix[i][index]=self.martix[i][j]
self.martix[i][j]=0
self.isadd=True
#print('right')
#print(self.martix)
#判断游戏是否结束
defJudgeGameOver(self):
#当空白空格不为空时,即游戏未结束
zerolist=self.GetEmpty()
ifzerolist:
returnFalse
#当空白方格为空时,判断是否存在可合并的方格
foriinrange(3):
forjinrange(3):
ifself.martix[i][j]==self.martix[i][j+1]:
returnFalse
ifself.martix[i][j]==self.martix[i+1][j]:
returnFalse
#若不满足以上两种情况,则游戏结束
returnTrue
#判断游戏是否成功
defJudgeGameSuccess(self):
#检查是否有2048
ifself.martix.max()==2048:
returnTrue
returnFalse
#绘制表格
defPaint(self):
"""游戏背景"""
#fill(color):填充某一种颜色
self.form.fill((220,220,220))
"""字体设置"""
#初始化字体
pygame.font.init()
#添加标题
#f=pygame.font.get_fonts()#:获取字体样式
#pygame.font.Font.render():在一个新Surface对象上绘制文本
self.title_font=pygame.font.SysFont('幼圆',50,True)
title_text=self.title_font.render('2048',True,(0,0,0))
self.form.blit(title_text,(50,10))
#添加分数:得分:0
pygame.draw.rect(self.form,(128,128,128),(250,0,120,60))
self.score_font=pygame.font.SysFont('幼圆',28,True)
score_text=self.score_font.render('得分',True,(0,0,0))
self.form.blit(score_text,(275,0))
digtial_score=self.score_font.render(str(int(self.score)),True,(255,250,250))
self.form.blit(digtial_score,(280,30))
#添加游戏说明
self.tips_font=pygame.font.SysFont('simsunnsimsun',20)
tips_text=self.tips_font.render('操作:↑↓←→,按esc键重新开始',True,(0,0,0))
self.form.blit(tips_text,(25,70))
"""绘制方格"""
foriinrange(4):
forjinrange(4):
#(x,y)方块的初始位置
x=j*self.block_size+(j+1)*self.block_gap
y=i*self.block_size+(i+1)*self.block_gap
#绘制方块
value=int(self.martix[i][j])
#print(value)
pygame.draw.rect(self.form,self.block_color[value],(x+5,y+100,self.block_size,self.block_size),
border_radius=self.block_arc)
#数字字体即大小
ifvalue<10:
self.font=pygame.font.SysFont('simsunnsimsun',46,True)#数字2、4、8
value_text=self.font.render(str(value),True,self.nums_color[value])
self.form.blit(value_text,(x+35,y+120))
elifvalue<100:
self.font=pygame.font.SysFont('simsunnsimsun',40,True)#数字16,32,64
value_text=self.font.render(str(value),True,self.nums_color[value])
self.form.blit(value_text,(x+25,y+120))
elifvalue<1000:
self.font=pygame.font.SysFont('simsunnsimsun',34,True)#数字128,256,512
value_text=self.font.render(str(value),True,self.nums_color[value])
self.form.blit(value_text,(x+15,y+120))
else:
self.font=pygame.font.SysFont('simsunnsimsun',28,True)#数字1024,2048
value_text=self.font.render(str(value),True,self.nums_color[value])
self.form.blit(value_text,(x+5,y+120))
#新增数字
self.CreatNum()
"""如果游戏结束"""
self.is_over=self.JudgeGameOver()
ifself.is_over:
over_font=pygame.font.SysFont("simsunnsimsun",60,True)
str_text=over_font.render('GameOver!',True,(255,255,255))
self.form.blit(str_text,(30,220))
"""如果游戏成功"""
self.is_success=self.JudgeGameSuccess()
ifself.is_success:
success_font=pygame.font.SysFont("simsunnsimsun",60,True)
str_text=success_font.render('Successful!',True,(178,34,34))
self.form.blit(str_text,(10,220))
注意这里需要导入两个包(numpy,pygame),然后运行main文件即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。