Python实战系列用于记录实战项目中的思路,代码实现,出现的问题与解决方案以及可行的改进方向
本文为第2篇–200行Python代码实现2048
一、分析与函数设计
1.1 游戏玩法
2048这款游戏的玩法很简单,每次可以选择上下左右滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。(介绍来自百度百科)
1.2 函数设计
- _init _() 初始化4*4游戏地图,分数等游戏基本数据
- is_gameover() 判断是否结束游戏
- rannumber() 玩家每次移动时在地图上随机生成2、4
- show() 在控制台打印出4*4游戏地图
- print_score() 在控制台打印出当前分数
- up(), upmove() 上移
- down(), downmove() 下移
- left(), leftmove() 左移
- right(), rightmove() 右移
- nextstep() 读取玩家按键
二、代码实现
注:IDE为Spyder,Python版本为3.6
# -*- coding: utf-8 -*- """ Created on Sat Sep 29 16:29:04 2018 @author: PastoralDog """ import random class game2048(object): def __init__(self): self.score=0 self.number=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] self.move=0 seed=random.randint(0,15) line=int(seed/4) row=seed%4 self.number[line][row]=2 def is_gameover(self): numbersum=0 for i in range(4): for j in range(4): if (self.number[i][j]!=0): numbersum+=1 if(numbersum!=16): return False for i in range(4): for j in range(3): if(self.number[i][j+1]==self.number[i][j]): return False for i in range(3): for j in range(4): if(self.number[i+1][j]==self.number[i][j]): return False print("游戏结束") print("您的得分为:"+str(self.score)) self.__init__() return True def rannumber(self): rannumber=random.randint(1,10) if(rannumber<=8): rannumber=2 else: rannumber=4 done=0 count=0 for i in range(4): for j in range(4): if(self.number[i][j]==0): count+=1 while(done==0 and count!=0): ranplace=random.randint(0,15) line=int(ranplace/4) row=ranplace%4 if(self.number[line][row]==0): done=1 self.number[line][row]=rannumber def show(self): print(self.number[0]) print(self.number[1]) print(self.number[2]) print(self.number[3]) def print_score(self): print("得分:"+str(self.score)) def upmove(self): for i in range(1,4): for j in range(4): temp=i while(temp>=1 and self.number[temp-1][j]==0): box=self.number[temp-1][j] self.number[temp-1][j]=self.number[temp][j] self.number[temp][j]=box if(self.number[temp][j]!=0):self.move=1 temp-=1 def up(self): self.upmove() for i in range(1,4): for j in range(4): if(self.number[i-1][j]==self.number[i][j]): if(self.number[i-1][j]!=2048): self.score+=self.number[i][j] self.number[i][j]=0 self.number[i-1][j]=2*self.number[i-1][j] self.upmove() if(self.move!=0):self.rannumber() self.move=0 self.show() self.is_gameover() self.print_score() def downmove(self): for i in range(2,-1,-1): for j in range(4): temp=i while(temp<=2 and self.number[temp+1][j]==0 ): box=self.number[temp+1][j] self.number[temp+1][j]=self.number[temp][j] self.number[temp][j]=box if(self.number[temp+1][j]!=0):self.move=1 temp+=1 def down(self): self.downmove() for i in range(2,-1,-1): for j in range(4): if(self.number[i+1][j]==self.number[i][j]): if(self.number[i+1][j]!=2048): self.score+=self.number[i][j] self.number[i][j]=0 self.number[i+1][j]=2*self.number[i+1][j] self.downmove() if(self.move!=0):self.rannumber() self.move=0 self.show() self.is_gameover() self.print_score() def leftmove(self): for i in range(4): for j in range(1,4): temp=j while(temp>=1 and self.number[i][temp-1]==0 ): box=self.number[i][temp-1] self.number[i][temp-1]=self.number[i][temp] self.number[i][temp]=box if(self.number[i][temp-1]!=0):self.move=1 temp-=1 def left(self): self.leftmove() for i in range(4): for j in range(0,3): if(self.number[i][j+1]==self.number[i][j]): if(self.number[i][j+1]!=2048): self.score+=self.number[i][j] self.number[i][j+1]=0 self.number[i][j]=2*self.number[i][j] self.leftmove() if(self.move!=0):self.rannumber() self.move=0 self.show() self.is_gameover() self.print_score() def rightmove(self): for i in range(4): for j in range(2,-1,-1): temp=j while(temp<=2 and self.number[i][temp+1]==0 ): box=self.number[i][temp+1] self.number[i][temp+1]=self.number[i][temp] self.number[i][temp]=box self.move=1 temp+=1 def right(self): self.rightmove() for i in range(4): for j in range(2,-1,-1): if(self.number[i][j+1]==self.number[i][j]): if(self.number[i][j+1]!=2048): self.score+=self.number[i][j] self.number[i][j]=0 self.number[i][j+1]=2*self.number[i][j+1] self.rightmove() if(self.move!=0):self.rannumber() self.move=0 self.show() self.is_gameover() self.print_score() def nextstep(self,step): if(step=='w'): self.up() elif(step=='s'): self.down() elif(step=='a'): self.left() elif(step=='d'): self.right() else: pass if __name__ == '__main__': game=game2048() game.show() while(True): step=input() if(step=='b'):break game.nextstep(step)
三、问题与解决方案
1.地图的储存与表示:目前没有界面设计,因此就用二维数组直接储存与表示
2.数组越界:调试代码中遇到过五六次,除了牢记要边缘检测外, and 语句左右条件顺序也要有讲究。
例:while(temp<=2 and self.number[temp+1][j]==0 ) 注:self.number为4*4的二维数组
当temp=3时,语句在temp<=2 被阻塞,不会执行self.number[temp+1][j]==0,此时没有问题;
若语句改为while(self.number[temp+1][j]==0 and temp<=2), 先执行self.number[temp+1][j]==0,此时编译器报错数组越界
四、可行的改进方向
1.添加可视化界面,可考虑Tkinter,QT等
2.拓展游戏地图大小为N x N
本人水平有限,欢迎大家提出问题与建议。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】