Severe help needed

Blitz3D Forums/Blitz3D Programming/Severe help needed

I finished and it is 90% all my own code. Thats why it doesn't seem to work or it works really weird. I am posting it here to see if someone on this board... who I would gladly buy a round for... can figure out the error of my ways.

; PLONK a simple 3 in a row game of color
; Ralph Dunn
Graphics3D 800,600,16,2
SetBuffer BackBuffer()

SeedRnd MilliSecs()
player=CreatePivot()
camera=CreateCamera(player)
light=CreateLight()
RotateEntity light,45,45,0
AmbientLight 48,48,48    ; was 32,32,32

EntityType camera,1
PositionEntity camera,0,90,8
RotateEntity camera,90,0,0

Dim board(9,9)
Dim plunk(1)
Dim boardx(9)
Dim boardz(9)

boardx(0)=-45
boardx(1)=-35
boardx(2)=-25
boardx(3)=-15
boardx(4)=-5
boardx(5)=5
boardx(6)=15
boardx(7)=25
boardx(8)=35
boardx(9)=45

boardz(0)=45
boardz(1)=35
boardz(2)=25
boardz(3)=15
boardz(4)=5
boardz(5)=-5
boardz(6)=-15
boardz(7)=-25
boardz(8)=-35
boardz(9)=-45

Global xx
Global zz
Global row
Global col
Global punk

; #######################################  Load Mesh Objects
gameboard=LoadMesh("board.b3d")
UpdateNormals gameboard
ScaleEntity gameboard,5.5,5.5,5.5
EntityShininess gameboard,1

Global empty=LoadMesh("square.b3d")
EntityPickMode empty,2
HideEntity empty

;Global bomb=LoadMesh("bomb.b3d")
;EntityShininess bomb,1
;HideEntity bomb

Global clearpiece=LoadMesh("piece3.b3d"); was piece
EntityShininess clearpiece,1
HideEntity clearpiece

Global redpiece=LoadMesh("piece3.b3d")
EntityColor redpiece,192,0,0
EntityShininess redpiece,1
HideEntity redpiece

Global blupiece=CopyMesh(redpiece)
EntityColor blupiece,0,0,255
EntityShininess blupiece,1
HideEntity blupiece

Global yellopiece=CopyMesh(redpiece)
EntityColor yellopiece,180,180,0
EntityShininess yellopiece,1
HideEntity yellopiece

Global violetpiece=CopyMesh(redpiece)
EntityColor violetpiece,138,1,255
EntityShininess violetpiece,1
HideEntity violetpiece

Global redvioletpiece=CopyMesh(redpiece)
EntityColor redvioletpiece,180,1,180
EntityShininess redvioletpiece,1
HideEntity redvioletpiece

Global orangepiece=CopyMesh(redpiece)
EntityColor orangepiece,255,153,51
EntityShininess orangepiece,1
HideEntity orangepiece

Global bluvioletpiece=CopyMesh(redpiece)
EntityColor bluvioletpiece,51,0,103
EntityShininess bluvioletpiece,1
HideEntity bluvioletpiece

Global greenpiece=CopyMesh(redpiece)
EntityColor greenpiece,0,102,0
EntityShininess greenpiece,1
HideEntity greenpiece

Global redorangepiece=CopyMesh(redpiece)
EntityColor redorangepiece,255,51,1
EntityShininess redorangepiece,1
HideEntity redorangepiece

Global yellogreenpiece=CopyMesh(redpiece)
EntityColor yellogreenpiece,51,255,102
EntityShininess yellogreenpiece,1
HideEntity yellogreenpiece

Global blugreenpiece=CopyMesh(redpiece)
EntityColor blugreenpiece,0,102,102
EntityShininess blugreenpiece,1
HideEntity blugreenpiece

Global yelloorangepiece=CopyMesh(redpiece)
EntityColor yelloorangepiece,255,153,1
EntityShininess yelloorangepiece,1
HideEntity yelloorangepiece


; ######################################  Plunk Tiles
For xx=0 To 9
	For zz=0 To 9
		e=CopyEntity (empty)
		PositionEntity e,boardx(xx),1,boardz(zz) 
	Next
Next

; ############################################## Start of Game Loop
ShowPointer 

setup_row()

put_row()

While Not KeyDown(1)

x=MouseX()
y=MouseY()

e=CameraPick(camera,x,y)
	If e<>entity
		If entity Then EntityColor entity,255,255,255 
		entity=e
	EndIf
	
If KeyHit(29)=True Then
	PositionEntity camera,0,83,-29 ; 0,53,-69
	RotateEntity camera,75,0,0 ; was 35
EndIf

If KeyHit(50)>=1 Then musicflag=1-musicflag

If KeyHit(56)=True Then
	PositionEntity camera,0,90,8
	RotateEntity camera,90,0,0
EndIf

If MouseHit(1) = True Then
	hat=CameraPick(camera,x,y)
	If hat=0 Then Goto outme
		Select empty 
			Case empty
			xx=EntityX(entity)
			zz=EntityZ(entity) 
			Default 
			pp=0
		End Select
.outme
get_rowcol()
EndIf

If entity
	EntityColor entity,54,80,252
; 73,253,146 lime 254,216,38 gold 254,80,232 magenta 54,80,252
EndIf


check_three()
check_zero()
ClearWorld(entities)
put_row()

UpdateWorld

RenderWorld

Text 0,10,"X: "+xx
Text 0,20,"Z: "+zz
Text 0,30,"ROW: "+row
Text 0,40,"COL: "+col

Flip

Wend

End

Function setup_row()

For t=0 To 9
	For tt=0 To 9
		w=Rand(11)+1
	board(t,tt)=w
	Next
Next

End Function

Function put_row()
; this is going to be BIG
For row = 0 To 9
	For col=0 To 9
		q=board(row,col)
	Select q
	Case 1
		red=CopyEntity (redpiece)
		PositionEntity red,boardx(row),4,boardz(col)
	Case 2
		blue=CopyEntity (blupiece)
		PositionEntity blue,boardx(row),4,boardz(col)
	Case 3
		violet=CopyEntity (violetpiece)
		PositionEntity violet,boardx(row),4,boardz(col)
	Case 4
		yellow=CopyEntity (yellopiece)
		PositionEntity yellow,boardx(row),4,boardz(col)
	Case 5
		redviolet=CopyEntity (redvioletpiece)
		PositionEntity redviolet,boardx(row),4,boardz(col)
	Case 6
		orange=CopyEntity (orangepiece)
		PositionEntity orange,boardx(row),4,boardz(col)
	Case 7
		bluviolet=CopyEntity (bluvioletpiece)
		PositionEntity bluviolet,boardx(row),4,boardz(col)
	Case 8
		green=CopyEntity (greenpiece)
		PositionEntity green,boardx(row),4,boardz(col)
	Case 9
		redorange=CopyEntity (redorangepiece)
		PositionEntity redorange,boardx(row),4,boardz(col)
	Case 10
		yellogreen=CopyEntity (yellogreenpiece)
		PositionEntity yellogreen,boardx(row),4,boardz(col)
	Case 11
		blugreen=CopyEntity (blugreenpiece)
		PositionEntity blugreen,boardx(row),4,boardz(col)
	Case 12
		yelloorange=CopyEntity (yelloorangepiece)
		PositionEntity yelloorange,boardx(row),4,boardz(col)
	End Select
Next

Next

End Function

Function get_rowcol()

For r=0 To 9
	For c=0 To 9
		g=zz
			gg=xx
				h=boardz(c)
				i=boardx(r)
		If h=g Then col=c
		If i=gg Then row=r
	Next
Next

board(row,col)=0

End Function

Function check_three()
; start at row 0
For flirt=0 To 9
	For fart=0 To 7
		a=board(flirt,fart)
		b=board(flirt,fart+1)
		c=board(flirt,fart+2)
			If a=b And b=c Then
				board(flirt,fart)=0
				board(flirt,fart+1)=0
				board(flirt,fart+2)=0
			; maybe some points and a sound
			EndIf
	Next		
Next

End Function

Function check_zero()

For gaggle = 0 To 9
	For giggle=0 To 9
		a=board(gaggle,giggle)
			If a = 0 Then
				kolor=Rand(11)+1
				board(gaggle,giggle)=kolor
			EndIf
	Next
Next
End Function
I think it is commented pretty well. All it tries to do is set up 10 rows and put colored bits on them.

When you click your mouse it puts a 0 at that row and location...

Then it makes a new colored bit and pops it in the location

Then it checks for 3 in a row of the same color

If there are 3 in a row of the same color it ZEROs them and pops a new set of colors in those locations...

Simple really

So why does it not work!

EDIT:: I went back to a 2D array... the speed is MUCH improved bu still slooooowwwww on mousepick and the incorrect coords are returned... Row and col must be from 0 to 9 bot 10!!!

-Rook

whoah jeez. ugly code no offense... I'll try to make it smaller so its easier to see the problem. I would recommend trying to use arrays to a better extent. and loops. (I just had to get in the first post - I'm gonna go make it better now :P)

Yes yes yes... ugly... new code posted now... isn't really more beautiful!!! cleaner though... compared to first version!!!

Oh ok. Yeah. that's better. How about putting you pieces into an array? that would be easy so instead of
Function put_row()
; this is going to be BIG
For row = 0 To 9
	For col=0 To 9
		q=board(row,col)
	Select q
	Case 1
		red=CopyEntity (redpiece)
		PositionEntity red,boardx(row),4,boardz(col)
	Case 2
		blue=CopyEntity (blupiece)
		PositionEntity blue,boardx(row),4,boardz(col)
	Case 3
		violet=CopyEntity (violetpiece)
		PositionEntity violet,boardx(row),4,boardz(col)
	Case 4
		yellow=CopyEntity (yellopiece)
		PositionEntity yellow,boardx(row),4,boardz(col)
	Case 5
		redviolet=CopyEntity (redvioletpiece)
		PositionEntity redviolet,boardx(row),4,boardz(col)
	Case 6
		orange=CopyEntity (orangepiece)
		PositionEntity orange,boardx(row),4,boardz(col)
	Case 7
		bluviolet=CopyEntity (bluvioletpiece)
		PositionEntity bluviolet,boardx(row),4,boardz(col)
	Case 8
		green=CopyEntity (greenpiece)
		PositionEntity green,boardx(row),4,boardz(col)
	Case 9
		redorange=CopyEntity (redorangepiece)
		PositionEntity redorange,boardx(row),4,boardz(col)
	Case 10
		yellogreen=CopyEntity (yellogreenpiece)
		PositionEntity yellogreen,boardx(row),4,boardz(col)
	Case 11
		blugreen=CopyEntity (blugreenpiece)
		PositionEntity blugreen,boardx(row),4,boardz(col)
	Case 12
		yelloorange=CopyEntity (yelloorangepiece)
		PositionEntity yelloorange,boardx(row),4,boardz(col)
	End Select
Next

Next

End Function

do this...
Function put_row()
	For row = 0 To 9
		For col=0 To 9
			obj=CopyEntity(Piece(Board(row,col)))
			PositionEntity obj,row*10-45,4,col*10-45
		Next
	Next
End Function


Much more neat and no more nead for boardx(),boardy() arrays. Piece is an array that holds handles of the different objects.

Also, you may notice its really slow (this is probably also your problem) - you aren't deleting the objects. You are doing it like a 2d game - creating objects every frame (drawimage), but in 3d they don't go away. I would recommend just leaving the objects their, and deleting/adding as necessary.

Also, in check zero you can do Rand(1,12) instead of Rand(11)+1

I did clean the code quite a bit. You had several good sugestions... posted new code above...

Do have 1 q???
I would recommend just leaving the objects their, and deleting/adding as necessary.
You mean just plop the peices on the board and instead of plopping NEW pieces... I should just change the colors of those pieces???

You know I have rewritten this game three times... learning more about how Blitz handles arrays each time. I supose that each piece would just have to have a unique handle.

I am just going to have to get back in to types... {sigh} I like them but I don't understand how to modify them yet.

[quote]You mean just plop the peices on the board and instead of plopping NEW pieces... I should just change the colors of those pieces???p/quote] Definitly, if that's an option. If you want to change the model as well, you'll have to delete the piece and then add another. You could have somthing like this:
Dim Entity(9,9)

Function SetPiece(Row,Col,ID)
	FreeEntity Entity(Row,Col)
	Entity(Row,Col)=CopyEntity(Piece(ID))
	PositionEntity Entity(Row,Col),row*10-45,4,col*10-45
End Function


Then, whenever you change somtrhing in the board array, use the SetPiece function to set the 3d visuals.