piątek, 18 marca 2016

Arkanoids - left or right

Dzisiaj mała ciekawostka algorytmiczna, którą gdzieś, kiedyś znalazłem. Mianowicie - w przypadku takich gier, jak Arkanoid czy jakiś Allien Invasion, czy inne, w której nasz statek porusza się na boki po ograniczonej polem gry przestrzeni, użycie prostego if-a, sprawdzającego położenie względem boków jest nieefektywne.

Trafiło mi się to w trakcie ćwiczeń nad podobną gierką. Miałem m.in. takie zmienne, jak:
- położenie obiektu
- granice canvasa
- speed.

Kiedy obiekt jest na pozycji np. 1, i ma prędkość -7, to w następnej iteracji powinien znaleźć sie na -6. If teoretycznie zablokuje taką sytuację, ale niestety, bedzie to widać w postaci efektu "tłuczenia" się o barierkę (jak to inaczej sensownie napisać :-) ). Oczywiście będzie to też uzależnione od prędkości odświeżania itp.

Zdecydowanie lepszym rozwiązaniem jest uzależnienie położenia obiektu (obliczonego z wyprzedzeniem), od zwracanej wartości. Jak wygląda taki myk i kod doniego w przypadku JS?

paddleX = Math.max(0, Math.min(paddleX+paddleSpeed, 
      canvas.width-paddleWidth));


Ta linijka akurat definiuje położenie paletki Arkanoida, gdzie paddleX to współrzędne poziome, paddleSpeed to prędkość, a paddleWith to oczywiście szerokość.

W tym konkretnym wypadku nie zaimplementowałem badania kierunku ruchu, co wymusza zastosowanie drugiej linii z ujemnym paddleSpeed. Niemniej idea jest ta sama.


paddleX = Math.max(0, Math.min(paddleX-paddleSpeed,
      canvas.width-paddleWidth));

Zależnie od położenia obiektu zwracamy odpowiednią wartość, która staje się jego współrzędną.

czwartek, 3 marca 2016

Fizz Buzz - test



Przeglądając sobie filmik #DamianWielgosik na temat wejścia we frontend na YT dowiedziałem się o zadaniu programistycznym, w zasadzie algorytmie "testowym", którego podobno wiele osób aspirujących nie jest w stanie zakodować.

Chodzi o Fizz Buzz. Na blogu Codding Horror czytam, że

An example of a Fizz-Buzz question is the following:
Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz".
Most good programmers should be able to write out on paper a program which does this in a under a couple of minutes. Want to know something scary? The majority of comp sci graduates can't. I've also seen self-proclaimed senior programmers take more than 10-15 minutes to write a solution.

Postanowiłem natychmiast zmierzyć się z tym problemem. Zajął mi całe... 3-5 minut, chociaż naturalnie miałem ten komfort, że mogłem skompilować raz czy dwa, by sprawdzić działanie kodu, który u mnie wygląda tak:



Lub, jak kto woli, tekstem:

public class FizzBuzz {

 public FizzBuzz() {
  
  for (int i=1; i<101; i++) {
   
   if ((i%3)==0 && (i%5)==0) {
    System.out.println(i + " Fizz Buzz");
   } else if ((i%3)==0) {
    System.out.println(i + " Fizz");
   } else if ((i%5)==0) {
    System.out.println(i + " Buzz");
   } else System.out.println(i);   
  }  
 }
 
}

Wynik działania:

1
2
3 Fizz
4
5 Buzz
6 Fizz
7
8
9 Fizz
10 Buzz
11
12 Fizz
13