Code archives/Algorithms/Simple Tetris

This code has been declared by its author to be Public Domain code.

Download source code

Simple Tetris by WildCat2009
Some kind of hacky strings usage, own incbin'ing and just the game.
Graphics3D 1024, 768, 32, 2 
SetBuffer (BackBuffer())

Global cx = 300
Global cy = 80
Global fld$ = String (" ", 260)
Global pcodes$[7]
Global score = 0

pcodes[1] = "  x   x   x   x "
pcodes[2] = "     xxx x"
pcodes[3] = "     xx  xx "
;what do you think? the game pieces coded in 4x4 space :)
pcodes[4] = " x   xx   x"
pcodes[5] = " x  xxx"
pcodes[6] = "     xx   xx"
pcodes[7] = "     xxx   x"
				   
;#Region [Image Data and Output]
Data 567
Data $89, $50, $4E, $47, $0D, $0A, $1A, $0A, $00, $00, $00, $0D, $49, $48, $44
Data $52, $00, $00, $00, $4C, $00, $00, $00, $10, $08, $03, $00, $00, $00, $8B
Data $05, $69, $95, $00, $00, $00, $04, $67, $41, $4D, $41, $00, $00, $AF, $C8
Data $37, $05, $8A, $E9, $00, $00, $00, $19, $74, $45, $58, $74, $53, $6F, $66
Data $74, $77, $61, $72, $65, $00, $41, $64, $6F, $62, $65, $20, $49, $6D, $61
Data $67, $65, $52, $65, $61, $64, $79, $71, $C9, $65, $3C, $00, $00, $00, $60
Data $50, $4C, $54, $45, $ED, $ED, $ED, $2E, $6A, $B2, $FB, $4D, $03, $DC, $9F
Data $57, $9E, $2F, $01, $F0, $F0, $F0, $D2, $30, $00, $A7, $A2, $A1, $BA, $78
Data $2B, $FF, $62, $12, $91, $75, $6E, $C7, $D0, $D2, $DA, $E6, $B3, $06, $0B
Data $61, $6D, $2A, $12, $A7, $BF, $CE, $5B, $61, $1B, $4A, $00, $2B, $7F, $1E
Data $04, $00, $00, $00, $61, $A2, $EB, $E3, $3D, $00, $D7, $C5, $86, $74, $3A
Data $2D, $4A, $00, $00, $FF, $6F, $1E, $C2, $BE, $BD, $25, $00, $2B, $26, $00
Data $00, $00, $00, $2B, $E2, $E6, $DF, $DD, $E0, $E1, $D9, $87, $2B, $0A, $00
Data $00, $01, $5D, $49, $44, $41, $54, $78, $DA, $A4, $93, $8B, $92, $83, $20
Data $0C, $45, $11, $41, $05, $7C, $AC, $28, $2A, $6E, $6B, $FF, $FF, $2F, $37
Data $09, $58, $75, $EA, $D6, $9D, $6E, $B4, $3A, $A3, $CD, $F1, $E6, $26, $61
Data $6C, $61, $97, $21, $B7, $43, $D2, $EF, $97, $78, $CD, $34, $7A, $D4, $33
Data $93, $73, $0E, $B7, $03, $E1, $82, $74, $06, $CB, $AD, $E3, $CE, $6A, $6D
Data $05, $17, $36, $97, $A4, $8B, $B4, $95, $6D, $F3, $27, $65, $69, $D7, $75
Data $7D, $D4, $65, $95, $F2, $4A, $59, $01, $57, $EE, $6A, $83, $94, $09, $5F
Data $23, $2C, $9C, $31, $73, $A9, $BB, $EE, $DE, $AC, $6F, $23, $0C, $3D, $33
Data $6D, $13, $85, $69, $A7, $BC, $F7, $CA, $59, $20, $72, $6E, $35, $3C, $82
Data $7C, $96, $DE, $4D, $50, $B6, $C1, $86, $44, $CA, $A2, $7A, $E0, $83, $E1
Data $96, $EC, $CA, $2C, $9F, $B0, $91, $7B, $8A, $02, $F5, $B9, $6C, $8C, $F9
Data $43, $6B, $48, $56, $0E, $72, $2A, $0D, $5A, $3A, $4A, $1F, $2A, $FA, $86
Data $4C, $2B, $73, $06, $AB, $B9, $22, $98, $A3, $32, $B3, $7A, $55, $46, $12
Data $B6, $32, $87, $6F, $BA, $89, $24, $48, $2D, $A7, $FE, $0C, $06, $65, $06
Data $9A, $F7, $1C, $60, $FA, $DC, $B3, $90, $5C, $90, $67, $07, $D8, $D1, $B3
Data $19, $9A, $49, $AE, $29, $64, $4D, $73, $FC, $12, $28, $D9, $C3, $44, $F0
Data $08, $CB, $7B, $A7, $8C, $69, $01, $DA, $54, $60, $D9, $7C, $9D, $09, $F8
Data $F7, $0E, $56, $04, $8B, $A8, $DA, $77, $9E, $E1, $A0, $09, $CE, $11, $95
Data $4D, $39, $CD, $58, $E8, $E6, $AA, $0C, $34, $04, $C3, $52, $10, $53, $24
Data $B1, $9B, $FD, $E9, $9C, $61, $CD, $A3, $E0, $0E, $58, $E3, $23, $CC, $FF
Data $C1, $33, $30, $AA, $FA, $C2, $6E, $56, $C3, $0D, $2E, $E6, $64, $CE, $8E
Data $B1, $68, $9B, $65, $34, $62, $FF, $DE, $4D, $4C, $86, $65, $D2, $2F, $84
Data $0F, $76, $33, $36, $75, $5E, $77, $F2, $B9, $9B, $9F, $2A, $3B, $56, $C6
Data $2E, $F4, $6C, $F1, $23, $C0, $00, $F1, $CE, $23, $39, $DF, $D0, $1E, $CD
Data $00, $00, $00, $00, $49, $45, $4E, $44, $AE, $42, $60, $82

out = WriteFile ("lb3d.png")
Read size
For a = 1 To size
	Read b
	WriteByte out,b
Next
CloseFile (out)
;#End Region

Function DrawGrids()	
	Color 64,64,64
	For a = 80 To 480 Step 20
		Line (cx, cy+a, cx+260, cy+a)
	Next
	For a = 0 To 260 Step 20
		Line (cx+a, cy+80, cx+a, cy+480)
	Next	
		
	Color 192,192,192
	Rect (cx, cy, 400, 560, 0)
	Line (cx, cy+80, cx+399, cy+80)
	Line (cx, cy+480, cx+399, cy+480)
	Line (cx+260, cy+80, cx+260, cy+480)
End Function

Function DrawBox (gx, gy, col)
	Color (col And $ff0000) Shr 16, (col And $ff00) Shr 8, col And $ff
	Rect (cx+(gx-1)*20+1, cy+80+(gy-1)*20+1, 19, 19)
End Function

Function DrawPiece (gx, gy, col, pcode$)
	a = 1
	For y = 1 To 4
		For x = 1 To 4
			If Mid$(pcode$, a, 1) = "x" Then DrawBox (gx+x-1, gy+y-1, col)
			a=a+1
		Next
	Next
End Function

Function DrawField (pcode$)
	a = 1
	For y = 1 To 20
		For x = 1 To 13
			sym$ = Mid$(pcode$, a, 1)
			Select True
				Case sym$ = "1": DrawBox (x, y, $ff0000)
				Case sym$ = "2": DrawBox (x, y, $00ff00)
				Case sym$ = "3": DrawBox (x, y, $0000ff)
				Case sym$ = "4": DrawBox (x, y, $ff00ff)
				Case sym$ = "5": DrawBox (x, y, $ffff00)
				Case sym$ = "6": DrawBox (x, y, $00ffff)
				Case sym$ = "7": DrawBox (x, y, $ffffff)
			End Select
			
			a=a+1
		Next
	Next	
End Function

Function InsertPiece (gx, gy, col, pcode$)
	a = 1
	For y = 1 To 4
		For x = 1 To 4
			If Mid$(pcode$, a, 1) = "x" Then 
				fx = x+gx-1
				fy = y+gy-1
				If (fx < 1) Or (fx > 13) Then Return 0
				If (fy > 20) Then Return 0
				
				If fy >= 1 Then 
					sym$ = Mid(fld$, fx+((fy-1)*13), 1)
					
					If sym$ <> " " Then Return 0
					
					fld$ = Left(fld$, fx+((fy-1)*13)-1)+col+Mid(fld$, fx+((fy-1)*13)+1)	
				EndIf			
			EndIf
			a=a+1
		Next
	Next	
	Return 1	
End Function

Function CheckInsertPiece (gx, gy, pcode$)
	a = 1
	For y = 1 To 4
		For x = 1 To 4
			If Mid$(pcode$, a, 1) = "x" Then 
				fx = x+gx-1
				fy = y+gy-1
				If (fx < 1) Or (fx > 13) Then Return 0
				If (fy > 20) Then Return 0
				
				If fy >= 1 Then
					sym$ = Mid(fld$, fx+((fy-1)*13), 1)
					
					If sym$ <> " " Then Return 0
				EndIf
			EndIf
			a=a+1
		Next
	Next	
	Return 1	
End Function

Function RotatePiece$(piece$)
	piece$ = piece$+String(" ", 16-Len(piece$)) ;adding spaces upto 16 symbols
	r$ = Mid(piece$, 13, 1)+Mid(piece$, 9, 1)+Mid(piece$, 5, 1)+Mid(piece$, 1, 1)
	r$ = r$ + Mid(piece$, 14, 1)+Mid(piece$, 10, 1)+Mid(piece$, 6, 1)+Mid(piece$, 2, 1)
	r$ = r$ + Mid(piece$, 15, 1)+Mid(piece$, 11, 1)+Mid(piece$, 7, 1)+Mid(piece$, 3, 1)
	r$ = r$ + Mid(piece$, 16, 1)+Mid(piece$, 12, 1)+Mid(piece$, 8, 1)+Mid(piece$, 4, 1)
	Return r$
End Function

Function WipeLines()
	For y = 20 To 1 Step -1
		wipe = 1
		For x = 1 To 13
			sym$ = Mid$(fld$, x+((y-1)*13), 1)
			If sym$ = " " Then 
				wipe = 0
				Exit
			EndIf
		Next		
		
		If wipe Then
			fld$ = String(" ", 13)+Left(fld$, (y-1)*13)+Mid(fld$, y*13+1)
			score=score+1
			y=y+1
		EndIf		
	Next
End Function

pnum = Rand(1, 7)
pnext = Rand(1, 7)
piece$ = pcodes[pnum]
pnextcode$ = pcodes[pnext]
px = 5
py = 0

pStart = MilliSecs()

gameover = 0

lb3d = LoadImage ("lb3d.png")

Repeat
	Cls

	DrawGrids()
	
	If Not gameover Then		
		opx = px
		opy = py
		DrawPiece (px, py, $ff0000, piece$)
		
		If (pStart+500<MilliSecs()) Or (KeyDown(208)) Then 
			py=py+1
			pStart = MilliSecs()
		EndIf
		
		If CheckInsertPiece (px, py, piece$) = 0 Then 
			InsertPiece (opx, opy, pnum, piece$)
			If opy <= 1 Then gameover=1
						
			WipeLines()
			pnum = pnext
			piece$ = pnextcode$
			
			pnext = Rand(1, 7)
			pnextcode$ = pcodes[pnum]
			px = 5
			py = -2	
		EndIf	
	
		opx = px
		opy = py
		
		If KeyHit(203) Then px=px-1
		If KeyHit(205) Then px=px+1
			
		If CheckInsertPiece (px, py, piece$) = 0 Then 
			px = opx
			py = opy			
		EndIf
			
		If KeyHit (200) Then
			savePiece$ = piece$
			piece$ = RotatePiece$(piece$)	
			If CheckInsertPiece (px, py, piece$) = 0 Then piece$ = savePiece$
		EndIf
		DrawField (fld$)
	Else
		DrawField (fld$)
		Text 0,0, "Game"
		Text 0,12, "Over"
		For x = 1 To 40
			For y = 1 To 30
				pix = ReadPixel (x, y)
				If pix And $ff Then DrawBox (x-5, y-3, $ffffff)
			Next
		Next		
	EndIf
		

	Rect (564, 286, 132, 272, 0)
	Text 570,408, "Place for an ad"
	
	If KeyHit(1) Then Exit
	
	Color 255,255,255
	Text cx+264, cy+86, "Score: "+score
	Text cx+264, cy+106, "Next: "
	
	DrawPiece (14, 3, $ffff00, pnextcode$)
	
	DrawImage (lb3d, 622, 143)
	
	Text 0, 0, "X: "+MouseX()+" Y: "+MouseY()+" Z: "+MouseZ()
	Flip
Forever

End

Comments

Sauer2009
Nice work, I will study these methods further.


WildCat2009
You are welcome :)


Ion2010
Awesome!


Code Archives Forum