Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Jak nakłonić input() do przyjmowania wyłącznie cyfr?


DrComet

Rekomendowane odpowiedzi

Opublikowano

Witam, jak w temacie. W jaki sposób zdefiniować dany input, żeby przyjmował wyłącznie liczby?

 

Przykład:

local opcja0 = item.get_vnum()
local opcja1 = pc.count_item(opcja0)
local opcja2 = input()

local oblicz = opcja1 - opcja2

local wybor = select("Podaj wynik", "JakasInnaOpcja")

if wybor == 1 then

   say("opcja1: "..opcja1..".")
   say("opcja2: "..opcja2..".")
   say("oblicz: "..oblicz..".")
   say("Zrobione!")

elseif wybor == 2 then
   cośtamcośtam...

Powyższy przykład odnosi się do upuszczenia na coś przedmiotów. Czyli np upuszczam na kamień 20 miksturek życia, wyskakuje mi okno z opcjami. Następnie wykonuję obliczenie pomiędzy ilością upuszczonych miksturek a wartością, którą wprowadzam w input. I teraz moim problemem jest to, że nie potrafię ograniczyć inputu, by przyjmował wyłącznie wartości w postaci liczb. Czyli jak sobie wpiszę ,,asdasd" to skrypt mnie wywali z questa. No niby ok, ale wolałbym dodać jakiś komunikat, że trzeba podać wartość liczbową.

 

Liczę na szybką pomoc ;)

 

Pozdrawiam,

DrComet

.:Projekt Deatria:.

Serwer:   [|---------]

Klient:     [|---------]

Strona:   [||--------]

Opublikowano

Hmm, input jest odbierany jako string więc funkcja type() raczej nic nie da.

function table_is_in(self, test)
	for i = 1, table.getn(self) do
		if self[i] == test then
			return true
		end
	end
	return false
end

function IsValid(x)
	local tab = {}
	for i = 0,9 do
		table.insert(tab, tostring(i))
	end
	
	for i = 1, string.len(x) do
		if table_is_in(tab, string.sub(x, i, i)) == false then
			return false
		end
	end
	return false
end

I potem dajesz tak:

local x = input()
if IsValid(x) == false then
	say("Nie podano liczby.")
	return
end

Nie wiem czy można by to zrobić łatwiej, szybciej - jebie mnie to, ważne że zadziała. xD

 

Opublikowano

Sprawdzę to i dam znać jak poszło :D

 

@edit: Hmm... Skompilowało się poprawnie, ale z jakiejś przyczyny przestał działać quest. Zatrzymuje się po wpisaniu wartości w input.

 

Tak wygląda fragment kodu, gdzie zaimplementowałem funkcje:

 

elseif wybor2 == 2 then
                    
                    function table_is_in(self, test)
                        for i = 1, table.getn(self) do
                            if self[i] == test then
                                return true
                            end
                        end
                        return false
                    end
                    
                    function IsValid(x)
                        local tab = {}
                        for i = 0,9 do
                            table.insert(tab, tostring(i))
                        end
                        
                        for i = 1, string.len(x) do
                            if table_is_in(tab, string.sub(x, i, i)) == false then
                                return false
                            end
                        end
                        return false
                    end
                
                
                    say("Handlarz Różności:")
                    say_title("Ta opcja pozwala ustalić ile przedmiotów chcesz usunąć.")
                    say_reward("Przykład: Jeżeli masz kilka stacków kamieni i przeciągniesz")
                    say_reward("jeden z nich, będziesz mógł wybrać jaką ilość mam usunąć.")
                    say("Posiadasz "..item.get_name().." w ilości "..pc.count_item(id)..".")
                    say_title("Podaj ilość.")
                    
                    local opcja = input()
                    
                    if IsValid(x) == false then
                        say("Nie podano liczby!")
                        return
                    end
                    
                    say("Czy na pewno chcesz je usunąć?")
                    local dalej = select("Tak, napewno", "Rezygnuję...")
                    
                    local ilosc = pc.count_item(id)
                    
                    local roznica = ilosc - opcja
                    
                    if dalej == 2 then
                        return
                    elseif dalej == 1 and roznica >= 0 then
                        say("ilosc: "..ilosc..".")
                        say("opcja: "..opcja..".")
                        say("roznica: "..roznica..".")
                        say("Zrobione")
                        pc.remove_item(id, opcja)
                    else
                        say("Nie posiadasz tylu przedmiotó!")
                        return
                    end
                    
                elseif wybor2 == 3 then
                    return
                end

Pozdrawiam,

DrComet

.:Projekt Deatria:.

Serwer:   [|---------]

Klient:     [|---------]

Strona:   [||--------]

Opublikowano

dodaj te funkcje do questlib.lua i wtedy spróbuj skompilować od nowa questa itd

 

swoją drogą popraw w funkcji IsValid drugi return na return true xD

 

Opublikowano

Tak coś mi właśnie nie pasowało, że 2x return false :P Dodałem te funkcje do questlib oraz quest_function i skompilowałem questa, i dalej mam to samo :/

 

 

Pozdrawiam,

DrComet

.:Projekt Deatria:.

Serwer:   [|---------]

Klient:     [|---------]

Strona:   [||--------]

Opublikowano

W takim razie muszę przejrzeć kod... Pierwsza część działa bez zarzutu, nie działa tylko podany przeze mnie fragment... Swoją drogą, dlaczego nie używasz w tym przykładzie funkcji table_is_in?

.:Projekt Deatria:.

Serwer:   [|---------]

Klient:     [|---------]

Strona:   [||--------]

Opublikowano

W takim razie muszę przejrzeć kod... Pierwsza część działa bez zarzutu, nie działa tylko podany przeze mnie fragment... Swoją drogą, dlaczego nie używasz w tym przykładzie funkcji table_is_in?

Mam ją po prostu w questlibie już. ;p

 

Opublikowano

I tak w sumie zauważyłem, że jednej istotnej rzeczy brakuje. Mianowicie nie ma funkcji/warunku dotyczących pustego pola. Czyli mogę sobie zostawić puste pole i i tak otrzymam jakiś wynik. Jak zatem sprawdzić, czy pole jest puste czy nie?

.:Projekt Deatria:.

Serwer:   [|---------]

Klient:     [|---------]

Strona:   [||--------]

Opublikowano
nie prościej tak?



local x = input()
if tonumber(x) == nil or tonumber(x) < 1 then
say("Wpisałeś niepoprawną liczbę.")
return


Opublikowano

Okej, zatem mam od Was zestaw potrzebnych mi rzeczy. Ostatecznie skorzystam z porady @TM-r3acT ale od Ciebie @Endymion także się conieco nauczyłem :D Dziękuję bardzo za Waszą dotychczasową pomoc!

 

 

Pozdrawiam,

DrComet

.:Projekt Deatria:.

Serwer:   [|---------]

Klient:     [|---------]

Strona:   [||--------]

Opublikowano

Trochę minęło od ostatniego posta, więc mam nadzieję, że nie zostanie to uznane za double post.

 

Zapomniałem o jednej równie istotnej rzeczy, mianowicie, jak zrobić wykluczenie znaków w inpucie? Bo teraz np mogę sobie wpisać spację albo kilka spacji i też mnie przepuści, a to byłoby... Złe. Nie wspominając już o innych znakach jak np wykrzykniki itd. Teraz w innym skrypcie używam tostring(), ale chciałbym ograniczyć się do możliwości używania wyłącznie znaków typu litera.

 

Pozdrawiam,

DrComet

.:Projekt Deatria:.

Serwer:   [|---------]

Klient:     [|---------]

Strona:   [||--------]

Opublikowano

Trochę minęło od ostatniego posta, więc mam nadzieję, że nie zostanie to uznane za double post.

 

Zapomniałem o jednej równie istotnej rzeczy, mianowicie, jak zrobić wykluczenie znaków w inpucie? Bo teraz np mogę sobie wpisać spację albo kilka spacji i też mnie przepuści, a to byłoby... Złe. Nie wspominając już o innych znakach jak np wykrzykniki itd. Teraz w innym skrypcie używam tostring(), ale chciałbym ograniczyć się do możliwości używania wyłącznie znaków typu litera.

 

Pozdrawiam,

DrComet

string.find
Opublikowano

Sprawdzę to i dam znać jak poszło :D

 

@edit: Hmm... Skompilowało się poprawnie, ale z jakiejś przyczyny przestał działać quest. Zatrzymuje się po wpisaniu wartości w input.

 

Tak wygląda fragment kodu, gdzie zaimplementowałem funkcje:

 

 

elseif wybor2 == 2 then
                    
                    function table_is_in(self, test)
                        for i = 1, table.getn(self) do
                            if self[i] == test then
                                return true
                            end
                        end
                        return false
                    end
                    
                    function IsValid(x)
                        local tab = {}
                        for i = 0,9 do
                            table.insert(tab, tostring(i))
                        end
                        
                        for i = 1, string.len(x) do
                            if table_is_in(tab, string.sub(x, i, i)) == false then
                                return false
                            end
                        end
                        return false
                    end
                
                
                    say("Handlarz Różności:")
                    say_title("Ta opcja pozwala ustalić ile przedmiotów chcesz usunąć.")
                    say_reward("Przykład: Jeżeli masz kilka stacków kamieni i przeciągniesz")
                    say_reward("jeden z nich, będziesz mógł wybrać jaką ilość mam usunąć.")
                    say("Posiadasz "..item.get_name().." w ilości "..pc.count_item(id)..".")
                    say_title("Podaj ilość.")
                    
                    local opcja = input()
                    
                    if IsValid(x) == false then
                        say("Nie podano liczby!")
                        return
                    end
                    
                    say("Czy na pewno chcesz je usunąć?")
                    local dalej = select("Tak, napewno", "Rezygnuję...")
                    
                    local ilosc = pc.count_item(id)
                    
                    local roznica = ilosc - opcja
                    
                    if dalej == 2 then
                        return
                    elseif dalej == 1 and roznica >= 0 then
                        say("ilosc: "..ilosc..".")
                        say("opcja: "..opcja..".")
                        say("roznica: "..roznica..".")
                        say("Zrobione")
                        pc.remove_item(id, opcja)
                    else
                        say("Nie posiadasz tylu przedmiotó!")
                        return
                    end
                    
                elseif wybor2 == 3 then
                    return
                end

Pozdrawiam,

DrComet

Panie Lamo, kończy się quest po wpisaniu, ponieważ dałeś:

 

 if IsValid(x) == false then

zamiast

[/code] if IsValid(opcja) == false then[/code]

w syserr powinieneś dostać jakaś informacje.

Opublikowano

 

Sprawdzę to i dam znać jak poszło :D

 

@edit: Hmm... Skompilowało się poprawnie, ale z jakiejś przyczyny przestał działać quest. Zatrzymuje się po wpisaniu wartości w input.

 

Tak wygląda fragment kodu, gdzie zaimplementowałem funkcje:

 

 

elseif wybor2 == 2 then
                    
                    function table_is_in(self, test)
                        for i = 1, table.getn(self) do
                            if self[i] == test then
                                return true
                            end
                        end
                        return false
                    end
                    
                    function IsValid(x)
                        local tab = {}
                        for i = 0,9 do
                            table.insert(tab, tostring(i))
                        end
                        
                        for i = 1, string.len(x) do
                            if table_is_in(tab, string.sub(x, i, i)) == false then
                                return false
                            end
                        end
                        return false
                    end
                
                
                    say("Handlarz Różności:")
                    say_title("Ta opcja pozwala ustalić ile przedmiotów chcesz usunąć.")
                    say_reward("Przykład: Jeżeli masz kilka stacków kamieni i przeciągniesz")
                    say_reward("jeden z nich, będziesz mógł wybrać jaką ilość mam usunąć.")
                    say("Posiadasz "..item.get_name().." w ilości "..pc.count_item(id)..".")
                    say_title("Podaj ilość.")
                    
                    local opcja = input()
                    
                    if IsValid(x) == false then
                        say("Nie podano liczby!")
                        return
                    end
                    
                    say("Czy na pewno chcesz je usunąć?")
                    local dalej = select("Tak, napewno", "Rezygnuję...")
                    
                    local ilosc = pc.count_item(id)
                    
                    local roznica = ilosc - opcja
                    
                    if dalej == 2 then
                        return
                    elseif dalej == 1 and roznica >= 0 then
                        say("ilosc: "..ilosc..".")
                        say("opcja: "..opcja..".")
                        say("roznica: "..roznica..".")
                        say("Zrobione")
                        pc.remove_item(id, opcja)
                    else
                        say("Nie posiadasz tylu przedmiotó!")
                        return
                    end
                    
                elseif wybor2 == 3 then
                    return
                end

Pozdrawiam,

DrComet

Panie Lamo, kończy się quest po wpisaniu, ponieważ dałeś:

 if IsValid(x) == false then

zamiast

[/code] if IsValid(opcja) == false then[/code]

w syserr powinieneś dostać jakaś informacje.

 

Panie ,,szybki jak wiatr", gdybyś przeczytał dalsze posty, zauważyłbyś, że dawno to poprawiłem :) Naturalnie łatwo jest wydedukować, że quest jest w pełni sprawny, skoro niczego więcej tu nie pisałem.

.:Projekt Deatria:.

Serwer:   [|---------]

Klient:     [|---------]

Strona:   [||--------]

Opublikowano

Sorki że się wtrącę, można by jakoś napisać podobną funkcje do input(), ale taką która np działa jak opcje wyboru?

Nie rozumiem?

 

Opublikowano

 

Sorki że się wtrącę, można by jakoś napisać podobną funkcje do input(), ale taką która np działa jak opcje wyboru?

Nie rozumiem?

 

11834512162931257117.png

Lub coś jak Radio w html'u

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...