200行python代码实现2048游戏
作者:PastoralDog 发布时间:2023-02-28 16:07:21
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
本人水平有限,欢迎大家提出问题与建议。
来源:https://blog.csdn.net/qq_39739850/article/details/82904177


猜你喜欢
- 饼图概念饼图(pie chart)是用圆形及圆内扇形的角度来表示数值大小的图形,它主要用于表示一个样本(或总体)中各组成部分的数据占全部数据
- 本文实例为大家分享了Vue实现简单跑马灯特效的具体代码,供大家参考,具体内容如下效果:点击按钮让文字动起来,点击停止按钮让文字停止知识点:s
- 1. 调度器scheduler的作用我们都知道,在Go语言中,程序运行的最小单元是gorouines。然而程序的运行最终都是要交给操作系统来
- 在家无聊,线代和高数看不懂,整点事情干,就准备预定回学校的高铁票,于是就有了这个文章准备工作1.pip安装chromediver,当然也可以
- 1、什么是全局变量?在Python中,全局变量指的是可以作用于函数内部和外部的变量。在这里有两种情况:在函数的外部定义和内部定义添加glob
- 在 Python/Django 的世界里有这样一个谚语:为语言而来,为社区而留。对绝大多数人来说的确是这样的,但是,还有一件事情使得我们一直
- 可以使用 Python 的 NumPy 和 OpenCV 库来实现这个任务。提前准备一张图片作为素材。什么是峰值信噪比峰值信噪比(Peak
- 一、框架架构二、项目目录结构三、框架功能说明解决痛点:通过session会话方式,解决了登录之后cookie关联处理框架天然支持接口动态传参
- 免责声明:本教程所有资源均来源于网络;仅用于学习交流,请勿用于任何商业行为;如需要,请使用正版授权;侵权联删。idea官方推送了2020.2
- python语句mode = ‘test’ if y is None else &lsquo
- 我就废话不多说了,直接上代码吧!import subprocessdef excuteCommand(com): ex = subproce
- 本文实例为大家分享了python实现大量图片重命名的具体代码,供大家参考,具体内容如下说明在进行深度学习的过程中,需要对图片进行批量的命名处
- 本文实例讲述了Python3模拟登录操作。分享给大家供大家参考,具体如下:模拟登录_要求:1. 用户输入账号密码进行登录2. 用户信息保存在
- 如果值没有重复的情况,可以先用array_flip()来交换键和值,然后krsort(),最后再array_flip()交换回来,就可以比较
- 以前在工作中遇到一个问题,当表单发送的数据量很大时,就会报错。查阅MSDN了解到,原因是微软对用Request.Form()可接收的最大数据
- Python最基本的数据结构是序列(列表/元组)。一个序列中的每个元素都分配有一个数字- 它的位置或索引。第一个索引是0,第二个
- 一.docx模块Python可以利用python-docx模块处理word文档,处理方式是面向对象的。也就是说python-docx模块会把
- 前言:大家都知道,只要进行数据交互,肯定就要去请求接口,数据请求的方式有vue-resource axios fetch
- ??本文核心:setup()概念、 reactive()的使用【前言】vue3作为vue2的升级版,有着很多的新特性,其中就包括了组合式AP
- 一,mnist数据集形如上图的数字手写体就是mnist数据集。二,GAN原理(生成对抗网络)GAN网络一共由两部分组成:一个是伪造器(Gen