Hallo lieber Programmierer,
Für meine Prüfung muss ich mit der objektorientierten Programmiersprache Ruby "Tetris" entwickeln, welches auf der "Shoes" Konsole laufen soll. Nun habe ich ein Spielfeld definiert, und es fällt schon ein erster Block herunter und bleibt auch im Spielfeld (fällt also nicht aus dem Fenster heraus).
Nun ist meine Frage, wie ich es schaffe einen neuen Spielstein ins Feld zu bekommen und dann den ersten Spielstein nicht mehr bewegen kann.
Der bisherige Code:
class TetrisI
def initialize
@form = [
[1,0,0,0],
[1,0,0,0],
[1,0,0,0],
[1,0,0,0]
]
@form2= [
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[1,1,1,1]
]
@farbe ="#ffd700"
end
def get_form
return @form
end
def get_form2
return @form2
end
def get_farbe
return @farbe
end
end
-------Spielfeld-------
Shoes.app width: 230, height: 450 do
background "#848484" b=20 #Breite Kästchen n=9 # Spalten m=20 #Zeilen RAND=0
$feld = Array.new(m) {Array.new(n) {|f| f=0 }}
m.times do |i| n.times do |j| fill green rect(jb+20, ib+20, b, b) end end
-----klotz anzeigen-----
klotz = TetrisI.new form = klotz.get_form
anzahl_zeilen = form.length
anzahl_spalten = form[0].length # an der Arraystelle 0
@stack=stack left: 80, top: 0 do
anzahl_zeilen.times do |y|
anzahl_spalten.times do |x|
if form[y][x]>0 then
fill klotz.get_farbe # klotz weil ganzes Steinchen
rect(x*b+20, y*b+20, b, b)
end
end
end
end
Schnelligkeit Klotz, bewegung rechts/links, Rand rechts/links/unten
x = 80
y = 20
speed = 20
@animation = animate(4) do |i|
y += speed
if x>= 160 then
x=160
end
if x<=0 then
x=0
end
@stack.move(x, y)
#Prüfen ob Stein am Ende liegen bleibt und sich nicht mehr bewegt
if y >= height() -120 then
@animation.stop
end
if y >= height() -120 then
animation.locked
end
end
RAND_links = 20 RAND_rechts = 160
#Keypress - Event keypress do |k| case k when :left then
x=x-20 if x<=0 then x=0 end @stack.move(x, y)
when :right then
x= x+20
if x>= 160 then
x=160
end
@stack.move(x, y)
when:up then
@stack.clear
@stack.append do
form = klotz.get_form2
anzahl_zeilen = form.length
anzahl_spalten = form[0].length # an der Arraystelle 0
anzahl_zeilen.times do |y|
anzahl_spalten.times do |x|
if form[y][x]>0 then
fill klotz.get_farbe # klotz weil ganzes Steinchen
rect(x*b+20, y*b+20, b, b)
end
end
end
end
end
end
end