m0_47990104 2022-03-31 10:29 采纳率: 100%
浏览 1994
已结题

Matlab运行遇到“ || 和 && 运算符的操作数必须能够转换为逻辑标量值”问题。

自己写了一个寻机头的小游戏,在随机放置第二个飞机的时候有时候运行会显示“ || 和 && 运算符的操作数必须能够转换为逻辑标量值”,但是放置第一个飞机的时候就不会有问题,求帮忙看一下代码是那个地方逻辑出错了吗?
下面是部分代码:

plane=zeros(10);%设置矩阵
v1=randi(100);%随机生成第一个机头位置下标
while true
    if v1==1||v1==2||v1==9||v1==10||v1==11||v1==12||v1==19||v1==20||v1==81||v1==82||v1==89||v1==90||v1==91||v1==92||v1==99||v1==100
        v1=randi(100);%重新生成机头下标
    else
        break
    end
end%利用randi函数生成机头位置下标并利用while循环排除机头不能出现的位置

[m,n]=size(dir1);
rownum=randi([1,m],1,1);%随机选择一行
ntx1=dir1(rownum,1);%将被选中行中的x坐标赋值给ntx1,ntx1代表紧靠机头的蓝色方格的行数
nty1=dir1(rownum,2);%将被选中行中的x坐标赋值给nty1,nty1代表紧靠机头的蓝色方格的列数
%此时飞机方向已确定

if ntx1==tx1+1%机头朝上的排列
    plane([v1+1,v1+2,v1+3,v1-9,v1-19,v1+11,v1+21,v1-7,v1+13])=[1,1,1,1,1,1,1,1,1];%将机身赋值为1
elseif ntx1==tx1-1%机头朝下的排列
    plane([v1-1,v1-2,v1-3,v1+9,v1+19,v1-11,v1-21,v1+7,v1-13])=[1,1,1,1,1,1,1,1,1];%将机身赋值为1
elseif nty1==ty1+1%机头朝左的排列
    plane([v1+10,v1+20,v1+30,v1+9,v1+8,v1+11,v1+12,v1+29,v1+31])=[1,1,1,1,1,1,1,1,1];%将机身赋值为1
else%机头朝右的排列
    plane([v1-10,v1-20,v1-30,v1-9,v1-8,v1-11,v1-12,v1-29,v1-31])=[1,1,1,1,1,1,1,1,1];%将机身赋值为1
end
disp(plane)
%----------------------第一个飞机放置完毕---------------------------------------------------
%----------------------开始放置第二个飞机---------------------------------------------------


plane(v1)=2;%设置第一个机头参数为2
[tx1,ty1]=find(plane==2);%获取机头坐标并赋值给tx1,ty1


dir1=[[tx1+1 ty1];[tx1-1 ty1];[tx1 ty1+1];[tx1 ty1-1]];%机头四周的位置坐标;机头位置【上,下,左,右】
if ty1<3||ty1>8||tx1>7
    delnum1=1;%排除机头朝上的可能性
end
if ty1<3||ty1>8||tx1<4
    delnum2=2;%排除机头朝下的可能性
end
if tx1<3||tx1>8||ty1>7
    delnum3=3;%排除机头朝左的可能性
end
if tx1<3||tx1>8||ty1<4
    delnum4=4;%排除机头朝右的可能性
end
A=[delnum1, delnum2, delnum3, delnum4];%将以上判断结果写入矩阵
B=find(A>=1);%将不可能的方向写入B矩阵
for j=length(B):-1:1%利用倒序将不可能的方向删除
    dir1(B(j),:)=[];
end
%此时dir1中剩余的方向都是可实现的
plane(v2)=3;%设置第二个机头参数为3
[tx2,ty2]=find(plane==3);%获取机头坐标并赋值给tx2,ty2

dir2=[tx2+1 ty2;tx2-1 ty2;tx2 ty2+1;tx2 ty2-1];%机头四周的位置坐标;机头位置【上,下,左,右】

if ty2<3||ty2>8||tx2>7
    delnum21=1;%排除机头朝上的可能性
end
if ty2<3||ty2>8||tx2<4
    delnum22=2;%排除机头朝下的可能性
end
if tx2<3||tx2>8||ty2>7
    delnum23=3;%排除机头朝左的可能性
end
if tx2<3||tx2>8||ty2<4
    delnum24=4;%排除机头朝右的可能性
end

运行出来的结果

img

  • 写回答

2条回答 默认 最新

  • 技术专家团-Joel 2022-03-31 11:11
    关注

    你好,这是因为ty2和tx2都是向量,里面元素个数大于1,建议改成

    plane=zeros(10);%设置矩阵
    v1=randi(100);%随机生成第一个机头位置下标
    while true
        if v1==1||v1==2||v1==9||v1==10||v1==11||v1==12||v1==19||v1==20||v1==81||v1==82||v1==89||v1==90||v1==91||v1==92||v1==99||v1==100
            v1=randi(100);%重新生成机头下标
        else
            break
        end
    end%利用randi函数生成机头位置下标并利用while循环排除机头不能出现的位置
     
    [m,n]=size(dir1);
    rownum=randi([1,m],1,1);%随机选择一行
    ntx1=dir1(rownum,1);%将被选中行中的x坐标赋值给ntx1,ntx1代表紧靠机头的蓝色方格的行数
    nty1=dir1(rownum,2);%将被选中行中的x坐标赋值给nty1,nty1代表紧靠机头的蓝色方格的列数
    %此时飞机方向已确定
    if ntx1==tx1+1%机头朝上的排列
        plane([v1+1,v1+2,v1+3,v1-9,v1-19,v1+11,v1+21,v1-7,v1+13])=[1,1,1,1,1,1,1,1,1];%将机身赋值为1
    elseif ntx1==tx1-1%机头朝下的排列
        plane([v1-1,v1-2,v1-3,v1+9,v1+19,v1-11,v1-21,v1+7,v1-13])=[1,1,1,1,1,1,1,1,1];%将机身赋值为1
    elseif nty1==ty1+1%机头朝左的排列
        plane([v1+10,v1+20,v1+30,v1+9,v1+8,v1+11,v1+12,v1+29,v1+31])=[1,1,1,1,1,1,1,1,1];%将机身赋值为1
    else%机头朝右的排列
        plane([v1-10,v1-20,v1-30,v1-9,v1-8,v1-11,v1-12,v1-29,v1-31])=[1,1,1,1,1,1,1,1,1];%将机身赋值为1
    end
    disp(plane)
    %----------------------第一个飞机放置完毕---------------------------------------------------
    %----------------------开始放置第二个飞机---------------------------------------------------
     
     
    plane(v1)=2;%设置第一个机头参数为2
    [tx1,ty1]=find(plane==2);%获取机头坐标并赋值给tx1,ty1
     
     
    dir1=[[tx1+1 ty1];[tx1-1 ty1];[tx1 ty1+1];[tx1 ty1-1]];%机头四周的位置坐标;机头位置【上,下,左,右】
    if ty1<3||ty1>8||tx1>7
        delnum1=1;%排除机头朝上的可能性
    end
    if ty1<3||ty1>8||tx1<4
        delnum2=2;%排除机头朝下的可能性
    end
    if tx1<3||tx1>8||ty1>7
        delnum3=3;%排除机头朝左的可能性
    end
    if tx1<3||tx1>8||ty1<4
        delnum4=4;%排除机头朝右的可能性
    end
    A=[delnum1, delnum2, delnum3, delnum4];%将以上判断结果写入矩阵
    B=find(A>=1);%将不可能的方向写入B矩阵
    for j=length(B):-1:1%利用倒序将不可能的方向删除
        dir1(B(j),:)=[];
    end
    %此时dir1中剩余的方向都是可实现的
    plane(v2)=3;%设置第二个机头参数为3
    [tx2,ty2]=find(plane==3);%获取机头坐标并赋值给tx2,ty2
    %% 增加的两行
    tx2 = tx2(1);
    ty2 = ty2(1);
    
    dir2=[tx2+1 ty2;tx2-1 ty2;tx2 ty2+1;tx2 ty2-1];%机头四周的位置坐标;机头位置【上,下,左,右】
    if ty2<3||ty2>8||tx2>7
        delnum21=1;%排除机头朝上的可能性
    end
    if ty2<3||ty2>8||tx2<4
        delnum22=2;%排除机头朝下的可能性
    end
    if tx2<3||tx2>8||ty2>7
        delnum23=3;%排除机头朝左的可能性
    end
    if tx2<3||tx2>8||ty2<4
        delnum24=4;%排除机头朝右的可能性
    end
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 修改了问题 3月31日
  • 创建了问题 3月31日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来