XTU-OJ 1239-2048

使用JavaScript实现网页版2048小游戏(附源码) 详细介绍如何使用HTML、CSS和JavaScript实现一个完整的网页版2048小游戏。 阅读详情
AI摘要

文章讲述了如何根据2048游戏规则,根据输入的4x4矩阵和滑动指令,模拟并计算出新的游戏局面。介绍了两种主要操作步骤:合并相同数字并更新,以及根据指令移动非零数字。

题目描述

2048是大家非常喜欢的一款小游戏,给定一个2048的局面,和下一步的指令,请计算出变化后的局面。 2048的游戏规则如下:

  • 游戏是一个4×4的格子
  • 玩家可以使用上、下、左、右控制数字方格滑动,
  • 每滑动一次,所有的数字方块都会往滑动的方向靠拢,相同数字的方块在靠拢、相撞时会相加。
  • 不断的叠加最终拼凑出2048这个数字就算成功
  • 每次滑动后,会在某个空白格子中出现随机的2或者4,如果不存在空白格子,则游戏结束。

输入

第一行是一个整数K,表示样例的个数。 每个样例的前4行,每行4个整数,如果整数为0表示空白格子,其他为数字。 每个样例的第5行,是指令,指令为"LEFT","DOWN","RIGHT","UP",依次表示滑动的方向。

输出

输出每个样例的结果,每个样例后输出一个空行。

样例输入

3
2 2 0 0
2 0 2 0
2 0 0 2
0 0 2 2
LEFT
2 0 2 0
2 2 2 2
0 2 0 2
4 2 2 0
LEFT
2 4 2 2
0 2 2 0
0 4 4 4
0 0 0 2
LEFT

样例输出

4 0 0 0
4 0 0 0
4 0 0 0
4 0 0 0

4 0 0 0
4 4 0 0
4 0 0 0
4 4 0 0

2 4 4 0
4 0 0 0
8 4 0 0
2 0 0 0

解题思路:这题又是一道大模拟,2048应该都玩过,具体步骤没什么多说的,就讲讲如何更新执行完指令后的结果。其实简单来说就两步。

1:按指令的方向,把 相同的数加在一起(加的数*2,被加的数置0)。比如左滑:2 2 2 2 —> 4 0 4 0 ; 2 0 0 2 —> 4 0 0 0 ; 2 0 2 1—> 4 0 0 1; 2 0 4 8 —> 2 0 4 8。

2:把非0的数,按指令的方向移动,把0放在 相反方向。 比如:2 2 2 2 —> 4 0 4 0 —> 4 4 0 0 ;2 0 2 1—> 4 0 0 1 —> 4 1 0 0;2 0 4 8 —> 2 0 4 8 —> 2 4 8 0。

执行完这两步,也就是完成了一次2048指令了。具体请看代码。

AC代码:

#include <stdio.h>

char ins[7];
int game[7][7];
int tag1,tag2,flag;
void swap(int &x,int &y){           // 交换函数
    int t;
    t = x, x = y, y = t;
}

void exchange1(int i)       // 左滑
{
    tag1 = tag2 = -1, flag = true;      // tag1存下标,tag2存数值
    for (int j = 1; j <= 4; j ++)       // 把可以合并的数合并起来
    {
        if (game[i][j] == 0) continue;  // 如果是0,跳过
        if (game[i][j] != tag2)         // 两个数不一样,更新。 比如 1 2 0 2, j = 2时, 2和1不一样,更新记录2
            {tag1 = j, tag2 = game[i][j]; continue;}
        if (game[i][j] == tag2)         // 两个数相同,相加。(接上)j = 4时,2 与前面的2相同,相加。 
        {
            game[i][tag1] *= 2, game[i][j] = 0;
            tag1 = tag2 = -1;           // 2048规则是一次指令中,对相同的数只加一次。比如
        }                               // 2 2 2 0 , 只会加成 4 2 0 0 ,不好成 6 0 0 0 
    }
    while (flag)                        // 把 >0的数,向左填充。
    {
        flag = false;   // 默认都向左填充好了,不要移位了。
        for (int j = 1; j < 4; j ++)   
            if (game[i][j] == 0 && game[i][j+1] != 0)  // 如果前一位是0,后一位非0,把非0数左移。
                swap(game[i][j], game[i][j+1]), flag = true; //移过一次就重新记 true。
    }   // 如果最后flag 还是 false,说明该轮没用移动过数,那么说明已经排好了,跳出循环。
}

void exchange2(int i)
{
    tag1 = tag2 = -1, flag = true;
    for (int j = 4; j >= 1; j --)
    {
        if (game[i][j] == 0) continue;
        if (game[i][j] != tag2)
            {tag1 = j, tag2 = game[i][j]; continue;}
        if (game[i][j] == tag2)
        {
            game[i][tag1] *= 2, game[i][j] = 0;
            tag1 = tag2 = -1;
        }
    }
    while (flag)
    {
        flag = false;
        for (int j = 4; j > 1; j --)
            if (game[i][j] == 0 && game[i][j-1] != 0)
                swap(game[i][j], game[i][j-1]), flag = true;
    }
}

void exchange3(int i)
{
    tag1 = tag2 = -1, flag = true;
    for (int j = 4; j >= 1; j --)
    {
        if (game[j][i] == 0) continue;
        if (game[j][i] != tag2)
            tag1 = j, tag2 = game[j][i];
        else if (game[j][i] == tag2)
        {
            game[tag1][i] *= 2, game[j][i] = 0;
            tag1 = tag2 = -1;
        }
    }
    while (flag)
    {
        flag = false;
        for (int j = 4; j > 1; j --)
            if (game[j][i] == 0 && game[j-1][i] != 0)
                swap(game[j][i], game[j-1][i]), flag = true;
    }
}
void exchange4(int i)
{
    tag1 = tag2 = -1, flag = true;
    for (int j = 1; j <= 4; j ++)
    {
        if (game[j][i] == 0) continue;
        if (game[j][i] != tag2)
            tag1 = j, tag2 = game[j][i];
        else if (game[j][i] == tag2)
        {
            game[tag1][i] *= 2, game[j][i] = 0;
            tag1 = tag2 = -1;
        }
    }
    while (flag)
    {
        flag = false;
        for (int j = 1; j < 4; j ++)
            if (game[j][i] == 0 && game[j+1][i] != 0)
                swap(game[j][i], game[j+1][i]), flag = true;
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while ( T --)
    {
        for (int i = 1; i <= 4; i ++)
            for (int j = 1; j <= 4; j ++)
                scanf("%d",&game[i][j]);
        scanf("%s",ins);
        if  (ins[0] == 'L')                     // 按指令操作
            for (int i = 1; i <= 4; i ++)
                exchange1(i);
        else if (ins[0] == 'R')
            for (int i = 1; i <= 4; i ++)
                exchange2(i);
        else if (ins[0] == 'D')
            for (int i = 1; i <= 4; i ++)
                exchange3(i);
        else
            for (int i = 1; i <= 4; i ++)
                exchange4(i);

        for (int i = 1; i <= 4; i ++)           // 输出
        {
            for (int j = 1; j <= 3; j ++)
                printf("%d ",game[i][j]);
            printf("%d\n",game[i][4]);
        }
        puts("");
    }
    return 0;
}

2048-AI程序算法分析 转自:CodingLabs 针对目前火爆的2048游戏,有人实现了一个AI程序,可以以较大概率(高于90%)赢得游戏,并且作者在stackoverflow上简要介绍了AI的算法框架和实现思路。但是这个回答主要集中在启发函数的选取上,对AI用到的核心算法并没有仔细说明。这篇文章将主要分为两个部分,第一部分介绍其中用到的基础算法,即Minimax和Alpha-beta剪枝;第二部分分... 阅读详情

相关推荐

2048游戏及其AI算法(网页版).zip

网页小游戏,HTML+css+js构成。功能(1)游戏界面显示:数字、上下左右移动、合并等特效以及得分。(2)自动玩游戏的程序,达到2048分者胜利(3)可上传sweet网。内附实验报告!!!请大家多多指点!有啥问题直接留言,看见后立刻回!

2048(lj模拟)

题目描述 此时,Conan却在一旁玩着2048。 这是一个4*4的矩阵,初始全为0。每次一个没有数字的格子中会随机出现一个2或4,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。 Conan想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去。所以这个模拟...

323

2048小游戏——网页版

这是一个用js写的网页版2048游戏,实现2048游戏的基本功能。 比如:绘制网格、随机生成数字、动画移动数字、累计分数、重置游戏等。 我再代码中进行了非常详细的注释,相信有一点点基础的开发人员都能迅速看懂,快来试试吧! 当然,大神还可以在这个文档的基础上对游戏进行改进,比如添加一些更炫酷的动画效果,自定义数字、文字、图像等。

2048游戏的自动算法(1)朴素蒙特卡罗方法

一句话概括:每一步我们需要按下四个方向键之一,可以看作往四个方向走一步。那么首先往某个方向走一步,然后随机游走统计最大步数,平均步数最多的那个方向认为是最佳方向。 详细解释: 2048游戏可以看作一个马尔可夫决策过程(Markov Decision Process,MDP),它的状态空间SSS是很大的,但是动作空间A={↑,↓,←,→}A=\{↑, ↓, ←, →\}A={↑,↓,←,→}却很小,且我们知道它的状态转移概率P(st∣st−1)P(s_t | s_{t - 1})P(st​∣st−1​)。 在

ZZXN的博客 4277

90%概率自动达到2048

具有90%概率达到2048,较大概率达到4096,C#语言写成,简洁的UI(开发工具VS2015)。

2048 游戏求解器:2048 游戏的 AI 求解器-matlab开发

用 MATLAB 编写的 Game 2048 人工智能求解器的实现。 该代码在 Matlab Central 交易所进行的算法提交竞赛中获得第二名。 比赛结果的详细信息可以在http://blogs.mathworks.com/pick/2014/05/02/2048-algorithms/

xtuoj 1239 2048

2048 题目描述 2048是大家非常喜欢的一款小游戏,给定一个2048的局面,和下一步的指令,请计算出变化后的局面。 2048的游戏规则如下: 游戏是一个4×4的格子 玩家可以使用上、下、左、右控制数字方格滑动, 每滑动一次,所有的数字方块都会往滑动的方向靠拢,相同数字的方块在靠拢、相撞时会相加。 不断的叠加最终拼凑出2048这个数字就算成功 每次滑动后,会在某个空白格子中出现随...

weixin_43738625的博客 2228

2048-Assist:流行的2048游戏的人工智能游戏求解器。 只需简单的实用程序功能即可获得2048 99.99%的时间

2048 Assist是一款流行的2048游戏的人工智能求解器。 该算法旨在解决人类的游戏难题。 求解器99.9%的时间解决了问题。 该算法在游戏树上执行Expectimax搜索,并为状态分配适当的效用得分。 Expectimax有2个部分:a)期望b)Maximizer-期望给出当前游戏状态的期望值-Maximizer取所有期望值中的最大值。 该程序在支持的Windows Phone设备上使用并行化。 2048 Assist设计用于Windows Phone。 实际的游戏是Gabriel Cirulli的2048( )的副本,其中有一些微小的变化,其中包括一个AI解算器。 Solver是使用C#(solver.cs)在本机层中实现的,因为使用Javascript在浏览器内部执行游戏树搜索非常慢。 可以从下载游戏。

用C语言手搓一个2048游戏核心逻辑(附XTU-OJ 1239题解)

本文详细介绍了如何使用C语言从零实现2048游戏的核心逻辑,包括游戏规则解析、数据结构设计、移动与合并算法实现,以及与XTU-OJ 1239题解的对比。通过实战案例,帮助C语言学习者巩固基础语法,培养模块化设计能力,并提供了优化和调试技巧。

weixin_30628801的博客 607

H5游戏源码分享-网页版2048小游戏

H5游戏源码分享-网页版2048小游戏

各种逻辑漏洞

注册:短信轰炸验证码安全问题密码爆破邮箱轰炸用户任意注册、批量注册用户名枚举XSS(有框的地方就可以尝试插XSS)登录:短信轰炸、验证码安全问题、密码爆破、邮箱轰炸SQL注入撞库抓包把password字段修改为空值发送认证凭证替换、比如返回的数据包中包含账号,修改账号就能登录到其他账号Cookie仿冒修改返回包的相关数据,可能会登陆到其他的用户找回密码:短信邮箱轰炸、短信邮箱劫持重置任意用户账户密码、验证码手机用户未统一验证直接跳过验证步骤。

shirlly_的博客 2093

从游戏到算法:手把手教你用C语言实现2048核心逻辑(附XTU-OJ 1239题解)

本文详细讲解了如何使用C语言实现2048游戏的核心算法逻辑,包括数字合并、移动和方向统一处理等关键步骤。通过XTU-OJ 1239题解示例,帮助读者掌握游戏算法到编程实现的完整过程,适合编程学习者和算法爱好者实践参考。

weixin_30700977的博客 355

Python爬虫实战:手把手教你用Selenium绕过药监局网站的反爬机制(附完整代码)

本文详细介绍了如何使用Selenium绕过药监局网站的反爬机制,提供了一套完整的Python爬虫实战方案。通过浏览器指纹伪装、动态等待策略、会话维持技巧以及分布式采集设计,帮助开发者高效爬取药监局数据,解决政府类网站常见的反爬挑战。

weixin_42620255的博客 737

OJ刷题避坑指南:搞定XTU-OJ 1239(2048模拟题)的3个关键细节与调试技巧

本文详细解析了XTU-OJ 1239(2048模拟题)的3个关键实现细节与调试技巧,包括2048合并规则的隐藏陷阱、高效实现四方向操作的工程技巧以及调试方法论与测试用例设计。通过具体代码示例和优化策略,帮助选手避免常见错误,提升解题效率。

weixin_42522552的博客 310

Freemarker整合poi导出带有图片的Excel教程

Freemarker整合poi导出带有图片的Excel教程 https://blog.youkuaiyun.com/x541211190/article/details/105675771根据此人博客可完成此功能,但原文中有一处错误需要纠正,当单元格合并时,计算起始单元格有错误。 源代码: /** * 构造合并单元格集合 * * @param createRowIndex: * @param cellRangeAddresses: * @param startIndex: * @param c

weixin_39403349的博客 1002

解锁PyCharm+Deepseek:本地部署AI编程超能力

在本次探索中,我们成功地在 PyCharm 中实现了 DeepSeek 的本地化部署,这一过程虽然涉及多个步骤,但每一步都为我们开启 AI 编程大门奠定了基础。从安装最新版 PyCharm,确保我们拥有一个功能强大且兼容性良好的开发环境,到注册 DeepSeek 账号并获取 API Key,这是连接我们与强大 AI 能力的关键纽带。接着,在 PyCharm 中安装 Continue 插件并进行精细配置,让 DeepSeek 能够深度融入我们的编程流程。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 5548

我的改进版2048(3)之智能自动

2048之智能自动

世界很大我很小 3760

redhawk:STA timing data file解析

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?STA timing data file分为以下几个部分:• Header• Name Map• Footer这部分报告设计的基本信息,例如文件类型,设计名称,分隔符等。...

m0_61544122的博客 1154

2048游戏智能辅助:3种模式轻松通关指南

2048游戏看似简单,实则藏着大学问。当数字方块越来越多,棋盘空间越来越小时,即使是资深玩家也常常陷入"下一步该往哪移"的决策困境。据统计,普通玩家达成2048 tile的概率不足15%,而借助智能辅助工具,这一概率可提升至85%以上。本文将介绍一款专为2048游戏设计的AI辅助工具,让你轻松掌握游戏秘诀,体验通关乐趣。 ## 核心功能:3种模式满足不同需求 ### 全自动模式:让AI替你玩

gitblog_00680的博客 1432

STM32G0/G4电机控制中三角函数与浮点运算优化实战

三角函数(sin/cos)和浮点运算是电机矢量控制(FOC)的核心基础,直接影响Clark/Park变换、SVPWM及观测器的实时性与精度。在资源受限的MCU上,标准math.h库因无硬件FPU支持而引发严重时序抖动,导致电流环延迟、转矩脉动增大甚至系统复位。通过硬件加速(如STM32G4的CORDIC协处理器)或定制化定点算法(如STM32G0的查表+线性插值),可将sin/cos计算从数十微秒压缩至1–3 μs量级,提升30倍以上效率。该方案广泛适用于BLDC/PMSM驱动、伺服控制及高动态响应嵌入式运

weixin_35751412的博客 109

使用STM32H7点亮RGB屏幕

希望本文能对你有所帮助!RGB屏幕是一种具有红、绿、蓝三种颜色通道的显示设备,通过控制每个通道的亮度,可以显示出丰富多彩的图像和动画。要使用STM32H7控制RGB屏幕,我们需要连接适当的引脚,并编写适当的代码来控制每个颜色通道的亮度。在主循环中,我们先点亮红色通道,然后延迟一段时间,接着点亮绿色通道,再延迟一段时间,最后点亮蓝色通道,并再次延迟。需要注意的是,示例代码中的延迟循环使用了一个简单的计数器实现,但实际应用中可能需要更精确的延迟方式,例如使用定时器中断或操作系统提供的延迟函数。

QoyOle的博客 923

2048游戏的核心运算

@[lucck] (2048游戏的核心算) 第一步:零元素移至末尾 list_merge =[2,0,2,0] ###例如: [2,0,2,0] --> [2,2,0,0] [2,0,0,2] --> [2,2,0,0] [2,4,0,2] --> [2,4,2,0] def zero_to_end(): “”" 定义一个函数:零元素移动到末尾. “”" # 思想:从后向前...

longfeiyulu的博客 5978

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: XTU-OJ 1432-Cycle
下一篇: XTU-OJ 1243-Bob‘s Password
Jay_is_Chou
博客等级 码龄5年 517粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值