MATLAB版2048

思路:
界面,通过按钮组合实现4*4单元格
数据合并,定义一个通用函数处理,原数组进行翻转或旋转处理
操作:
上、下、左、右,移动
Esc,重新开始

function game2048()
% figure句柄
h = figure('Name', '2048',...
    'NumberTitle', 'off',...
    'Menubar', 'none',...
    'Position', [450 200 400 440],...
    'KeyPressFcn', @keyevent);

% 4*4格子,用按钮表示
for m =1: 4
    for n = 1: 4
        uicontrol('Style', 'pushbutton',...
            'String', '',...
            'FontSize', 20,...
            'Position', [(m-1)*80+40 (n-1)*80+40 80 80]);
    end
end
hb = findall(gcf, 'Style', 'pushbutton');
pbcolor = get(hb(1), 'BackgroundColor');
numcolor = [0.11 0.23 0.57];

% 分数text
hscoretext = uicontrol('Style', 'text',...
    'BackgroundColor', get(h, 'Color'),...
    'String', '0',...
    'FontSize', 20,...
    'Position', [100 385 200 30]);

% 初始化
[mymatrix, score] = gameini();

%% 初始化
% 格子数据初始化,除随机两数外,其余为0(不显示)
% 分数初始化
    function [mymatrix, score] = gameini()
        set(hb, 'String', '')
        set(hb, 'BackgroundColor', pbcolor)

        mymatrix = zeros(4, 4);
        inxrandi = randi(16);
        mymatrix(inxrandi) = randi(2) * 2;
        set(hb(inxrandi), 'String', mymatrix(inxrandi));
        set(hb(inxrandi), 'BackgroundColor', mod(log2(mymatrix(inxrandi))*numcolor,1));

        score = 0;
        set(hscoretext, 'String', '0')
    end

%% 向右滑动,进行数据合并操作
    function moveevent()
        for i = 1: 4
            myarray = mymatrix(i, :);
            myarray(myarray==0) = [];

            for j = 1: (length(myarray)-1)
                if myarray(j) == myarray(j+1)
                    myarray(j) = myarray(j) + myarray(j+1);
                    myarray(j+1) = 0;
                    score = score + myarray(j);
                end
            end

            myarray(myarray==0) = [];
            myarray((length(myarray)+1): 4) = 0;
            mymatrix(i, :) = myarray;
        end
    end

%% 按键检测
% 判断按键,并进行相应操作(数据合并,分数更新),注意矩阵变化
% 随机初始化一个新的数据
% 判断游戏是否结束
    function keyevent(~, event)
        mymatrixtemp = mymatrix;

        switch event.Key
            case 'uparrow'
                mymatrix = mymatrix';
                moveevent();
                mymatrix = mymatrix';
            case 'leftarrow'
                mymatrix = mymatrix(:, end:-1:1);
                moveevent();
                mymatrix = mymatrix(:, end:-1:1);
            case 'downarrow'
                mymatrix = mymatrix';
                mymatrix = mymatrix(:, end:-1:1);
                moveevent();
                mymatrix = mymatrix(:, end:-1:1);
                mymatrix = mymatrix';
            case 'rightarrow'
                moveevent();
            case 'escape'
                [mymatrix, score] = gameini();
                return
            otherwise
                return
        end

        if isempty(find(mymatrixtemp ~= mymatrix, 1))
            return
        end

        set(hscoretext, 'String', score)

        inx = find(mymatrix == 0);
        inxrandi = randi(length(inx));
        mymatrix(inx(inxrandi)) = randi(2) * 2;
        for i = 1: 16
            if mymatrix(i) == 0
                set(hb(i), 'String', '');
                set(hb(i), 'BackgroundColor', pbcolor)
            else
                set(hb(i), 'String', mymatrix(i));
                set(hb(i), 'BackgroundColor', mod(log2(mymatrix(i))*numcolor,1));
            end
        end

        if isempty(find(mymatrix == 0, 1))
            mymatrixtemp = [ones(1,6); ones(4,1) mymatrix ones(4,1); ones(1,6)];
            for i = 2: 5
                for j = 2: 5
                    if mymatrixtemp(i,j)==mymatrixtemp(i+1,j)...
                            || mymatrixtemp(i,j)==mymatrixtemp(i-1,j)...
                            || mymatrixtemp(i,j)==mymatrixtemp(i,j+1)...
                            || mymatrixtemp(i,j)==mymatrixtemp(i,j-1)
                        return
                    end
                end
            end
            set(hscoretext, 'String', 'GAME OVER')
        end
    end
end
MATLAB2048游戏代码与AI程序代码-MATLAB2048_v5.rar 该游戏与一般的2048游戏规则类似:1. 通过按键(W,A,S,D或方向键)控制小块的移动方向,当有两个小块相同时,把两者合并,产生一个新块(其值90%为2,10%为4)。并给予一定的分数,记录在数据文件中,显示在界面上。2. 当最大块的值达到2048时,您将获得胜利,胜利后您可以选择继续游戏(当最大块的值为4096时,您将获得连胜,依次类推),或者退出游戏。3. 但是,如果小块不能再移动,您将输掉该游戏,此时,您可以选择新游戏或者退出游戏。4. 在游戏过程中,您都有权停止游戏(按Esc键或者关闭界面),下次打开该游戏时将回到本次停止的状态,以便您继续游戏,当然你也可以随时新建游戏。5. 该游戏为了增加游戏的观赏性,特为您增加了几项设置,如动画、声音、颜色、清空历史记录等,您可以按照您的喜好进行设置。6. 游戏还增加了数据分析的功能,您可以查看当前统计,也可以查看历史记录(只要您没有删除他们)。7. 为了降低游戏难度,本游戏还提供了提示功能,按“空格”键即可提示,但连续按下空格键的时间间隔不得少于1s,否则会卡住,影响娱乐效果。8. 还提供了演示功能,您可以设置电脑演示步数,让电脑替您玩游戏。9. 在您进行游戏之前,还请您注意本之间区别。10. 如果您有不明白的地方可以查看帮助,或者给我们留言。11. 如果您觉得该游戏编的可以,可以将自己玩的最好的结果发上来分享。在此祝您游戏愉快!注 :1. 该游戏参考了 Athi的程序,在此向其表示感谢,他的程序可在http://cn.mathworks.com/matlabcentral/fileexchange/46483-2048-game-solver中下载   2. 游戏中ai程序使用了α-β剪枝的minimax算法,可详见ai程序,该程序可以自动演示到2048,成功率大概在70%左右,所以没能完成2048时希望您不要抱怨。   3. 图片是我自己用该游戏玩的最好的一次,需要说明的是虽然ai程序可以完成2048,但他完成4096的成功率非常低,这也说明ai程序还需要改进。   4. 如果您发现其中的错误或者有更好的想法,可以在游戏帮助菜单留言,也可以在下方留言。
MATLAB2048游戏代码与AI程序代码-2048.rar 该游戏与一般的2048游戏规则类似:1. 通过按键(W,A,S,D或方向键)控制小块的移动方向,当有两个小块相同时,把两者合并,产生一个新块(其值90%为2,10%为4)。并给予一定的分数,记录在数据文件中,显示在界面上。2. 当最大块的值达到2048时,您将获得胜利,胜利后您可以选择继续游戏(当最大块的值为4096时,您将获得连胜,依次类推),或者退出游戏。3. 但是,如果小块不能再移动,您将输掉该游戏,此时,您可以选择新游戏或者退出游戏。4. 在游戏过程中,您都有权停止游戏(按Esc键或者关闭界面),下次打开该游戏时将回到本次停止的状态,以便您继续游戏,当然你也可以随时新建游戏。5. 该游戏为了增加游戏的观赏性,特为您增加了几项设置,如动画、声音、颜色、清空历史记录等,您可以按照您的喜好进行设置。6. 游戏还增加了数据分析的功能,您可以查看当前统计,也可以查看历史记录(只要您没有删除他们)。7. 为了降低游戏难度,本游戏还提供了提示功能,按“空格”键即可提示,但连续按下空格键的时间间隔不得少于1s,否则会卡住,影响娱乐效果。8. 还提供了演示功能,您可以设置电脑演示步数,让电脑替您玩游戏。9. 在您进行游戏之前,还请您注意本之间区别。10. 如果您有不明白的地方可以查看帮助,或者给我们留言。11. 如果您觉得该游戏编的可以,可以将自己玩的最好的结果发上来分享。在此祝您游戏愉快!注 :1. 该游戏参考了 Athi的程序,在此向其表示感谢,他的程序可在http://cn.mathworks.com/matlabcentral/fileexchange/46483-2048-game-solver中下载   2. 游戏中ai程序使用了α-β剪枝的minimax算法,可详见ai程序,该程序可以自动演示到2048,成功率大概在70%左右,所以没能完成2048时希望您不要抱怨。   3. 图片是我自己用该游戏玩的最好的一次,需要说明的是虽然ai程序可以完成2048,但他完成4096的成功率非常低,这也说明ai程序还需要改进。   4. 如果您发现其中的错误或者有更好的想法,可以在游戏帮助菜单留言,也可以在下方留言。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值