Python的学习心得和知识总结(十)|Python小游戏开发(2048-B站大佬版)
2023-09-14 09:15:35 时间
因为这段时间没有刷番了,就想着回B站看看。然后就莫名其妙的看了一位B站大佬的视频,主要是做的一个2048游戏的Python程序。
(看完之后,觉得人和人的差距怎么那么大!!!)
1、效果展示如下:
2、源代码如下:
#coding=utf-8
'''
Author :SongBaoBao
Project :my2048
FileName:2048_main.py
Currtime:2020/7/5--00:06
Commpany:Tsinghua University
MyCsdnIs:https://blog.csdn.net/weixin_43949535
MyLolLpl:Royal Never Give Up
'''
#
#
# 游戏的主模块
import pygame
import sys,os
import random
import itertools
def moveOperator(array,direction=0):
# 第一步:过滤0
# 第二步:反方向补0 总数要多于4个
# 第三步:正方向进行切片 截取4个
return ([0,0,0,0]+[number for number in array if number])[-4:] if direction else ([number for number in array if number]+[0,0,0,0])[:4]
def sumOperator(array,direction=0):
# 上面完成移动之后,相同数字移动到一起了。这个时候就需要去进行一个相加操作
if array[1] and array[2] and array[1]==array[2]:
return moveOperator([array[0],array[1]*2,0,array[3]],direction=direction)
if array[0] and array[1] and array[0]==array[1]:
array[0],array[1]=array[0]*2,0
if array[2] and array[3] and array[2]==array[3]:
array[2],array[3]=array[2]*2,0
return moveOperator(array,direction=direction)
#********************移动游戏界面的操作********************#
def upOperator(operationInterface):
for col in (0,1,2,3):
for row_index,result in enumerate(sumOperator(moveOperator([row[col] for row in operationInterface]))):
operationInterface[row_index][col]=result
return operationInterface
def downOperator(operationInterface):
for col in [0,1,2,3]:
for row_index,result in enumerate(sumOperator(moveOperator([row[col] for row in operationInterface],direction=1),direction=1)):
operationInterface[row_index][col]=result
return operationInterface
def rightOperator(operationInterface):
return [sumOperator(moveOperator(row,direction=1),direction=1) for row in operationInterface]
def leftOperator(operationInterface):
return [sumOperator(moveOperator(row,0),0) for row in operationInterface]
#********************移动游戏界面的操作********************#
class MyGameOf_2048:
"""
这个的实例就相当于一局游戏
"""
# 游戏的操作界面:我们这里选择一个高难度的 4*4
operationInterface=[]
# 游戏的控制键:w s a d 分别代表 上 下 左 右
controlKey=["w","s","a","d"]
# 随机取出来一个空格子,然后填充数字: 2 or 4
def random_fill(self):
# 这个随机数种子是个伪随机
number=random.choice([2,4,2,4,2,4,2,4,2,4,2,4])
# 下面是生成所有格子的下表索引 随机抽到一个空格
x,y=random.choice([(x,y) for x,y in itertools.product([0,1,2,3],[0,1,2,3]) if self.operationInterface[x][y]==0])
self.operationInterface[x][y]=number
# 打印整个游戏界面
def print_screen(self):
# 首先清空上一次打印
os.system("cls")
print("-" * 30)
for row in self.operationInterface:
print("|{}|".format("|".join([str(col or " ").center(4) for col in row])))
print("-" * 30)
# 游戏的算法设计:逻辑操作
def logicOperator(self,controlkey):
# 动作字典:根据用户输入的信息,进行调用相应的方向动作。
method={"w":upOperator,"s":downOperator,"a":leftOperator,"d":rightOperator}[controlkey]
# 进行一个深拷贝,调用方法进行处理
newOperationInterface=method([[col for col in row] for row in self.operationInterface])
if newOperationInterface !=self.operationInterface:
# 游戏界面已经发生变化:辞旧迎新
del self.operationInterface[:]
self.operationInterface.extend(newOperationInterface)
#****************************************************#
# 每一步走完,都需要判断一下是否成功:条件为达到4096
if [result for result in itertools.chain(*newOperationInterface) if result >=32]:
return 1,"Congratulation!"
self.random_fill()
else:
# 移动不了,然后去看一下是不是四个方向都移动不了.意思就是:往这四个方向都试一下,如果最后列表为空 说明走投无路了
if not [1 for g in [func(newOperationInterface) for func in [upOperator,downOperator,leftOperator,rightOperator]] if g !=self.operationInterface]:
return -1,"Game Over!"
return 0,"" #0表示继续向下;-1表示 Game Over;1表示 Congratulation
# 游戏的整个过程:实际上是一个循环,整个游戏的全部事件循环
def main_process(self):
"""
整个loop循环,游戏的自始至终的生命周期
"""
# 第一步:做一下初始化工作,初始化我们的游戏6*6界面
del self.operationInterface[:]
self.operationInterface.extend([
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0]
])
# 第二步:调用随机填充函数,填上初始数字(两次)
self.random_fill()
self.random_fill()
# 第三步:进入主事件的循环
while True:
# 首先要做的就是打印整个游戏屏幕
self.print_screen()
# 接收用户输入的方向控制信息
controlkey=input("请输入移动的方向(上下左右:w/s/a/d):")
if controlkey in self.controlKey:
status,showMessage=self.logicOperator(controlkey)
# 在得到一个当前游戏的信息之后,进行判断下一步操作(下面就是status非0的情况)
if status:
print(showMessage)
if "y"==input("兄弟,再来一局吗?[Y/N]").lower():
# 这个傻子要再来一局!
break
else:
# 这个傻子智商太低,被劝退了!
sys.exit(0)
# 她要再来一局,break就到这里了!
self.main_process()
#*****************************************************#
# 下面就来启动整个游戏实例:
if __name__=="__main__":
MyGameOf_2048().main_process()
注:这个代码实现的功能也就罢了,但是里面涉及到的Python语法的使用 简直到了让人佩服的地步,于是特此收藏 给我们初学Python的小伙伴们一起学习之用。
相关文章
- NCAR抛弃PyNCL后又一面向地球科学的Python项目
- python换行符使用_python中怎么换行?「建议收藏」
- Python获取时间戳_python爬虫时间戳
- pycharm打包python项目_Python怎么打包
- python移动app开发_神奇的Kivy,让Python快速开发移动app
- python编程是啥-Python编程「建议收藏」
- Python 升级之路( Lv12 ) Pygame游戏开发基础
- python及第三方库交叉编译
- python语言关键字是_Python 关键字
- Python解析和使用json
- 万能调试|Python Scrapy框架HTTP代理的配置与调试
- 从尾到头打印链表(python题解)
- Python 寒假实训 Day1
- 【开发环境】Mac 中 IntelliJ IDEA 运行 Python 程序 ( 安装 Python Community Edition 插件 )
- python获取mp3文件信息详解编程语言
- Python开发系列课程(2) – 语言元素详解编程语言
- python入门(八):连接mysql和STMP详解编程语言
- python全栈开发-Day12 三元表达式、函数递归、匿名函数详解编程语言
- Linux中运行Python文件的步骤(linux运行python文件)
- 在Linux上搭建Python开发环境(linux搭建python环境)
- 开发Linux下Python编程:实现自己的开发梦想(linux下python)
- Python字符串及基本操作(入门必看)
- Linux下使用Python开发体验之旅(linux使用python)
- Linux环境下Python开发的历程(linux与python)
- MySQL与Python的协同运行:一种全新的开发体验(mysql与python)
- Python中使用中文的方法