Visitante!
Faça seu Login ou Registre-se!

Galeria de Jogos

Snippets - Venha treinar sua lógica! 12 Respostas | 445 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Raizen

  • *
  • Mensagens: 2481 Ouro: 1868

    Vencedor CRM Awards - Melhor Scripter Vencedores das edições do Concurso Projeto Rickas!

    • Ver perfil
    • E-mail
Snippets - Venha treinar sua lógica!
Online: 10 Mar 2017, 11:43

O que são
Snippets são pequenos trechos de código que tem como principal objetivo o reuso. Um snippet serve para economizar o tempo tendo funções pré-definidas, snippets também são comumente criadas na aprendizagem de programação. Em geral os snippets por serem menores e mais diretos, é muito bom se eles forem mais eficientes possíveis. Exemplos de snippets:
  • Somar números em uma array
  • retornar os números primos
  • retornar o próximo número par
  • Criar uma área circular
Objetivo do tópico
O objetivo do tópico é que criem e coloquem os snippets que criaram, assim podemos aumentar o nosso banco de snippets. Desse modo os desenvolvedores podem buscar snippets que já estão prontos nesse tópico, e esse tópico também tem como intuito avaliação dos snippets para melhorar a performance deles, se quiser ser avaliado por um snippet, basta pedir na resposta ao mandar o snippet para avaliarem.

Ruby
Somar Números na Array
Autor: Raizen
Descrição:O script soma valores dentro de uma array, depois de declarado a array basta usar o método sum
Código: [Selecionar]
# [1, 2, 3, 5].sum
class Array
  def sum
    add = 0
    self.each {|interator| add += interator }
    return add
  end
end
[close]
Word Wrapper
Autor: Alisson
Descrição: O Word Wrap serve para você obter um texto com quebra de linha (\n) caso ele ultrapasse a largura definida.
Código: [Selecionar]
def wrap_text(text, width)
  bitmap = Bitmap.new(width, 24)
  result = ""
  words = text.split(" ")
  pointer = 0
  for w in words
    word_width = bitmap.text_size(w).width
    space_width = bitmap.text_size(" ").width
    if pointer < width
      if pointer + word_width > width
        result << "\n" << w << " "
        pointer = word_width + space_width
      else
        result << w << " "
        pointer += word_width + space_width
      end
    else
      result << "\n" << w << " "
      pointer = word_width + space_width
    end
  end
  return result
end
[close]
Distancia Entre 2 pontos
Autor:Raizen
Descrição: Mede a distancia entre 2 coordenadas
Código: [Selecionar]
def distanceBetweenPoints(x, y, x2, y2)
  Math.sqrt((x2-x)**2 + (y2-y)**2)
end
[close]
Numero Primo
Autor:Raizen
Descrição: Valida se um número é primo ou não
Código: [Selecionar]
class Integer
def isPrime?
self.times.count {|num| self % (num + 1) == 0} < 3
end
end
[close]

JavaScript
Word Wrapper
Autor: Alisson
Descrição: O Word Wrap serve para você obter um texto com quebra de linha (\n) caso ele ultrapasse a largura definida.
Código: [Selecionar]
function WrapText (text, width) {
    var bitmap = new Bitmap(width, 28);
    var result = "";
    var words = text.split(" ");
    var pointer = 0;
    for (var element of words) {
        var wordWidth = bitmap.measureTextWidth(element);
        var spaceWidth = bitmap.measureTextWidth(" ");
        if (pointer < width) {
            if (pointer + wordWidth > width) {
                result += "\n";
                pointer = 0;
                result += element;
                result += " ";
                pointer += wordWidth + spaceWidth;
            } else {
                result += element;
                result += " ";
                pointer += wordWidth + spaceWidth;
            }
        } else {
            result += "\n";
            pointer = 0;
            result += element;
            result += " ";
            pointer += wordWidth + spaceWidth;
        }
    }
    return result;
};
[close]


Para mandar um snippet, pode usar o template abaixo:

[spoiler=NomeDoSnippet][code]#Autor: Seu Nome
# O que faz o snippet
Seu código
[/code][/spoiler]
« Última modificação: 10 Mar 2017, 16:55 por Raizen »

Alisson

  • *
  • Mensagens: 3005 Ouro: 2102

    Vencedor CRM Awards - Melhor Mapper Vencedor do Evento Invasão na Fábrica de Brinquedos Vencedor CRM Awards - Melhor Maker Participantes do Maps Together 2

  • See, I'm not slacking, I'm patrolling... really~
    • Unity
    • Facebook
    • Steam
    • Youtube
    • Ver perfil
    • E-mail
  • Dragon ScalesPhoenixEspada CRMBreaklance
Snippets - Venha treinar sua lógica!
Resposta 1 Online: 10 Mar 2017, 14:13
Direto do meu core.
Word Wrap
Autor: Alisson
Descrição: O Word Wrap serve para você obter um texto com quebra de linha (\n) caso ele ultrapasse a largura definida.
Código: [Selecionar]
def wrap_text(text, width)
  bitmap = Bitmap.new(width, 24)
  result = ""
  words = text.split(" ")
  pointer = 0
  for w in words
    word_width = bitmap.text_size(w).width
    space_width = bitmap.text_size(" ").width
    if pointer < width
      if pointer + word_width > width
        result << "\n" << w << " "
        pointer = word_width + space_width
      else
        result << w << " "
        pointer += word_width + space_width
      end
    else
      result << "\n" << w << " "
      pointer = word_width + space_width
    end
  end
  return result
end

Depois eu mando mais \o/
« Última modificação: 10 Mar 2017, 14:16 por Alisson »




Raizen

  • *
  • Mensagens: 2481 Ouro: 1868

    Vencedor CRM Awards - Melhor Scripter Vencedores das edições do Concurso Projeto Rickas!

    • Ver perfil
    • E-mail
Snippets - Venha treinar sua lógica!
Resposta 2 Online: 10 Mar 2017, 16:48
Adicionado  :wow: , muito bom esse ai heim.

Adicionei 2 meus também que fiz aqui porque quando tenho tempo no trabalho e não posso abrir nada suspeito hahah, isso parece que estou programando algo importante  :derp:

Distância entre 2 pontos
Código: [Selecionar]
def distanceBetweenPoints(x, y, x2, y2)
  Math.sqrt((x2-x)**2 + (y2-y)**2)
end

Número Primo
Código: [Selecionar]
class Integer
  def isPrime?
    self.times.count {|num| self % (num + 1) == 0} < 3
  end
end

Alisson

  • *
  • Mensagens: 3005 Ouro: 2102

    Vencedor CRM Awards - Melhor Mapper Vencedor do Evento Invasão na Fábrica de Brinquedos Vencedor CRM Awards - Melhor Maker Participantes do Maps Together 2

  • See, I'm not slacking, I'm patrolling... really~
    • Unity
    • Facebook
    • Steam
    • Youtube
    • Ver perfil
    • E-mail
  • Dragon ScalesPhoenixEspada CRMBreaklance
Snippets - Venha treinar sua lógica!
Resposta 3 Online: 10 Mar 2017, 16:53
Versão do Word Wrap para Javascript.
Word Wrap
Autor: Alisson
Descrição: O Word Wrap serve para você obter um texto com quebra de linha (\n) caso ele ultrapasse a largura definida.
Código: [Selecionar]
function WrapText (text, width) {
    var bitmap = new Bitmap(width, 28);
    var result = "";
    var words = text.split(" ");
    var pointer = 0;
    for (var element of words) {
        var wordWidth = bitmap.measureTextWidth(element);
        var spaceWidth = bitmap.measureTextWidth(" ");
        if (pointer < width) {
            if (pointer + wordWidth > width) {
                result += "\n";
                pointer = 0;
                result += element;
                result += " ";
                pointer += wordWidth + spaceWidth;
            } else {
                result += element;
                result += " ";
                pointer += wordWidth + spaceWidth;
            }
        } else {
            result += "\n";
            pointer = 0;
            result += element;
            result += " ";
            pointer += wordWidth + spaceWidth;
        }
    }
    return result;
};

Bacana a distância entre os pontos, tenho que usar isso qualquer dia :D




Alisson

  • *
  • Mensagens: 3005 Ouro: 2102

    Vencedor CRM Awards - Melhor Mapper Vencedor do Evento Invasão na Fábrica de Brinquedos Vencedor CRM Awards - Melhor Maker Participantes do Maps Together 2

  • See, I'm not slacking, I'm patrolling... really~
    • Unity
    • Facebook
    • Steam
    • Youtube
    • Ver perfil
    • E-mail
  • Dragon ScalesPhoenixEspada CRMBreaklance
Snippets - Venha treinar sua lógica!
Resposta 4 Online: 28 Mar 2017, 08:47
Ruby:
Vector Normalization
Autor: Alisson
Descrição: Serve para normalizar uma linha Vector. Em sua forma mais simples, ele pega os pontos x, y e z (caso queira) e normaliza seus valores.
O processo obtém a soma de todos os elementos da linha, e retorna todos os elementos divididos pelo resultado dessa soma.
Código: [Selecionar]
def vector_normalize(x, y, z = nil)
    length = Math.sqrt((x * x) + (y * y) + (z.nil? ? 0 : z * z))
    x /= length
    y /= length
    z /= length if z
    return [x, y, z]
  end

Javascript:
Vector Normalization
Autor: Alisson
Descrição: Serve para normalizar uma linha Vector. Em sua forma mais simples, ele pega os pontos x, y e z (caso queira) e normaliza seus valores.
O processo obtém a soma de todos os elementos da linha, e retorna todos os elementos divididos pelo resultado dessa soma.
Código: [Selecionar]
function vectorNormalize(x, y, z) {
    z = z || null
    var length = Math.sqrt((x * x) + (y * y) + (z === null ? 0 : z * z));
    x /= length;
    y /= length
    if (z) {
        z /= length;
    }
    return [x, y, z];
}



Eu recomendo o uso disso com o snippet da distância entre os pontos, seja lá para o que você for precisar :T




Valentine

  • *
  • Mensagens: 22 Ouro: 22
    • RPG Maker VX/Ace
    • Ver perfil
Snippets - Venha treinar sua lógica!
Resposta 5 Online: 28 Mar 2017, 13:32
Eu também fiz um Word Wrap:
Word Wrap
Autor: Valentine
Descrição: Quebra uma string caso ela ultrapasse a largura definida.
Código: [Selecionar]
def word_wrap(text, width)
  bitmap = Bitmap.new(4, 4)
  return [text] if bitmap.text_size(text).width <= width
  lines = []
  line = ''
  line_size = 0
  text.each_line(' ') do |word|
    word_size = bitmap.text_size(word).width
    if word_size > width
      c = ''
      c_size = 0
      word.each_byte do |i|
        i_size = bitmap.text_size(i.chr).width
        if c_size + i_size <= width
          c << i.chr
          c_size += i_size
        else
          lines << line if line.size > 0
          lines << c
          c = i.chr
          c_size = i_size
          line = ''
        end
      end
      line << c
      next
    end
    if line_size + word_size <= width
      line << word
      line_size += word_size
    else
      lines << line
      line = word
      line_size = word_size
    end
  end
  bitmap.dispose
  lines << line
  return lines
end
[close]

Eu ainda não comparei muito o meu código e o do Alisson, mas apesar de o meu ser um pouco maior e mais lento que o dele, é mais completo. Por exemplo, se eu continuar pressionando a tecla A por um tempo (sem dar espaço), o código do Alisson não quebra a linha, enquanto o meu sim. Veja:


Acredito que o meu Word Wrap seja um pouco mais lento especialmente porque da para fazer a quebra de linha acima e, para isso, eu usei um text_size a mais que o Word Wrap do Alisson.

@Alisson
Em relação ao seu Word Wrap, se o valor de space_width é sempre o mesmo, não seria melhor ele ficar fora do for e não dentro dele?
De todo modo, seu código parece ótimo, parabéns.

@Tópico
Gostei muito do tópico.

+ 1 ouro
« Última modificação: 28 Mar 2017, 15:48 por Valentine »

Alisson

  • *
  • Mensagens: 3005 Ouro: 2102

    Vencedor CRM Awards - Melhor Mapper Vencedor do Evento Invasão na Fábrica de Brinquedos Vencedor CRM Awards - Melhor Maker Participantes do Maps Together 2

  • See, I'm not slacking, I'm patrolling... really~
    • Unity
    • Facebook
    • Steam
    • Youtube
    • Ver perfil
    • E-mail
  • Dragon ScalesPhoenixEspada CRMBreaklance
Snippets - Venha treinar sua lógica!
Resposta 6 Online: 28 Mar 2017, 16:02
Opa, e bota completo nisso, haha'
Em relação ao text_width, creio que a maior falha em ambos seja a criação de um bitmap para medir o tamanho.
Estava programando aqui várias coisas e alterei a fonte do bitmap do meu sprite para um tamanho menor, enquanto sempre que eu usava o word_wrap, ele contava com o tamanho de uma fonte diferente para realizar a quebra de linha.
Por isso na versão do meu aqui (não a do tópico) eu adicionei uma opção de utilizar um bitmap externo como base para medir o tamanho da fonte.
O problema do space_width é em relação a um bug do Ace, onde ele costuma ter um valor de medição estranho e incorreto dentro do método text_size (por isso que eu sempre adiciono um valor a mais no resultado), mas na versão de javascript ele pode ficar fora mesmo.

E sobre ele não quebrar... lol, acho que foi proposital, nem lembro aehuahe
Enfim, ótimo snippet, e realmente bem completo, por sinal. Nós só precisamos aprender a evitar o uso de << pois ele é lento demais pra processar >.>



Quem tiver mais snippets vão mandando, galera. Isso é uma fonte de informação bem valiosa no cenário da programação.




Valentine

  • *
  • Mensagens: 22 Ouro: 22
    • RPG Maker VX/Ace
    • Ver perfil
Snippets - Venha treinar sua lógica!
Resposta 7 Online: 28 Mar 2017, 16:50
Citação de: Alisson
Em relação ao text_width, creio que a maior falha em ambos seja a criação de um bitmap para medir o tamanho.
Estava programando aqui várias coisas e alterei a fonte do bitmap do meu sprite para um tamanho menor, enquanto sempre que eu usava o word_wrap, ele contava com o tamanho de uma fonte diferente para realizar a quebra de linha.
Por isso na versão do meu aqui (não a do tópico) eu adicionei uma opção de utilizar um bitmap externo como base para medir o tamanho da fonte.
No Word Wrap que eu fiz para o Netplay Diamond, eu defino a var bitmap assim:
Código: [Selecionar]
bitmap = self.contents == nil ? Bitmap.new(4, 4) : self.contentsDesse modo, se o Word Wrap estiver sendo usado em uma window e ela já possuir um self.contents declarado, o Word Wrap não cria outro bitmap. Além do mais, ao usar self.contents em vez de criar um novo bitmap em uma window, o text_size leva em consideração o tamanho da fonte da window e não o padrão.

Como eu fiz o Word Wrap para o Netplay Diamond, eu ainda pensei na possibilidade de o jogador digitar mais de um espaço (entre uma palavra e outra) na caixa de texto do bate-papo, então eu usei o each_line em vez de for para que o Word Wrap retorne a quantidade exata de espaços digitados. Veja:


Enfim, é ótimo poder debater isso aqui. Eu pretendo contribuir com o pouco que sei e aprender mais.
« Última modificação: 28 Mar 2017, 22:10 por Valentine »

Nandikki

  • *
  • Mensagens: 1385 Ouro: 644

    Participantes do Maps Together 2

  • Run!
    • Unity
    • Ver perfil
  • NightWalker
Snippets - Venha treinar sua lógica!
Resposta 8 Online: 29 Mar 2017, 11:35
Espero que possa Java, não me excluam...

Soma dos Quadrados
Autor: Nandikki
Descrição: Fiz para um desafio. O método retorna um inteiro que equivale a soma dos quadrados de todos os números de 1 até x. Exemplo: 1² + 2² + 3²...x².
Código: [Selecionar]
static int somaDosQuadrados(int x) {

int soma = 0; //Variável para armazenar o resultado.

for (int i = 1; i <= x; i++) { // x é a quantidade de termos a serem elevados ao quadrado e somados
soma += Math.pow(i,  2);
}

return soma;
}

Quadrado das Somas
Autor: Nandikki
Descrição: Fiz para um desafio. O método retorna um inteiro que equivale o quadrado da soma dos números 1 até x. Exemplo: (1+2+3+4+5+6...+x)².

Código: [Selecionar]
static int quadradoDasSomas(int x) {

int resultado = 0; //Variável para armazenar o resultado

for (int i = 1; i <= x; i++) { // x é a quantidade de termos a serem somados
resultado += i;
}

return (int) Math.pow(resultado, 2); // eleva a soma resultante ao quadrado.
}

Alisson

  • *
  • Mensagens: 3005 Ouro: 2102

    Vencedor CRM Awards - Melhor Mapper Vencedor do Evento Invasão na Fábrica de Brinquedos Vencedor CRM Awards - Melhor Maker Participantes do Maps Together 2

  • See, I'm not slacking, I'm patrolling... really~
    • Unity
    • Facebook
    • Steam
    • Youtube
    • Ver perfil
    • E-mail
  • Dragon ScalesPhoenixEspada CRMBreaklance
Snippets - Venha treinar sua lógica!
Resposta 9 Online: 16 Abr 2017, 03:34
Lerp
Autor: Alisson && aib && Eric
Descrição: Mathf.Lerp é uma maravilha pra quem mexe no Unity, e tendo isso em mente realizei um pequeno teste no RPG Maker.
Basicamente o que o Lerp faz é realizar uma transição suave (interpola) do ponto A até o ponto B pela fração F.
Código: [Selecionar]
def lerp(a, b, f) # A e B precisam ser arrays (vectors) de 2 tamanhos contendo floats. F precisa ser a fração, obviamente em float.
  s = a.size
  return if b.size != s
  x = []
  for i in 0...s
    x.push(a[i] + f * (b[i] - a[i]))
  end
  return x
end

Com o Lerp, você pode fazer algo assim, por exemplo:

Exemplo de código (plug n' play, contanto que seja em um projeto vazio):
Código: [Selecionar]
class Scene_Title < Scene_Base
 
  alias :test_start :start
  def start
    test_start
    @test_sprite = Moving_Sprite.new
    @test_sprite.bitmap = Bitmap.new(24, 24)
    @test_sprite.bitmap.fill_rect(0, 0, 24, 24, Color.new(255, 255, 255, 255))
    @test_sprite.z = 300
    @command_window.deactivate
    @attractor = Attractor.new
  end
 
  alias :test_update :update
  def update
    test_update
    if Input.press?(:RIGHT)
      @attractor.x += 4
    end
    if Input.press?(:LEFT)
      @attractor.x -= 4
    end
    if Input.press?(:UP)
      @attractor.y -= 4
    end
    if Input.press?(:DOWN)
      @attractor.y += 4
    end
    lerp_sprite_pos
    @test_sprite.update
    @attractor.update
  end
 
  def lerp_sprite_pos
    a = [@test_sprite.coord_x, @test_sprite.coord_y]
    b = [@attractor.x, @attractor.y]
    f = 0.05
    res = lerp(a, b, f)
    @test_sprite.coord_x = res[0]
    @test_sprite.coord_y = res[1]
  end
 
  def lerp(a, b, f)
    s = a.size
    return if b.size != s
    x = []
    for i in 0...s
      x.push(a[i] + f * (b[i] - a[i]))
    end
    return x
  end
 
end

class Moving_Sprite < Sprite
  attr_accessor :coord_x
  attr_accessor :coord_y
 
  def initialize(vp = nil)
    super
    @coord_x = 0.0
    @coord_y = 0.0
    update
  end
 
  def update
    super
    self.x = @coord_x
    self.y = @coord_y
  end
 
end

class Attractor
 
  attr_accessor :x
  attr_accessor :y
 
  def initialize
    @x = 0
    @y = 0
    @time = Time.now.sec
    @sprite = Sprite.new
    @sprite.bitmap = Bitmap.new(12, 12)
    @sprite.bitmap.fill_rect(0, 0, 12, 12, Color.new(0, 0, 0, 255))
    @sprite.z = 400
    update
  end
 
  def update
    @sprite.x = @x
    @sprite.y = @y
  end
 
end
« Última modificação: 16 Abr 2017, 04:17 por Alisson »




GabrielMoon

  • *
  • Mensagens: 130 Ouro: 81
  • Destruam as suas rosas, comece uma outra prosa.
    • RPG Maker XP
    • Facebook
    • Twitter
    • Steam
    • Youtube
    • DeviantArt
    • Pinterest
    • Ver perfil
Snippets - Venha treinar sua lógica!
Resposta 10 Online: 25 Mai 2017, 12:20
Código em Lua;
Autor: GabrielMoon / Mochorro / Modog
Ele retorna o valor que você quer saber só tal porcetagem, por exemplo: Tenho 602 e, quero saber quanto ele irá
valer se eu tiver 25% dele. Códigos simples, fácil e também bem fácil de converter para outras linguagens.

Código: [Selecionar]
function porcento(   valor, porcetagem  )

resultado = valor*porcetagem/100

return resultado
end
« Última modificação: 26 Mai 2017, 09:25 por GabrielMoon »

Valentine

  • *
  • Mensagens: 22 Ouro: 22
    • RPG Maker VX/Ace
    • Ver perfil
Snippets - Venha treinar sua lógica!
Resposta 11 Online: 26 Mai 2017, 08:15
Código em Lua;
Ele retorna o valor que você quer saber só tal porcetagem, por exemplo: Tenho 602 e, quero saber quanto ele irá
valer se eu tiver 25% dele. Códigos simples, fácil e também bem fácil de converter para outras linguagens.


Código: [Selecionar]
function porcento(   valor, porcetagem  )

resultado = valor*porcetagem/100

return resultado

end
Não seria melhor definir resultado como uma variável local ou não usá-la, assim:
Código: [Selecionar]
function percent(value, percentage)
  return value * percentage / 100
end
Além do mais, acredito que é sempre bom criar os códigos em inglês, seguindo o design pattern.

GabrielMoon

  • *
  • Mensagens: 130 Ouro: 81
  • Destruam as suas rosas, comece uma outra prosa.
    • RPG Maker XP
    • Facebook
    • Twitter
    • Steam
    • Youtube
    • DeviantArt
    • Pinterest
    • Ver perfil
Snippets - Venha treinar sua lógica!
Resposta 12 Online: 26 Mai 2017, 09:18
Código em Lua;
Ele retorna o valor que você quer saber só tal porcetagem, por exemplo: Tenho 602 e, quero saber quanto ele irá
valer se eu tiver 25% dele. Códigos simples, fácil e também bem fácil de converter para outras linguagens.


Código: [Selecionar]
function porcento(   valor, porcetagem  )

resultado = valor*porcetagem/100

return resultado

end
Não seria melhor definir resultado como uma variável local ou não usá-la, assim:
Código: [Selecionar]
function percent(value, percentage)
  return value * percentage / 100
end
Além do mais, acredito que é sempre bom criar os códigos em inglês, seguindo o design pattern.

É melhor sim, mas pensei no pessoal da comunidade, então, queria deixar algo que só de bater a vista seja
compreensivel e faço de passar para outra linguagem.

 

Versão Mobile