Trước hết, chúng tôi cần thiết lập cách chương trình của bạn luân chuyển.
Thực hiện một lệnh, chờ, sau đó thực hiện lệnh tiếp theo? Hoặc nó thực hiện lệnh đồng thời? (ví dụ, di chuyển và làm điều gì đó khác)
Tôi tưởng tượng bạn sẽ muốn nó thực hiện các lệnh theo thứ tự, thay vì một số luồng phức tạp mà hệ thống động cơ của bạn có thể không hỗ trợ.
Để có được robot của bạn để di chuyển chậm, tôi sẽ khuyên bạn nên tạo một phương pháp Move() mà phải mất một tham số, số lượng thời gian bạn muốn nó dành di chuyển, như thế này:
public void Move(int numberOfSeconds)
{
while (numberOfSeconds > 0)
{
myRobot.MotorOn();
Thread.Sleep(2000);
myRobot.MotorOff();
Thread.Sleep(500);
numberOfSeconds -= 2;
}
}
Đó là không chính xác, nhưng đó là một cách để làm điều đó.
Nếu sau đó bạn gọi Move (10) chẳng hạn, rô bốt của bạn sẽ di chuyển trong 10 giây và tạm dừng sau mỗi 2 giây trong nửa giây.
Về câu hỏi lưu lượng chương trình của bạn, bạn có thể muốn nghĩ về nó như một danh sách các hướng dẫn:
tiến DỪNG KIỂM TRA CHO OBJECT XOAY ĐỂ AIM AT OBJECT tiến DỪNG
v.v.
Vì vậy, trong vòng điều khiển chương trình chính của bạn, giả sử các cuộc gọi là đồng bộ (ví dụ:chương trình của bạn dừng lại trong khi nó đang thực hiện một lệnh, như trong Di chuyển phương pháp trên), bạn chỉ có thể có một loạt các IF báo cáo (hoặc một switch)
public void Main()
{
// What calculations should the robot do?
If (someCalculations == someValue)
{
// Rotate the robot to face the object
robot.RotateRight(10);
}
else if (someOtherCalculation == someValue)
{
// We are on course, so move forward
Move(10);
}
}
Điều đó có thể giúp bạn bắt đầu.
Nếu tuy nhiên, rô bốt của bạn không đồng bộ, tức là mã tiếp tục chạy trong khi robot đang làm việc (chẳng hạn như bạn liên tục nhận phản hồi từ cảm biến chuyển động), bạn sẽ phải cấu trúc chương trình của mình theo cách khác. Phương thức Move() có thể vẫn hoạt động, nhưng luồng chương trình của bạn sẽ hơi khác một chút. Bạn có thể sử dụng một biến để theo dõi các tiểu bang:
public enum RobotStates
{
Searching,
Waiting,
Hunting,
Busy,
}
Sau đó, trong vòng lặp chính của bạn, bạn có thể kiểm tra nhà nước:
if (myRobotState != RobotStates.Busy)
{
// Do something
}
Hãy nhớ để thay đổi trạng thái khi hành động của bạn hoàn tất. Hoàn toàn có thể bạn sẽ phải sử dụng luồng cho một giải pháp không đồng bộ, do đó phương pháp nhận phản hồi từ cảm biến của bạn không gặp khó khăn khi chờ robot di chuyển, nhưng có thể tiếp tục thăm dò ý kiến. Tuy nhiên, luồng thông tin nằm ngoài phạm vi của câu trả lời này, nhưng có rất nhiều tài nguyên ngoài kia.
+1 để có câu trả lời toàn diện. –