Python 利用列表就可以实现新2048游戏(代码可以直接运行)
2020-04-21 23:21
756 查看
2048是一款经典的游戏,但矩阵中图形的不断变化造成其实现有一定难度。
新2048采用类似纸牌的方式,每一列随着牌数增加而不断向下延伸,遇到相同值则向上消去,这可以用列表来实现。
规则:
一. 假设共有5列位置可以放牌,玩家每次需要处理一张新牌,可以看到接下来三张牌。开始时,五列都为空。
玩家需要将新牌放在任意一列的最下一张牌的下面,当新置牌其与原最下一张牌相等时:
1.两张牌消失 2.二者的值相加,产生新的牌值 3.若其与原倒数第二张一致,继续步骤1.2。
二. 新牌每次的出现为{2,4,8,16,32,64,bomb}之任意一张,bomb概率低于其他牌。
三. 每消去一次,获得得分;每造成一个2048,获得额外得分并清空该列所有牌;每得到一个bomb,该列所有牌自动消失。
四. 当所有列都达到最大长度,玩家判负。当所有牌值都已发出玩家仍有空间正常进牌,玩家判胜。
实现示例
如图,在第3列(行)加入16,16+16=32,32+32=64,64+64=128,最终只剩128.
游戏体验
0.下载 新2048游戏体验
1.将new2048.py复制到site-package文件夹
2.打开python命令行
import new2048 demo = new2048.New2048() demo.run()
默认牌的总数量100,可以更改
demo = New2048(card_num=100)
代码实现
# -*- coding: utf-8 -*- #2048是一款经典的游戏,但矩阵中图形的不断变化造成其实现有一定难度。 #新2048采用类似纸牌的方式,每一列随着牌数增加而不断向下延伸,这可以用列表来实现。 #假设共有5列位置可以放牌,随着新出的牌到达,需要将其放在任意一列的最下一张牌的下面,当新置牌其与原最下一张牌相等时: #1.两张牌消失 2.二者的值相加,产生新的牌值 3.若其与原倒数第二张一致,继续步骤1.2 #新牌每次的出现为【2,4,8,16,32,64,bomb之任意一张】,每消去一次,获得得分 import numpy as np #random.seed(2019) class New2048(): def __init__(self,card_num=100,max_len=7): c1,c2,c3,c4,c5=[],[],[],[],[]#5列牌 self.player_dict = {'1':c1,'2':c2,'3':c3,'4':c4,'5':c5} self.score = 0 #统计得分 self.card = [2,4,8,16,32,64,'bomb']#炸弹清空该列 self.max_len = max_len #每列最大容纳长度 self.card_num = card_num #新牌数量 #随机初始化新牌,设置不同概率(从哪抽,抽多少张,从哪里抽的概率)#但数字会变成字符串 self.new = np.random.choice(self.card,self.card_num,p=[0.15,0.15,0.15,0.15,0.15,0.15,0.1]) self.new = [i if i=='bomb' else int(i) for i in self.new] #将除了bomb的字符串改成数字 # print(self.new) def player_dict_show(self):#显示当前玩家牌分布 print('player_cards'.center(20,'-')) for key in sorted(self.player_dict.keys(),reverse=False): print(self.player_dict[key]) print(''.center(20,'-')) #每次显示三张新牌(从左到右) def visual(self,i): if (i+2)<self.card_num: visual = [self.new[i],self.new[i+1],self.new[i+2]] elif i+2==self.card_num: visual = [self.new[i],self.new[i+1]] else: visual = [self.new[i]] reverse = visual[::-1] #list翻转数组 reverse = [str(i) for i in reverse] #转str print('接下来的牌:'+'->'.join(reverse)) print('当前牌',self.new[i]) #玩家选择新牌的放置位置 def choice_loc(self,i): change = 0 p_loc = input('放置位置(1-5)/按r退出:') #判断新牌放置位置是否合法 while p_loc not in self.player_dict.keys() and p_loc!='r': print('放置位置不合法--请重新选择放置位置') p_loc = input('放置位置(1-5)/按r退出::') if p_loc=='r': return False #判断是否所有列都满了 all_list = list(self.player_dict.values())#每一列的情况 if [len(x) for x in all_list]==[self.max_len]*5: print('所有列已满,您输了!') return False #判断新牌放置列是否已满 tmplist = self.player_dict[p_loc] while len(tmplist)==self.max_len: print('第'+str(p_loc)+'列已经满了--请重新选择放置位置') p_loc = input('放置位置:') tmplist = self.player_dict[p_loc] #给定列增加新牌 tmplist.append(self.new[i]) #显示当前牌分布 self.player_dict_show() #判断新置牌是否为bomb if tmplist[-1]=='bomb': tmplist[:] = [] change=1 #判断新置牌其与原最下一张牌是否相等 if len(tmplist)>=2: while(tmplist[-1]==tmplist[-2]):#.两张牌消失 二者的值相加,产生新的牌值 change=1 tmplist[-2]<<=1 tmplist.pop() self.score+=1 if len(tmplist)==1: break #判断是否存在2048,如果存在,清空该列 if 2048 in tmplist: change=1 tmplist[:] = []#注意:用tmplist=[]不能清空player_dict的内存 self.score+=10 #显示本轮当前牌最终分布 if change==1: self.player_dict_show() return True def run(self): flag = 1 print('每列最大容纳长度:',self.max_len) self.player_dict_show() for i in range(self.card_num): if flag: self.visual(i) flag = self.choice_loc(i) else: print('游戏结束!') break print('游戏结束!') self.show_score() def show_score(self): print('您的分数:',self.score) def main(): demo = New2048() demo.run() if __name__=="__main__": main()
4月初游戏停服的时候无聊在手机上找了个单机游戏玩,这款新2048将方块转变为几列数字,实现相同数字的消除,激发了博主的兴趣,本文的代码就是根据这个游戏(武汉市多比特信息科技有限公司)给博主带来的思路写出来的,在此感谢。
- 点赞 4
- 收藏
- 分享
- 文章举报
相关文章推荐
- 利用PHP安装windows自动运行的服务,PHP程序可以实现长时间、自动运行、定时更新功能,直接可以用在项目中的类源代码
- 利用PHP安装windows自动运行的服务,PHP程序可以实现长时间、自动运行、定时更新功能,直接可以用在项目中的类源代码...
- 在notepad++中实现直接运行python代码
- 用python实现多目标差分进化算法(MODE)完整代码,自己写的,简单易懂,可以直接跑
- 转换器5:参考Python源码,实现Php代码转Ast并直接运行
- 一段代码可以让Python直接在Linux/Mac/Unix上运行
- SharePoint 2013 中开发可以被标记为未读和已读的列表之代码实现篇
- 用java实现验证码的生成,以下代码是一个controller,可以直接使用!
- Android 利用反射实现不安装直接运行APK(动态加载)
- 利用Python分析GP服务运行结果的输出路径 & 实现服务输出路径的本地化 分类: Python ArcGIS for desktop ArcGIS for server 2015-08-06 19:49 3人阅读 评论(0) 收藏
- 利用Python实现Windows下的鼠标键盘模拟的实例代码
- 【实现】[抓取知网论文标题摘要] 终于能用Sublime直接编译运行python了,可是却无法导入bs4 | BeautifulSoup
- Python中利用列表推导式实现矩阵置换时发现的"问题"
- 在notepad++中直接运行python代码
- python 的列表遍历删除实现代码
- Ajax与Python服务器交互,在网页实现简单的Python3代码的运行
- android studio环境下代码混淆(混淆完了直接打包就可以运行)
- python中利用time模块,计算一段代码运行的时间。
- Python 1行代码实现文本分类(实战笔记),含代码详细说明及运行结果
- windows sdk编程系列文章 ---- 利用APC实现向一个运行中的进程注入自己的代码