首页 > 解决方案 > 如何更改类中的 x,y 坐标

问题描述

我有一个作业,我已经完成了“无人机”和“空域”课程。我需要移动存在的所有无人机的 x,y 坐标,这些坐标已存储在 Airspace 类的 x.drones 中,作为一个列表。但是,我无法访问和操作 x.drones 中的列表。如何在课堂上更改其他成员的列表值?

到目前为止,我已经给出了我所有的代码,这是我需要帮助的方法 x.flyDrones。我试图制作一个 for 循环,但这似乎不起作用。

module Drones

type Drone(x1:int, y1:int, x2:int, y2:int, spd:int) =
    static let mutable count = 0
    static let mutable hinsta = []
    let mutable position = (x1,y1)
    let mutable destination = (x2,y2)
    let mutable speed = spd
    do count <-count + 1
    let mutable insta = [x1,y1,x2,y2,spd]
    do hinsta <- hinsta @ insta
    static member Count = count
    static member Collection = hinsta
    member x.fly =
        if fst destination - fst position > 0 then position <- (x1+1,y1)
        else if snd destination - snd position > 0 then position <- (x1,y1+1)
    member x.isFinished =
        fst destination - fst position = 0 && snd destination - snd position = 0


type Airspace =
    member x.drones = Drone.Collection
    member x.droneDist(drone1, drone2) =
        let dist = ((fst drone1 - fst drone2),(snd drone1 - snd drone2))
        dist
    member x.flyDrones =
        for drone in x.drones do

    member x.addDrone(x1, y1, x2, y2, spd) = new Drone(x1, y1, x2, y2, spd)
    //member x.willCollide(time) = 


标签: f#

解决方案


很抱歉让你失望了,OliverVS,但这不会飞。我相信我可以看到您的意图,但这需要完全重写而不是修复。让我试着给你一些建议。

首先,你为什么要使用类?我不会,但我会假设作业说你应该这样做,所以让我们继续这样做。

Drone 类应该负责保存单个无人机的信息,但是您在 Airspace 中有 x.drones 设置为 Drone.Collection,它不是 Drone 的集合或列表,而是int*int*int*int*int保留的列表作为 Drone 类中的静态列表。这真的很乱。为什么 Drone 类有静力学?Airspace 类应该负责维护 Drone 的列表,因此摆脱 Drone 中的所有静态,而是找到一种方法来维护 Airspace 类中的无人机列表。

Airspace 类型有实例成员——不是静态成员——但没有构造函数。您可能需要一个默认构造函数,所以它应该是Airspace() =,然后您需要实例化一个 Airspace。

当您可以通过获取无人机列表的长度来简单地找到无人机的数量时,您不需要维护计数。

您无需在任何地方使用单个静态即可解决整个作业。

成员名称以大写字母开头。

像 x.fly 和 x.flyDrones 这样的成员不是方法,因为它们没有参数。您至少需要将()它们作为方法的参数。

x.addDrone 正确地创建了一个新的 Drone,但它应该将它添加到 Airspace 类应该拥有的无人机列表中。

Drone 类使用元组来表示位置和目的地,这导致代码的可读性大大fst降低snd。不要那样做。通常,如果元组引起混淆,请使用记录而不是元组。不要使用像x1, y1, x2, y2, spd, insta, hinsta, fly.

一些更改将使 Drone 类更好一些,尽管我在这里没有遵循我自己的所有建议。用同名的可变变量遮蔽类参数的要点是 1)它们确实是可变的,这意味着它们可以更改,以及 2)阻止进一步使用原始参数,这避免了任何类型的混淆,无论是写代码或读代码。

type Drone(x1:int, y1:int, x2:int, y2:int, speed:int) =
    let mutable x1 = x1
    let mutable y1 = y1
    let mutable x2 = x2
    let mutable y2 = y2
    let mutable speed = speed
    member _.X1 = x1
    member _.Y1 = y1
    member _.X2 = x2
    member _.Y2 = y2
    member _.Speed = speed
    member _.Fly() =
        if x2 - x1 > 0 then x1 <- x1 + 1
        elif y2 - y1 > 0 then y1 <- y1 + 1
    member _.IsFinished = x2 - x1 = 0 && y2 - y1 = 0

推荐阅读