rotate values in array

Blitz3D Forums/Blitz3D Programming/rotate values in array

Rook Zimbabwe(Posted 2004) [#1]
Lets say that you anve an array like this and you want to rotate it...
;dim the array
dim fruit(9)

for i =  0 to 9
   whatever = rand(3)
      fruit (i)=whatever
next i
; array is full


now you can read the array by simply looking at address and assigning a variable to it: G=fruit(#)

but how do you ratate values in the array? Like a slot machine?


Warren(Posted 2004) [#2]
By hand. For example, move all the elements down by one and move the bottom one to the top. There's no automated way to handle this...


WolRon(Posted 2004) [#3]
Dim fruit(9)

;rotate
temp = fruit(0)
for iter = 0 to 8
  fruit(iter) = fruit(iter + 1)
next
fruit(9) = temp



GW(Posted 2004) [#4]
Why not just use types? then you can Insert first after last whatever.


Gabriel(Posted 2004) [#5]
Why rotate the values at all? Couldn't you have three variables, one for each reel, which identifies which slot on the reel is currently front-center.


boomboom(Posted 2004) [#6]
sybixsus, but then your mothod doesn't allow nudges etc


Rook Zimbabwe(Posted 2004) [#7]
Types would be good. I don't know enough about them to be able to read a specific type value though... as I read it you can use first,last, next, before... What if I wanted to read the seventh type value and determine what info it holds??? or if I wanted to compare the seventh type value and all its fields with the 19th type value and all its fields??? As it is I am going to have 9 rows or 9 shjowing and simply check for 3 across by comparing row positions for equal value.

I see wolrons idea. I was thinking I had to set up a temp value and pass the values between. then as a ZERO comes up the setuprow function would fill in a new value.


MSW(Posted 2004) [#8]
Another way is to store a offset value...something like:


;some function calls
;each "rolls" the array, or at least gives the impression it does

fruitroll(3)
fruitroll(7)
fruitroll(1)



;now the function

FUNCTION fruitroll(offset%)


 FOR i = 0 TO 9

  temp = ABS( ( i + offset ) MOD 10 )
     
  value = fruit(temp)
   ;now you can print the value, display the graphic value..whatever

 NEXT

END FUNCTION


all you would need to do is keep track of a value indicateing the number of array spaces that have been rolled (note this number can be negative too...as long as it's an integer)

say you have:

 ;just setting a value here
rolls = 45829

 ;the exact array value at that location
value1 = fruit( ABS( rolls MOD 10 ) )

 ;the array value two spaces below it, in terms of a slot machine
value2 = fruit( ABS( ( rolls + 2 ) MOD 10 ) )


;if you wish you can stick the math stuff into a function

FUNCTION fruitindex(value%)
 
RETURN ABS( value MOD 10 )

END FUNCTION


 ;then its just a matter of calling it

value1 = fruit( fruitindex( rolls ) )

value3 = fruit( fruitindex( rolls - 37 ) )
 
 ;etc..


for such a small array, actually moveing the data around isn't such a big deal...but when you get into larger arrays, and wish to "roll" them very often it can slow things down considerably.


Jeroen(Posted 2004) [#9]
look it up in the forums. I asked this question earlier, and arrays CAN be rotated.


WolRon(Posted 2004) [#10]
Why rotate the values at all? Couldn't you have three variables, one for each reel, which identifies which slot on the reel is currently front-center.


sybixsus, but then your method doesn't allow nudges etc
Yes, it can, if he uses floating point values.