2017-04-21 5 views
-2

私は実際にはmatlabに新しく、このゲームをプログラミングしようとしています...問題は私が2または6を入力するときにゼロから2と4の間のランダムな新しい数値を追加する必要があります。 t..plsはどこに問題があるのか​​を知るのに役立ちます...私はループが正しかったと確信しています。問題はwhileループにあると思います...私の言語にはごめんなさい...感謝の言葉.........matlabでプログラミング2048

for i=1:2 
    a1=rand; 
    if a1>0.666666 
    b1=4; 
    else 
    b1=2; 
    end 
    c1=round(3*rand + 1); 
    c2=round(3*rand + 1); 
    A(4,4)=0; 
    A(c1,c2)=b1; 
end 
disp(A) 
while 2>1 
     S=input('direction') 
     if S==2 
     for i=1:4 
     if A(2,i)==0 
      A(2,i)=A(1,i); 
      A(1,i)=0; 
     end 
     if A(3,i)==0 
      A(3,i)=A(2,i); 
      A(2,i)=A(1,i); 
      A(1,i)=0; 
     end 
     if A(4,i)==0 
      A(4,i)=A(3,i); 
      A(3,i)=A(2,i); 
      A(2,i)=A(1,i); 
      A(1,i)=0; 
     end 
     end 
    for i=1:4 
     if A(4,i)==A(3,i); 
      A(4,i)=2*A(3,i); 
      A(3,i)=A(2,i); 
      A(2,i)=A(1,i); 
      A(1,i)=0; 
     end 
     if A(3,i)==A(2,i); 
      A(3,i)=2*A(2,i); 
      A(2,i)=A(1,i); 
      A(1,i)=0; 
     end 
     if A(2,i)==A(1,i) 
      A(2,i)=2*A(2,i); 
      A(1,i)=0; 
     end 
     end 
    a2=rand; 
    if a2>0.666666 
     b2=4; 
    else 
     b2=2; 
    end 
    while 3>1 
     x1=round(3*rand+1); 
     x2=round(3*rand+1); 
    if A(x1,x2)==0 
     break 
    end 
    if find(A)==16 
      break 
    end 
    end 
    if find(A)~=16 
    A(x1,x2)=b2; 
    end 
    end 
    if S==8 
    for i=1:4 
    if A(3,i)==0 
     A(3,i)=A(4,i); 
     A(4,i)=0; 
    end 
    if A(2,i)==0 
     A(2,i)=A(3,i); 
     A(3,i)=A(4,i); 
     A(4,i)=0; 
    end 
    if A(1,i)==0 
     A(1,i)=A(2,i); 
     A(2,i)=A(3,i); 
     A(3,i)=A(4,i); 
     A(4,i)=0; 
    end 
    end 
    for i=1:4 
    if A(1,i)==A(2,i) 
     A(1,i)=2*A(2,i); 
     A(2,i)=A(3,i); 
     A(3,i)=A(4,i); 
     A(4,i)=0; 
    end 
    if A(2,i)==A(3,i) 
     A(2,i)=2*A(3,i); 
     A(3,i)=A(4,i); 
     A(4,i)=0; 
    end 
    if A(3,i)==A(4,i) 
     A(3,i)=2*A(3,i); 
     A(4,i)=0; 
    end 
    end 
    a3=rand; 
    if a3>0.666666 
     b3=4; 
    else 
     b3=2; 
    end 
    while 1 
     x3=round(3*rand+1); 
     x4=round(3*rand+1); 
    if A(x3,x4)==0 
     break 
    end 
    if find(A)==16 
     break 
    end 
    end 
    if find(A)~=16 
     A(x3,x4)=b3; 
    end 
    end 
    if S==6 
    for j=1:4 
    if A(j,2)==0 
     A(j,2)=A(j,1); 
     A(j,1)=0; 
    end 
    if A(j,3)==0 
     A(j,3)=A(j,2); 
     A(j,2)=A(j,1); 
     A(j,1)=0; 
    end 
    if A(j,4)==0 
     A(j,4)=A(j,3); 
     A(j,3)=A(j,2); 
     A(j,2)=A(j,1); 
     A(j,1)=0; 
    end 
    end 
    for j=1:4 
    if A(j,4)==A(j,3); 
     A(j,4)=2*A(j,3); 
     A(j,3)=A(j,2); 
     A(j,2)=A(j,1); 
     A(j,1)=0; 
    end 
    if A(j,3)==A(j,2) 
     A(j,3)=2*A(j,2); 
     A(j,2)=A(j,1); 
     A(j,1)=0; 
    end 
    if A(j,2)==A(j,1) 
     A(j,2)=2*A(j,1); 
     A(j,1)=0; 
    end 
    end 
    a4=rand; 
    if a4>0.666666 
    b4=4; 
    else 
    b4=2; 
    end 
while 2>1 
    x5=round(3*rand+1); 
    x6=round(3*rand+1); 
    if A(x5,x6)==0 
    break 
    end 
    if find(A)==16 
     break 
    end 
end 
if find(A)~=16 
    A(x5,x6)=b4; 
end 
end 
if S==4 
for j=1:4 
    if A(j,3)==0 
     A(j,3)=A(j,4); 
     A(j,4)=0; 
    end 
    if A(j,2)==0 
     A(j,2)=A(j,3); 
     A(j,3)=A(j,4); 
     A(j,4)=0; 
    end 
    if A(j,1)==0 
     A(j,1)=A(j,2); 
     A(j,2)=A(j,3); 
     A(j,3)=A(j,4); 
     A(j,4)=0; 
    end 
    end 
    for j=1:4 
    if A(j,1)==A(j,2) 
     A(j,1)=2*A(j,2); 
     A(j,2)=A(j,3); 
     A(j,3)=A(j,4); 
     A(j,4)=0; 
    end 
    if A(j,2)==A(j,3) 
     A(j,2)=2*A(j,3); 
     A(j,3)=A(j,4); 
     A(j,4)=0; 
    end 
    if A(j,3)==A(j,4) 
     A(j,3)=2*A(j,4); 
     A(j,4)=0; 
    end 
    end 
    a5=rand; 
    if a5>0.666666 
    b5=4; 
    else 
    b5=2; 
    end 
while 2>1 
    x7=round(3*rand+1); 
    x8=round(3*rand+1); 
    if A(x7,x8)==0 
     break 
    end 
    if find(A)==16 
     break 
    end 
    end 
    if find(A)~=16 
    A(x7,x8)=b5; 
    end 
end 
disp(A) 
end 
+0

ここには繰り返しのコードが多すぎるため、理解しにくくエラーを見逃しやすいです。繰り返しコードをラップするいくつかの関数を記述してみてください。例えば、行を括ったり、列方向にスライドさせて数字をスライドさせたりします。またはランダムな座標を選択するセクション。メインロジックコードを圧縮した後、デバッグが容易になります – Peter

+0

[Matlabデバッガ](https://nl.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html)はあなたの問題をローカライズするための便利なツールです。 – m7913d

+0

matlabのコンソールで "dbstop if error"と入力してください – Gelliant

答えて

0

多分、このコードを出発点として試してみてください。この場合、Vを入力として受け入れ、新しいVを出力として返すw-s-a-dの関数を記述します。

close all 
fig=figure(1);clf 
eventKey = @(src, event) set(gcf,'Tag',event.Key); 
set(fig, 'WindowKeyPressFcn', @(src,event) eventKey(src,event)) 
V = zeros(4); 
V(2,3)=2; 
V(1,4)=4; 
T=fig.Tag; 
go=true; 
while go 
    if sum(V(:)==0)==0,disp('gameover');go=0;end 
    clf 
    plot([0,0,4,4,0,1,1,2,2,3,3,4,4,0,0,4,4,0],[0,4,4,0,0,0,4,4,0,0,4,4,3,3,2,2,1,1],'-k') 
    axis image off 
    axis([-.5 4.5 -.5 4.5]) 
    for i = 1:4 
     for j = 1:4 
      if V(i,j)~=0 
       text(i-.5,j-.5,num2str(V(i,j))) 
      end 
     end 
    end 
    pause(0.01) 
    drawnow 
    if ~strcmp(T,fig.Tag) 
     T=fig.Tag; 
     switch T 
      case 'w' 
       V 
      case 's' 
       V 
      case 'a' 
       V 
      case 'd' 
       V 
      case 'escape' 
       go=0; 
     end 
     T='idle'; 
     fig.Tag='idle'; 
     V=V(:); 
     s=rand([numel(V),1]);[~,idx]=sort(s); 
     i=find(V(idx)==0,1,'first'); 
     V(idx(i))=2; 
     V=reshape(V,[4,4]); 
    end 
end 
関連する問題