G.Durga Prasad
11/1/2004 11:41:00 AM
On Fri, 29 Oct 2004 22:19:03 +0900, Florian Gross <flgr@ccan.de> wrote:
> Ruby Quiz wrote:
>
> > This week's quiz is to implement the game of Sokoban with the interface of your
> > choosing and any extra features you would like to have.
>
Thank you for causing me to write my first ever game programme in any language.
I am including my solution here. (I don't know any better way }. I
could solve using the Curses Library example given in Pickaxe II
book.
# solution to [QUIZ] Sokoban (#5)
# G.D.Prasad , 1st Nov , 04 , 5.00 PM
# run as ---- ruby sokoban.rb sokobangame
#file sokoban.rb
require 'curses'
include Curses
$a= []
i=0
file = File.new(ARGV[0],"r")
while line =file.gets
lineArr=line.split("")
$a << lineArr
if lineArr.include?("@")
$x= lineArr.index("@")
$y= i
end
i += 1
end
$M = '@'
$C='o'
$W='#'
$F= " "
$S='.'
$CS='*'
$MS='+'
class Store
HEIGHT = 10
STORE =$a
def initialize
@top = (Curses::lines - HEIGHT)/2
draw
end
def left
$x=STORE[$y].index("@") || STORE[$y].index("+")
temp=STORE[$y][$x-1]
case temp
when $F
if STORE[$y][$x-1,2]==[$F,$M]
STORE[$y][$x-1,2]=[$M,$F]
elsif STORE[$y][$x-1,2]==[$F,$MS]
STORE[$y][$x-1,2]=[$M,$S]
end
when $C
if STORE[$y][$x-2] == $F
STORE[$y][$x-2,3]=[$C,$M,$F]
elsif STORE[$y][$x-2] == $S
STORE[$y][$x-2,3]=[$CS,$M,$F]
end
when $CS
if STORE[$y][$x-2,3] == [$S,$CS,$M]
STORE[$y][$x-2,3]=[$CS,$M,$F]
end
when $S
if STORE[$y][$x-2,3]==[$S,$S,$M]
STORE[$y][$x-2,3]=[$S,$MS,$F]
elsif STORE[$y][$x-1,2]==[$S,$MS]
STORE[$y][$x-1,2]=[$MS,$S]
else
STORE[$y][$x-1,2]=[$MS,$F]
end
else beep
end
end
def right
$x=STORE[$y].index("@") || STORE[$y].index("+")
temp=STORE[$y][$x+1]
case temp
when $F
if STORE[$y][$x,2]==[$M,$F]
STORE[$y][$x,2]=[$F,$M]
elsif STORE[$y][$x,2]==[$MS,$F]
STORE[$y][$x,2]=[$S,$M]
end
when $C
if STORE[$y][$x+2] == $F
STORE[$y][$x,3]=[$F,$M,$C]
elsif STORE[$y][$x+2] == $S
STORE[$y][$x,3]=[$F,$M,$CS]
end
when $CS
if STORE[$y][$x,3] == [$M,$CS,$S]
STORE[$y][$x,3]=[$F,$MS,$CS]
end
when $S
if STORE[$y][$x,3]==[$M,$S,$S]
STORE[$y][$x,3]=[$F,$MS,$S]
elsif STORE[$y][$x,2]==[$MS,$S]
STORE[$y][$x,2]=[$S,$MS]
elsif STORE[$y][$x,2]==[$M,$S]
STORE[$y][$x,2]=[$F,$MS]
end
else beep
end
end
def up
$x=STORE[$y].index("@") || STORE[$y].index("+")
temp=STORE[$y-1][$x]
case temp
when $F
if [ STORE[$y][$x],STORE[$y-1][$x] ]==[$M,$F]
STORE[$y][$x],STORE[$y-1][$x]=$F,$M
$y -= 1
elsif [ STORE[$y][$x],STORE[$y-1][$x] ]==[$MS,$F]
STORE[$y][$x],STORE[$y-1][$x]=$S,$M
$y -= 1
end
when $C
if STORE[$y-2][$x] == $F
STORE[$y][$x],STORE[$y-1][$x],STORE[$y-2][$x]=$F,$M,$C
$y -= 1
elsif STORE[$y-2][$x] == $S
STORE[$y][$x],STORE[$y-1][$x],STORE[$y-2][$x]=$F,$M,$CS
$y -= 1
end
when $CS
if [STORE[$y][$x],STORE[$y-1][$x],STORE[$y-2][$x]]==
[$M,$CS,$S]
STORE[$y][$x],STORE[$y-1][$x],STORE[$y-2][$x]=$F,$MS,$CS
$y -= 1
elsif
[STORE[$y][$x],STORE[$y-1][$x],STORE[$y-2][$x]]== [$MS,$CS,$S]
STORE[$y][$x],STORE[$y-1][$x],STORE[$y-2][$x]=$S,$MS,$CS
$y -= 1
end
when $S
if [STORE[$y][$x],STORE[$y-1][$x],STORE[$y-2][$x]]==[$M,$S,$S]
STORE[$y][$x],STORE[$y-1][$x],STORE[$y-2][$x]=$F,$MS,$S
$y -= 1
elsif [STORE[$y][$x],STORE[$y-1][$x]]==[$MS,$S]
STORE[$y][$x],STORE[$y-1][$x]=$S,$MS
$y -= 1
elsif [STORE[$y][$x],STORE[$y-1][$x]]==[$M,$S]
STORE[$y][$x],STORE[$y-1][$x]=$F,$MS
$y -= 1
end
else beep
end
end
def down
$x=STORE[$y].index("@") || STORE[$y].index("+")
temp=STORE[$y+1][$x]
case temp
when $F
if [ STORE[$y][$x],STORE[$y+1][$x] ]==[$M,$F]
STORE[$y][$x],STORE[$y+1][$x]=$F,$M
$y += 1
elsif [ STORE[$y][$x],STORE[$y+1][$x] ]==[$MS,$F]
STORE[$y][$x],STORE[$y+1][$x]=$S,$M
$y += 1
end
when $C
if STORE[$y+2][$x] == $F
STORE[$y][$x],STORE[$y+1][$x],STORE[$y+2][$x]=$F,$M,$C
$y += 1
elsif STORE[$y+2][$x] == $S
STORE[$y][$x],STORE[$y+1][$x],STORE[$y+2][$x]=$F,$M,$CS
$y += 1
end
when $CS
if [STORE[$y][$x],STORE[$y+1][$x],STORE[$y+2][$x]]==
[$M,$CS,$S]
STORE[$y][$x],STORE[$y+1][$x],STORE[$y+2][$x]=$F,$MS,$CS
$y += 1
end
when $S
if [STORE[$y][$x],STORE[$y+1][$x],STORE[$y+2][$x]]==[$M,$S,$S]
STORE[$y][$x],STORE[$y+1][$x],STORE[$y+2][$x]=$F,$MS,$S
$y += 1
elsif [STORE[$y][$x],STORE[$y+1][$x]]==[$MS,$S]
STORE[$y][$x],STORE[$y+1][$x]=$S,$MS
$y += 1
elsif [STORE[$y][$x],STORE[$y+1][$x]]==[$M,$S]
STORE[$y][$x],STORE[$y+1][$x]=$F,$MS
$y += 1
end
else beep
end
end
def draw
setpos(@top-1, 0)
addstr(STORE.to_s)
refresh
end
end
init_screen
begin
crmode
noecho
stdscr.keypad(true)
store = Store.new
loop do
case getch
when ?Q, ?q : break
when Key::LEFT : store.left
when Key::RIGHT : store.right
when Key::UP : store.up
when Key::DOWN : store.down
else beep
end
store.draw
end
ensure
close_screen
end
---------------------------------------
#file sokobangame
#####
# #
#o #
### o##
# o o #
### # ## # ######
# # ## ##### ..#
# o o ..#
##### ### #@## ..#
# #########
#######