Перейти к содержимому
  • 0
_bongo_

Не получается логика подсчёта игроков в комнате

Вопрос

Скрытый текст

 

local com = require('component')
local comp = require('computer')
local radar = com.isAvailable("radar") and com.radar or error("нет радара")
local gpu = com.gpu
local term = require('term')

function Board()
gpu.setForeground(0xFFFFFF)
print("||============================================================================||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||                                                                            ||")
print("||==(Класть руду)=========================================(Забирать ресурсы)==||")
end

gpu.setResolution(80,21)

function Ore()
gpu.setForeground(0xFFFFFF)
gpu.set(12,8,'Руды для робота Удача V:')

gpu.setForeground(0x1E90FF)
gpu.set(9,9,'Лазуритовая руда ')

gpu.setForeground(0x4169E1)
gpu.set(27,9,'алмазная руда ')

gpu.setForeground(0x4B0082)
gpu.set(42,9,'дракониевая руда')

gpu.setForeground(0x7B68EE)
gpu.set(9,10,'кремниевая руда ')

gpu.setForeground(0x00BFFF)
gpu.set(26,10,'апатитовая руда ')

gpu.setForeground(0x7FFF00)
gpu.set(43,10,'изумрудная руда')

gpu.setForeground(0x2F4F4F)
gpu.set(9,11,'урановая руда galaxy ')

gpu.setForeground(0x696969)
gpu.set(31,11,'угольная руда ')

gpu.setForeground(0xF5DEB3)
gpu.set(46,11,'кварцевая руда')

gpu.setForeground(0xBC8F8F)
gpu.set(9,12,'красная руда ')

gpu.setForeground(0x2E8B57)
gpu.set(23,12,'перидотовая руда ')

gpu.setForeground(0xDCDCDC)
gpu.set(41,12,'руда истинного кварца')

gpu.setForeground(0xD3D3D3)
gpu.set(9,13,'заряженная руда истинного кварца')
end


while true do
local rad = radar.getPlayers()
local radDist = rad.distance
term.clear()
Board()
Ore()
gpu.setForeground(0xFFFF00)
gpu.set(10,3,'Добро пожаловать на ---------')
gpu.setForeground(0xFF4500)
gpu.set(40,3,'Робот Удача 5 функционирует')
gpu.setForeground(0x808000)
gpu.set(10,16,'Возникли проблемы с удачей V?')
gpu.setForeground(0xFFFF00)
gpu.set(10,17,'Напишите мне в дискорд ----------')
gpu.set(10,18,'или оставьте обращение ------------------------------')

for i = 1, #rad do 
print(rad.distance)

if #rad >= 2 and rad.distance <= 7 then 
gpu.setForeground(0xFF0000)
gpu.set(11,5,'В комнате кроме вас ещё кто-то есть!')
comp.beep(1000,0.1)
os.sleep(1)
comp.beep(1000,0.1)
gpu.setForeground(0x0000FF)
gpu.set(11,5,'В комнате кроме вас ещё кто-то есть!')
os.sleep(1)
else
gpu.setForeground(0x00FF00)
gpu.set(11,5,'Вы одни в комнате')
end 
end 
end 

 

 

Сделал программу для своего варпа
Её задача сканировать область и выводить сколько людей в определённом радиусе
Я всё сделал, но не получается написать правильно логику

Скрытый текст

if #rad >= 2 and rad.distance <= 7 then 
gpu.setForeground(0xFF0000)
gpu.set(11,5,'В комнате кроме вас ещё кто-то есть!')
comp.beep(1000,0.1)
os.sleep(1)
comp.beep(1000,0.1)
gpu.setForeground(0x0000FF)
gpu.set(11,5,'В комнате кроме вас ещё кто-то есть!')
os.sleep(1)
else
gpu.setForeground(0x00FF00)
gpu.set(11,5,'Вы одни в комнате')
end 

Она должна выводить 'В комнате кроме вас ещё кто-то есть!' если 2 или больше человек в радиусе 7 блоков
но все равно она сканирует свой дефолтный радиус 25 блоков, и не берёт во внимание то что я прописал if #rad >= 2 and rad.distance <= 7, 'В комнате кроме вас ещё кто-то есть!', только когда 2+ человек в радиусе 7 блоков
что я не так делаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

3 часа назад, _bongo_ сказал:

что я не так делаю?

А что такое rad? Откуда взялась эта таблица?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

local radar = com.isAvailable("radar") and com.radar or error("нет радара")
local rad = radar.getPlayers()

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
7 минут назад, _bongo_ сказал:

local rad = radar.getPlayers()

Теперь стало понятнее.

 

Для поиска ошибки надо задаться вопросом, что делает каждая из операций.

  • #rad >= 2 проверяет количество игроков в зоне действия радара.
  • Но что делает rad.distance <= 7? Ведь поле .distance не существует в таблице rad. Если ты хочешь проверить удалённость игрока от радара, то это надо делать для каждого из игроков. То есть, надо перебрать игроков в таблице (возможно, всех), проверить удалённость каждого из них и посчитать их количество, набрав хотя бы двух. Готовый код может выглядеть, например, таким образом:
-- получаем список игроков в зоне действия радара
local players = radar.getPlayers()
-- вычисляем количество игроков в комнате
local playersInRange = 0
-- имеет смысл считать, если найдено не менее двух игроков
if #players >= 2 then
  -- перебираем всех найденных игроков
  for _,player in ipairs(players) do
    -- считаем только игроков в комнате
    if player.distance <= 7 then
      playersInRange = playersInRange + 1
      -- останавливаем пребор, если значение счётчика достаточно для срабатывания условия
      if playersInRange >= 2 then
        break
      end
    end
  end
end

-- принимаем окончательное решение и выводим его на экран
if playersInRange >= 2 then
  ...
else
  ...
end

Работоспособность кода я не проверял, т.к. основной моей целью было показать именно алгоритм.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...