python游戏代码五子棋_用20行Python代码实现2048小游戏,你会吗?
前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣。心想着,我貌似也能用Python来整一波,话不多说,直接开搞。
2048的游戏规则:
2048游戏总共有16个格子,初始时会有两个格子上安放了两个数字2,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格子范围中凑出“2048”这个数字方块这里还要注意:如果你刚学python,记住:项目实战永远是核心,如果你没有python入门到高级实战视频教程,可以关注我,后台私信我 ‘py’ 自动获取最新python教程资料!还有老司机解答哦!
咱们可以从游戏规则里面一步一步来:
第一步:
2048游戏共有16个格子,初始时会有两个格子上安放了两个数字2
这一步比较简单,我们可以建立一个二维数组,然后随机在上面放上两个数字2
用代码就可以这么写:
list1=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
def map1(map_list):
count=0
while(count<2):
a=r.randint(0,3)
b=r.randint(0,3)
if map_list[a][b]==0:
map_list[a][b]=2
count+=1
第二步:
每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,相同数字的方块在靠拢、相撞时会相加。
这一步就是这个游戏里,比较复杂的地方了。这里涉及到两种运算,我称之为,去0运算和合并运算
去0运算:
我们先从最简单的2—0开始写:
开始是这样:
我们要假设要进行上滑操作,使其变成这样:
这里我们可以看到在(2,1)的地方的2,上滑到了(1,1),那么我们来写代码:
def qu0(dire,list1):#去0运算,w,a,s,d分别表示各个方向
if (dire=="w" or dire=="W"):
#h表示行,s表示列
for s in range(4):
for h in [3,2,1]:
elif(list1[h-1][s]==0):
list1[h-1][s]=list1[h][s]
list1[h][s]=0
if (dire=="s" or dire=="S"):
for s in range(4):
for h in [0,1,2]:
elif(list1[h+1][s]==0):
list1[h+1][s]=list1[h][s]
list1[h][s]=0
if (dire=="a" or dire=="A"):
for h in range(4):
for s in [3,2,1]:
elif(list1[h][s-1]==0):
list1[h][s-1]=list1[h][s]
list1[h][s]=0
if (dire=="d"or dire=="D"):
for h in range(4):
for s in [0,1,2]:
elif(list1[h][s+1]==0):
list1[h][s+1]=list1[h][s]
list1[h][s]=0
这里我们通过看自己格子的前一个格子里的数字是否为0,如果是,那么我们就把这个格子里的数字移动到前一个格子里。
合并运算:
相同数字的方块在靠拢、相撞时会相加
(示意图就不给画了,你们应该都能想象,orz )
先上代码
def heB(dire,list1):
if (dire=="w" or dire=="W"):
for s in range(4):
for h in [3,2,1]:
elif(list1[h][s]==list1[h-1][s] ): #合并运算
list1[h-1][s]=list1[h-1][s]*2
list1[h][s]=0
if (dire=="s" or dire=="S"):
for s in range(4):
for h in [0,1,2]:
elif(list1[h][s]==list1[h+1][s] ):
list1[h+1][s]=list1[h+1][s]*2
list1[h][s]=0
if (dire=="a" or dire=="A"):
for h in range(4):
for s in [3,2,1]:
elif(list1[h][s]==list1[h][s-1]):
list1[h][s-1]=list1[h][s-1]*2
list1[h][s]=0
if (dire=="d"or dire=="D"):
for h in range(4):
for s in [0,1,2]:
elif(list1[h][s]==list1[h][s+1]):
list1[h][s+1]=list1[h][s+1]*2
list1[h][s]=0
这里我们仍然还是看格子的前一个数字,如果格子里的前一个数字跟格子里的数字相同,那么就要把原来的格子里的数字变为0,格子里的前一个数字翻倍(相加)。
了解完2048的这两种运算,我们就要开始研究判定顺序了,研究判定顺序需要拿出一个极端的例子比如下面这个:
我们使这个这个二维数组往上相加,它经历的过程如下:
第一步:
第二步:
第三步:
由上可见,即使是最极端的例子也只进行了2次合并运算,所以我们可以得出结论,在2048进行运算时的顺序是 去0运算——合并运算——去0运算——合并运算
所以我们可以写出下面的代码:
def move(dire,list1): # h表示行 s表示列
qu0(dire,list1)
heB(dire,list1)
qu0(dire,list1)
heB(dire,list1)
那么,最繁琐的移动过程就这么结束喽(鼓掌,啪啪啪),接下来就是产生随机数了
第三步:
系统会在空白的地方随即出现一个数字方块,系统给予的数字方块不是2就是4
这玩意儿挺简单的,我们可以让系统随机生成一个坐标地址,然后我们再检验这个坐标地址内的数字是否为0。如果为0,就随机填一个2或4进去,如果不为0,那咱们就再随机生成一个坐标地址,然后接着检验,直到这个坐标内的数字为0
代码如下:
def mainmap(map_list):
count = 0
while (count < 1):
a = r.randint(0, 3)
b = r.randint(0, 3)
if map_list[a][b] == 0:
c = r.choice([2, 4])
map_list[a][b] = c
count += 1
写到这,一个基本的框架就差不多完成了,接下来就是判定游戏胜负的时候了
第四步:
玩家在这小小的16格范围中凑出“2048”这个数字方块,就能判定为游戏的胜利。如果这个16格的范围内,已经没有空间(0)可以移动了,那么游戏就判定为失败。
这其实我们只需要遍历每个表格中的数字,如果有一个数字为2048,就判定胜利,所有表格中,没有一个表格里的数字为0,就判定失败。
代码如下:
def panding(list1):
panding = 0
count = 0
for i in list1:
for b in i:
if (b == 2048):
panding = 1
if (b == 0):
count = 1
if (panding == 1):
print("恭喜您,挑战成功")
input()
break
if (count == 0):
print("真遗憾,挑战失败")
input()
break
到这边,2048的游戏已经可以正常的玩耍了,但是浪漫的人不能满足于此, 我们来给表格添上一个好看 的框框
def kuangkuang(list1):
print("+----+----+----+----+")
for i in list1:
a=i[0]
b=i[1]
c=i[2]
d=i[3]
print("| | | | |")
print("| {0} | {1} | {2} | {3} |".format(a,b,c,d))
print("+----+----+----+----+")
终于,我们终于把它给攻占完了(撒花)
最后让我们把它们拼接在一起吧
def main():
print("哇呼,你发现了一个2048,要不要进行游戏")
input()
print("1.好的 2.没问题 3.棒极了")
input()
print("请使用wasd进行操作,w为往上滑,s为往下滑,a为往左滑,d为往右滑")
input()
print("那么,游戏开始喽。")
map1(list1)
while True:
dire = input("请输入方向:")
if dire == "abc":
break
move(dire, list1)
mainmap(list1)
kuangkuang(list1)
panding(list1)
main()
最后注意:如果你刚学python,记住:项目实战永远是核心,如果你没有python入门到高级实战视频教程,可以关注我,后台私信我 ‘py’ 自动获取最新python教程资料!还有老司机解答哦!
本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
python游戏代码五子棋_用20行Python代码实现2048小游戏,你会吗?相关推荐
- python秒表游戏代码_用20行Python代码实现2048小游戏,你会吗?
前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...
- 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法
下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法-1.jpg (143.81 KB, ...
- python自动生成鸡汤文_用20行Python代码生成鸡汤,打造AI咪蒙指日可待。
作者:Ramtin Alami "Don't think of the overwhelming majority of the impossible." "不要去想不可 ...
- python 车牌识别简单_简单30行Python代码让你玩转YOLO目标识别检测!
YOLO是一种实时目标检测算法,与faster R-CNN不同的是,YOLO不是过多的注重物体定位的精度,而是着重于速度和物体种类的识别.在实际应用中,实时性是目标检测中非常重要的,例如对于一辆自动驾 ...
- python大赛对名_用100行Python爬虫代码抓取公开的足球数据玩(一)
在<用Python模拟2018世界杯夺冠之路>一文中,我选择从公开的足球网站用爬虫抓取数据,从而建模并模拟比赛,但是略过了爬虫的实施细节.虽然爬虫并不难做,但希望可以让更多感兴趣的朋友自己 ...
- python循环10次_开发一个循环 5 次计算的小游戏, 设置随机种子为10,每次随机产生两个 1~10的数字以及随机选择...
开发一个循环 5 次计算的小游戏, 设置随机种子为10,每次随机产生两个 1~10的数字以及随机选择 "+.-.*"运算符,构成一个表达式, 让用户计算式子结果并输入结果,如果计算 ...
- java游戏重新开始_问题1:java问题--某局小游戏结束后怎么重新开始?
有个问题,想了好久没解决,上网找了下,貌似也没找到好的解决方法(谷歌暂时没上去),现在这里写下来吧: 最近在写一个五子棋的小游戏,也算是刚刚开始java入门的一个作品了吧,刚刚完成到人人对战(当然,还 ...
- 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏
本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...
- 简单20行python代码_用 20 行 python 代码实现人脸识别!Python实现就是这么简单!...
今天给大家介绍一个世界上最简洁的人脸识别库 face_recognition,你可以使用 Python 和命令行工具进行提取.识别.操作人脸. 基于业内领先的 C++ 开源库 dlib 中的深度学习模 ...
最新文章
- Windows系统下的 vbs病毒生成器使用方法!
- Java多线程面试题
- Text-CNN-文本分类-keras
- 软件测试mysql基础面试题_测试面试题合集之数据库
- ES5-拓展 箭头函数的this、this的优先级
- numpy 数组抽取_清晰易懂的Numpy入门教程
- 将应用程序集成为Heroku附加组件
- 毕业工具大全:开题、答辩、格式排版等stata、spss等多种统计软件、绘图软件(附送教学视频)超200G资料
- 第2章 关系数据库练习题
- c语言 公交卡一卡通系统,公共交通一卡通系统
- 利用Python绘制三维的规则体(3维柱体、立方体和旋转棱柱)
- 数据库查询-分数排名
- mysql 1032错误_如何快速解决MySQL 1032 主从错误
- autohold有什么弊端吗_autohold一直开着伤车吗
- STM32 串口 FIFO
- 陕汽汉德、一汽集团信息化调研报告
- 无线网卡的4种工作模式
- 预警| WebLogic Server再曝高危0 day漏洞
- 【更新】python写的sogou代理全网加速器,特别适合于教育网(稍改动)
- c# 未能加载文件或程序集mysql.data,SQLite的C#,.NET应用自适应32位/64位系统(未能加载文件或程序集“System.Data.SQLite.dll)...