2048.pas

题目描述: 此时,Conan却在一旁玩着2048。
这是一个4*4的矩阵,初始全为0。每次一个没有数字的格子中会随机出现一个2或4,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。

Conan想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去。所以这个模拟的任务就交给你了。过了一会,他然后睁开眼睛,如果游戏没有结束(滑动后如果没有空格子,则游戏结束),请输出矩阵(格式参见样例),否则输出“Game over!”(不包含引号)

从文件 game.in 中读入数据。
输入第一行包含一个整数N,表示Conan滑了几下。
接下来N 行,x, y, v, f表示第x行与第y列出现数字为v后,Conan滑的方向为ff为字符,U, D, L, R分别表示向上下左右滑)。
行从上往下1-4标号,列从左往右1-4标号
数据保证在游戏未结束时,只会在空白区域出现数字。

样例输入
8
1 3 4 L
2 3 2 U
2 4 2 R
4 1 2 L
3 4 2 L
3 2 2 D
1 3 4 R
1 3 2 U
样例输出
0 0 2 8
0 0 0 2
0 0 0 8
0 0 0 0
var
        a,b,c,i,j,k,o:longint;
        v:array[0..5,0..5]of longint;
        t,s:char;
        u:boolean;
procedure up;
var
        i,j,k,o:longint;
begin
        for k:=1 to 4 do
        begin
                for i:=1 to 4 do
                begin
                        if (v[i-1,k]=0)and(i-1>0) then
                        begin
                                o:=i;
                                while (v[o-1,k]=0)and(o-1>0) do
                                begin
                                        v[o-1,k]:=v[o,k];
                                        v[o,k]:=0;
                                        dec(o);
                                end;
                        end;
                end;
                for i:=1 to 4 do
                begin
                        if (v[i-1,k]=v[i,k])and(v[i,k]<>0)and(i-1>0) then
                        begin
                                v[i-1,k]:=v[i-1,k]+v[i,k];
                                v[i,k]:=0;
                                for j:=i to 3 do
                                begin
                                        v[j,k]:=v[j+1,k];
                                        v[j+1,k]:=0;
                                end;
                                continue;
                        end;
                end;
        end;
end;
procedure down;
var
        i,j,k,o:longint;
begin
        for k:=1 to 4 do
        begin
                for i:=4 downto 1 do
                begin
                        if (v[i+1,k]=0)and(i+1<=4) then
                        begin
                                o:=i;
                                while (v[o+1,k]=0)and(o+1<=4) do
                                begin
                                        v[o+1,k]:=v[o,k];
                                        v[o,k]:=0;
                                        inc(o);
                                end;
                        end;
                end;
                for i:=4 downto 1 do
                begin
                        if (v[i+1,k]=v[i,k])and(v[i,k]<>0)and(i+1<=4) then
                        begin
                                v[i+1,k]:=v[i+1,k]+v[i,k];
                                v[i,k]:=0;
                                for j:=i downto 2 do
                                begin
                                        v[j,k]:=v[j-1,k];
                                        v[j-1,k]:=0;
                                end;
                                continue;
                        end;
                end;
        end;
end;
procedure lift;
var
        i,j,k,o:longint;
begin
        for k:=1 to 4 do
        begin
                for i:=1 to 4 do
                begin
                        if (v[k,i-1]=0)and(i-1>0) then
                        begin
                                o:=i;
                                while (v[k,o-1]=0)and(o-1>0) do
                                begin
                                        v[k,o-1]:=v[k,o];
                                        v[k,o]:=0;
                                        dec(o);
                                end;
                        end;
                end;
                for i:=1 to 4 do
                begin
                        if (v[k,i-1]=v[k,i])and(v[k,i]<>0)and(i-1>0) then
                        begin
                                v[k,i-1]:=v[k,i]+v[k,i-1];
                                v[k,i]:=0;
                                for j:=i to 3 do
                                begin
                                        v[k,j]:=v[k,j+1];
                                        v[k,j+1]:=0;
                                end;
                                continue;
                        end;
                end;
        end;
end;
procedure right;
var
        i,j,k,o:longint;
begin
        for k:=1 to 4 do
        begin
                for i:=4 downto 1 do
                begin
                        if (v[k,i+1]=0)and(i+1<=4) then
                        begin
                                o:=i;
                                while (v[k,o+1]=0)and(o+1<=4) do
                                begin
                                        v[k,o+1]:=v[k,o];
                                        v[k,o]:=0;
                                        inc(o);
                                end;
                        end;
                end;
                for i:=4 downto 1 do
                begin
                        if (v[k,i+1]=v[k,i])and(v[k,i]<>0)and(i+1<=4) then
                        begin
                                v[k,i+1]:=v[k,i]+v[k,i+1];
                                v[k,i]:=0;
                                for j:=i downto 2 do
                                begin
                                        v[k,j]:=v[k,j-1];
                                        v[k,j-1]:=0;
                                end;
                                continue;
                        end;
                end;
        end;
end;
begin
        assign(input,'2048.in');reset(input);
        assign(output,'2048.out');rewrite(output);
        readln(a);
        for b:=1 to a do
        begin
                u:=true;
                for o:=1 to 4 do
                begin
                        for c:=1 to 4 do if v[o,c]=0 then
                        begin
                                u:=false;
                                break;
                        end;
                        if u=false then break;
                end;
                if u=true then begin
                        writeln('Game over!');
                        halt;
                end;
                readln(i,j,k,t,s);
                if v[i,j]<>0 then halt;
                v[i,j]:=k;
                if s='U' then up;
                if s='D' then down;
                if s='L' then lift;
                if s='R' then right;
        end;
        for b:=1 to 4 do
        begin
                for c:=1 to 4 do write(v[b,c],' ');
                writeln;
        end;
        close(input);
        close(output);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值