当前位置: 首页 > news >正文

用Pyhon写一款简单的益智类小游戏——2048

文字版——代码及讲解

代码——

import random# 初始化游戏棋盘
def init_board():return [[0] * 4 for _ in range(4)]# 在棋盘上随机生成一个2或4
def add_new_tile(board):empty_cells = [(i, j) for i in range(4) for j in range(4) if board[i][j] == 0]if empty_cells:i, j = random.choice(empty_cells)board[i][j] = 2 if random.random() < 0.9 else 4return board# 打印棋盘
def print_board(board):for row in board:for cell in row:print(str(cell).rjust(4), end="")print()# 向左移动
def move_left(board):new_board = [row[:] for row in board]for row in new_board:while 0 in row:row.remove(0)for i in range(len(row) - 1):if i + 1< len(row) and row[i] == row[i + 1]:row[i] *= 2row.pop(i + 1)while len(row) < 4:row.append(0)return new_board# 向右移动
def move_right(board):new_board = [row[::-1] for row in board]new_board = move_left(new_board)return [row[::-1] for row in new_board]# 向上移动
def move_up(board):new_board = list(map(list, zip(*board)))new_board = move_left(new_board)return list(map(list, zip(*new_board)))# 向下移动
def move_down(board):new_board = list(map(list, zip(*board)))new_board = move_right(new_board)return list(map(list, zip(*new_board)))# 检查是否还有可移动的位置
def is_game_over(board):for move in [move_left, move_right, move_up, move_down]:if move(board)!= board:return Falsereturn Truedef main():board = init_board()add_new_tile(board)add_new_tile(board)while not is_game_over(board):print_board(board)move = input("Enter a move (w: up, s: down, a: left, d: right): ")if move == "w":new_board = move_up(board)elif move == "s":new_board = move_down(board)elif move == "a":new_board = move_left(board)elif move == "d":new_board = move_right(board)else:print("Invalid move")continueif new_board!= board:board = new_boardadd_new_tile(board)print("Game Over!")if __name__ == "__main__":main()

讲解:

 1.初始化游戏棋盘

def init_board():
    return [[0] * 4 for _ in range(4)]

解释:这个函数用于创建一个 4x4 的二维列表,初始值都为 0,代表空的游戏棋盘

2.在棋盘上随机生成一个2或4

def add_new_tile(board):
    empty_cells = [(i, j) for i in range(4) for j in range(4) if board[i][j] == 0]
    if empty_cells:
        i, j = random.choice(empty_cells)
        board[i][j] = 2 if random.random() < 0.9 else 4
    return board

解释:

首先找到棋盘上所有空的单元格(值为 0)

从空单元格中随机选择一个

在选中的单元格中,90% 的概率生成 2,10% 的概率生成 4

3.打印棋盘

def print_board(board):
    for row in board:
        for cell in row:
            print(str(cell).rjust(4), end="")
        print()

解释:

这个函数用于以美观的方式打印出游戏棋盘

对每一行和每一个单元格进行格式化处理,使其对齐显示

4. 向左移动

def move_left(board):
    new_board = [row[:] for row in board]
    for row in new_board:
        while 0 in row:
            row.remove(0)
        for i in range(len(row) - 1):
            if i + 1< len(row) and row[i] == row[i + 1]:
                row[i] *= 2
                row.pop(i + 1)
        while len(row) < 4:
            row.append(0)
    return new_board

解释:

首先复制当前棋盘

对于每一行,移除所有的 0 元素,然后合并相同的数字,最后在末尾添加 0 元素使每行长度为 4

5.向右移动

def move_right(board):
    new_board = [row[::-1] for row in board]
    new_board = move_left(new_board)
    return [row[::-1] for row in new_board]

解释:

先将每行反转

调用 move_left 函数进行移动操作

再将每行反转回来得到向右移动后的结果

6.向上移动

def move_up(board):
    new_board = list(map(list, zip(*board)))
    new_board = move_left(new_board)
    return list(map(list, zip(*new_board)))

解释:

先对棋盘进行转置(行列互换)

调用 move_left 函数

再转置回来得到向上移动后的结果

7.向下移动

def move_down(board):
    new_board = list(map(list, zip(*board)))
    new_board = move_right(new_board)
    return list(map(list, zip(*new_board)))

解释:

先对棋盘进行转置

调用 move_right 函数

再转置回来得到向下移动后的结果

8.检查是否还有可移动的位置

def is_game_over(board):
    for move in [move_left, move_right, move_up, move_down]:
        if move(board)!= board:
            return False
    return True

解释:

尝试所有的移动操作(左、右、上、下)

如果有任何一种移动操作得到的新棋盘与当前棋盘不同,说明游戏还可以继续,返回 False;否则返回 True,表示游戏结束

9.游戏循环

def main():
    board = init_board()
    add_new_tile(board)
    add_new_tile(board)
    while not is_game_over(board):
        print_board(board)
        move = input("Enter a move (w: up, s: down, a: left, d: right): ")
        if move == "w":
            new_board = move_up(board)
        elif move == "s":
            new_board = move_down(board)
        elif move == "a":
            new_board = move_left(board)
        elif move == "d":
            new_board = move_right(board)
        else:
            print("Invalid move")
            continue
        if new_board!= board:
            board = new_board
            add_new_tile(board)
    print("Game Over!")

解释:

初始化棋盘并添加两个初始数字

进入游戏循环,在循环中:

打印当前棋盘

获取用户输入的移动方向

根据输入执行相应的移动操作

如果移动操作有效,更新棋盘并添加新的数字

当游戏结束时,打印 "Game Over!"

PPT版

相关文章:

用Pyhon写一款简单的益智类小游戏——2048

文字版——代码及讲解 代码—— import random# 初始化游戏棋盘 def init_board():return [[0] * 4 for _ in range(4)]# 在棋盘上随机生成一个2或4 def add_new_tile(board):empty_cells [(i, j) for i in range(4) for j in range(4) if board[i][j] 0]if empty_cells:i,…...

akshare股票涨跌幅自定义范围查询:A股、港股、美股

参看&#xff1a;https://stock.hexun.com/2024-10-31/215251914.html 涨幅计算公式&#xff1a;&#xff08;当前价格 - 上一个交易日收盘价&#xff09; 上一个交易日收盘价 100% 。 跌幅计算公式&#xff1a;&#xff08;上一个交易日收盘价 - 当前价格&#xff09; 上一个…...

通过js控制修改css变量

在JavaScript中&#xff0c;你可以通过操作CSS变量&#xff08;也称为自定义属性&#xff09;来动态改变样式。CSS变量在CSS中使用 – 前缀定义&#xff0c;例如 --main-color: red;。在JavaScript中&#xff0c;你可以使用 document.documentElement.style.setProperty 方法来…...

<HarmonyOS第一课>HarmonyOS SDK开放能力简介的课后习题

不出户&#xff0c;知天下&#xff1b; 不窥牖&#xff0c;见天道。 其出弥远&#xff0c;其知弥少。 是以圣人不行而知&#xff0c;不见而明&#xff0c;不为而成。 本篇<HarmonyOS第一课>HarmonyOS SDK开放能力简介是简单介绍了HarmonyOS SDK&#xff0c;不需要大家过多…...

深度学习:yolo的使用--图像处理

定义了一个名为 ListDataset 的类&#xff0c;它继承自 PyTorch 的 Dataset 类,这个数据集从一个包含图像文件路径的列表中读取图像和对应的标签文件 class ListDataset(Dataset):def __init__(self, list_path, img_size416, augmentTrue, multiscaleTrue, normalized_labelsT…...

TypeScript实用笔记(一):初始化、类型定义与函数使用

文章目录 一、ts初始化1. 初始化.json文件一2. 启动方式2.1 直接运行.ts文件2.2 转换运行 二、类型1. 参数类型1.1 常规参数1.2 symbol1.3 数组\[]1.4 元组\[]1.5 用字面量定义数据类型 2. Object3. 枚举类型\[Enum]3.1 数字枚举3.2 字符串枚举 三、 类型别名1. 数组别名使用2.…...

【大数据学习 | kafka】producer之拦截器,序列化器与分区器

1. 自定义拦截器 interceptor是拦截器&#xff0c;可以拦截到发送到kafka中的数据进行二次处理&#xff0c;它是producer组成部分的第一个组件。 public static class MyInterceptor implements ProducerInterceptor<String,String>{Overridepublic ProducerRecord<…...

零基础学西班牙语,柯桥专业小语种培训泓畅学校

No te comas el coco, seguro que te ha salido bien la entrevista. Ya te llamarn. 别瞎想了&#xff01;我保证你的面试很顺利。他们会给你打电话的。 这里的椰子是"头"的比喻。在西班牙的口语中&#xff0c;我们也可以听到其他同义表达&#xff0c;比如&#x…...

C++学习:类和对象(三)

一、深入讲解构造函数 1. 什么是构造函数&#xff1f; 构造函数&#xff08;Constructor&#xff09;是在创建对象时自动调用的特殊成员函数&#xff0c;用于初始化对象的成员变量。构造函数的名称与类名相同&#xff0c;没有返回类型 2. 构造函数的类型 &#xff08;1&…...

高阶数据结构--图(graph)

图&#xff08;graph&#xff09; 1.并查集1. 并查集原理2. 并查集实现3. 并查集应用 2.图的基本概念3. 图的存储结构3.1 邻接矩阵3.2 邻接矩阵的代码实现3.3 邻接表3.4 邻接表的代码实现 4. 图的遍历4.1 图的广度优先遍历4.2 广度优先遍历的代码 1.并查集 1. 并查集原理 在一…...

xxl-job java.sql.SQLException: interrupt问题排查

近期生产环境固定凌晨报错&#xff0c;提示 ConnectionManager [Thread-23069] getWriteConnection db:***,pattern: error, jdbcUrl: jdbc:mysql://***:3306/***?connectTimeout3000&socketTimeout180000&autoReconnecttrue&zeroDateTimeBehaviorCONVERT_TO_NUL…...

jmeter压测工具环境搭建(Linux、Mac)

目录 java环境安装 1、anaconda安装java环境&#xff08;推荐&#xff09; 2、直接在本地环境安装java环境 yum方式安装jdk 二进制方式安装jdk jmeter环境安装 1、jmeter单机安装 启动jmeter 配置环境变量 jmeter配置中文 2、jmeter集群搭建 多台机器部署jmeter集群…...

docker设置加速

sudo tee /etc/docker/daemon.json <<-‘EOF’ { “registry-mirrors”: [ “https://register.liberx.info”, “https://dockerpull.com”, “https://docker.anyhub.us.kg”, “https://dockerhub.jobcher.com”, “https://dockerhub.icu”, “https://docker.awsl95…...

使用requestAnimationFrame写防抖和节流

debounce.ts 防抖工具函数: function Animate() {this.timer null; }Animate.prototype.start function (fn) {if (!fn) {throw new Error(需要执行函数);}if (this.timer) {this.stop();}this.timer requestAnimationFrame(fn); }Animate.prototype.stop function () {i…...

Puppeteer 与浏览器版本兼容性:自动化测试的最佳实践

Puppeteer 支持的浏览器版本映射&#xff1a;从 v20.0.0 到 v23.6.0 自 Puppeteer v20.0.0 起&#xff0c;这个强大的自动化库开始支持与 Chrome 浏览器的无头模式和有头模式共享相同代码路径&#xff0c;为自动化测试带来了更多便利。从 v23.0.0 开始&#xff0c;Puppeteer 进…...

Java方法重写

在Java中&#xff0c;方法重写是指在子类中重新定义父类中已经定义的方法。以下是Java方法重写的基本原则&#xff1a; 子类中的重写方法必须具有相同的方法签名&#xff08;即相同的方法名、参数类型和返回类型&#xff09;。子类中的重写方法不能比父类中的原方法具有更低的…...

vscode通过.vscode/launch.json 内置php服务启动thinkphp 应用后无法加载路由解决方法

我们在使用vscode的 .vscode/launch.json Launch built-in server and debug 启动thinkphp应用后默认是未加载thinkphp的路由文件的&#xff0c; 这个就导致了&#xff0c;某些thinkphp的一些url路由无法访问的情况&#xff0c; 如http://0.0.0.0:8000/api/auth.admin/info这…...

Webserver(2.6)有名管道

目录 有名管道有名管道使用有名管道的注意事项读写特性有名管道实现简单版聊天功能拓展&#xff1a;如何解决聊天过程的阻塞 有名管道 可以用在没有关系的进程之间&#xff0c;进行通信 有名管道使用 通过命令创建有名管道 mkfifo 名字 通过函数创建有名管道 int mkfifo …...

四足机器人实战篇之一:波士顿spot机器人工程实现分析

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、机器人发展历史二、硬件系统及电机执行器篇硬件系统电机执行器传感器机处理器电气连接三、感知(视觉点云、局部地图、定位)篇1.深度相机获取…...

TensorFlow 预训练目标检测模型集合

Tensorflow 提供了一系列在不同数据集上预训练的目标检测模型&#xff0c;包括 COCO 数据集、Kitti 数据集、Open Images 数据集、AVA v2.1 数据集、iNaturalist 物种检测数据集 和 Snapshot Serengeti 数据集。这些模型可以直接用于推理&#xff0c;特别是当你对这些数据集中已…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...

Cursor AI 账号纯净度维护与高效注册指南

Cursor AI 账号纯净度维护与高效注册指南&#xff1a;解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后&#xff0c;许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...

第2课 SiC MOSFET与 Si IGBT 静态特性对比

2.1 输出特性对比 2.2 转移特性对比 2.1 输出特性对比 器件的输出特性描述了当温度和栅源电压(栅射电压)为某一具体数值时,漏极电流(集电极电流...