| Tetris 1.07 
 
	 
	
		| Author | Message |   
		| fishtastic 
 
  
 
 
 | 
			
				|  Posted: Sat Mar 24, 2007 8:20 pm    Post subject: Tetris 1.07 |  |   
				| 
 |  
				| The tetris game i'm working on hope you like it
   i found it highly addictive
 
 control:
 UP:rotate
 LEFT,RIGHT: move
 DOWN: move down by 1 line
 SPACE: instant drop
 
 
 features: smooth control, side rotation, telling next block, increasing speed
 
 I cant give out the code before i give it to the teacher. XD
   
 please tell me if you have any suggesting or found any bugs.
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| Sponsor Sponsor
 
  
   |  |   
		|  |   
		| fishtastic 
 
  
 
 
 | 
			
				|  Posted: Sat Mar 24, 2007 8:23 pm    Post subject: RE:Tetris 1.07 |  |   
				| 
 |  
				| I will be very happy if i can see some positive comments  |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| octopi 
 
  
 
 
 | 
			
				|  Posted: Sat Mar 24, 2007 8:49 pm    Post subject: Re: Tetris 1.07 |  |   
				| 
 |  
				| Hello, 
 Its a pretty good game, I noticed one bug, my first peice, I was holding left and part of the peice went off the game board, it was an s piece.
 
 The game gets a little crazy when it gets fast, I got to speed 18 and it was impossible to manage, maybe if you make it take longer to get so fast.
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| fishtastic 
 
  
 
 
 | 
			
				|  Posted: Sat Mar 24, 2007 9:13 pm    Post subject: RE:Tetris 1.07 |  |   
				| 
 |  
				| there are still few bugs. thats why i said its unfinished. i will try to fix them. |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| MihaiG 
 
  
 
 
 | 
			
				|  Posted: Sat Mar 24, 2007 11:03 pm    Post subject: Re: Tetris 1.07 |  |   
				| 
 |  
				| i agree, 
 i got to 19 and was alreadu making stupid mistakes
 
 i think in actual tetris, board is longer, and taller?
 
 also from 13+ the speed speeds up really fast
 
 good stuff overall
 
 the long grey bricks are hard to distiguish,
 
 
 maybe post code, so we could optimize, once ur done ur project
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| fishtastic 
 
  
 
 
 | 
			
				|  Posted: Fri Feb 01, 2008 9:24 am    Post subject: update & code |  |   
				| 
 |  
				| Final version of the game with all codes! 
 new features:
 multi-player!
 both play can see each others screen.
 when one player gets rid of 2~4 lines at once the other person will 'gain' lines
 try to play with a friend in Turing class!
 
 single player mode is still possible.
 
 some bug still exist.
 but was never able to find it. it rarely occurs.
 
 
 
 	  | Turing: |  	  | View.Set ("title:Tetris Final")
const x := 10
const  y := 10
const  Ex := 310
const  Ey := 10
const  borderC := 25
const  emptyBC := 30
const  autoMove := 6
const  UP_ARROW : char := chr (200)
const  LEFT_ARROW : char := chr (203)
const  RIGHT_ARROW : char := chr (205)
const  DOWN_ARROW : char := chr (208)
const  SPACE : char := chr (32)
var  pPic, ePic : int
var  frame := 0
var  startTime := 0 .0
var  freeze := 0
var  cShape := 1
var  center := 0
var  canPress := 0
var  temp1, temp2, temp3 : int
var  Bcolor : int
var  count := 0
var  key : array char of boolean
var  eBlock, block : array  - 36 . . 288 of int
var  map : array 1 . . 288 of int
var  eMap : array 1 . . 288 of int
var  movel, mover := 1
var  movecount := 0
var  b1, b2 := 0
var  keyHold := 0
var  score := 0 .0
var  speed := 20 .0
var  bug := 0
var  safe := 0
var  eTotalB := 0
for  i : 1 . . 288 
    eMap ( i) :=  emptyBC
 
    map ( i) :=  emptyBC
end for 
for i :  -36 . . 288 
    block ( i) :=  emptyBC
 
    eBlock ( i) :=  emptyBC
end for
var  BC : array 1 . . 7 of int := init (4 , 5 , 2 , 3 , 6 , 22 , 103)
var  blocks1 : array 1 . . 28 of string := init ("1000100010001000" , "1100110000000000" , "1000110001000000" , "0100110010000000" , "0100011100000000" , "0100111000000000" , "0010111000000000" ,
    "1111000000000000" , "1100110000000000" , "0110110000000000" , "1100011000000000" , "0011001000100000" , "0100011001000000" , "0100010001100000" ,
    "1000100010001000" , "1100110000000000" , "1000110001000000" , "0100110010000000" , "0000011100010000" , "0000111001000000" , "0000111010000000" ,
    "1111000000000000" , "1100110000000000" , "0110110000000000" , "1100011000000000" , "0010001001100000" , "0100110001000000" , "1100010001000000")
var  newadd, youradd : string
var  net : int
var  port : int
var  choice : char
color (red)
put "Play at you own risks."
put "1-single,  2- two players"
loop 
    choice := getchar
    exit when  choice = "1" or  choice = "2"
end loop
View.Set ("graphics:300;400,nobuttonbar")
if  choice = "2" then
    View.Set ("graphics:500;400,nobuttonbar")
    loop
        put "1-make server,  2- connect server" 
        choice := getchar
        exit when  choice = "1" or  choice = "2"
    end loop
    if  choice = "1"
            then 
        youradd := Net.LocalAddress
        put "Your machine address is ",  youradd
        put "input port number: " . .
        get  port
 
        net := Net.WaitForConnection ( port, newadd)
        put "cool!! connected to    ",  newadd
 
        choice := "2"
    elsif  choice = "2"
            then
        cls
        put "input port number: " . .
        get  port
        put "Other person's IP: " . .
        get  newadd
 
        net := Net.OpenConnection ( newadd, port)
        put "connection to: ",  newadd
        if  net <= 0 then 
            choice := "1"
            return
        end if
    end if
end if
View.Set ("offscreenonly")
color (black)
proc  moreLine (var  somemap : array 1 . . 288 of int , howmany : int)
    var  where :=  Rand.Int (0 , 11)
    for  decreasing i : 288 . . howmany * 12  + 1 
        somemap ( i) :=  somemap ( i - 12 *  howmany) 
        somemap ( i - 12 *  howmany) :=  emptyBC
    end for
    for  i : 0 . . howmany - 1
        for  j : 1 . . 12
            if  j not = where then 
                somemap ( i * 12  + j) := 4
            end if
        end for
    end for
end  moreLine
%
proc  send (var  somemap : array 1 . . 288 of int)
    for  i : 1 . . 288
        put :  net, somemap ( i)
    end for
end  send
%
fcn  totalB (var  somemap : array 1 . . 288 of int) : int
    var  total := 0
    for  i : 1 . . 288
        if  somemap ( i) not = emptyBC then 
            total :=  total + 1
        end if
    end for
    result  total
end  totalB
%
proc  drawMap ( startx : int , starty : int , var  somemap : array 1 . . 288 of int , size : int)
    for  i : 0 . . 287
        drawfillbox ( startx + ( i mod 12) *  size, starty + ( i div 12) *  size, startx + ( i mod 12) *  size + size, starty + ( i div 12) *  size + size, somemap ( i + 1))
        drawbox ( startx + ( i mod 12) *  size, starty + ( i div 12) *  size, startx + ( i mod 12) *  size + size, starty + ( i div 12) *  size + size, borderC)
    end for
end  drawMap
%
proc  getPic ( x : int , y : int , size : int , var  id : int) 
    id := Pic.New ( x, y, x + 12 *  size, y + 24 *  size)
end  getPic
%
proc  drawBlock ( startx : int , starty : int , var  someblock : array  - 36 . . 288 of int , size : int)
    for  i : 0 . . 287
        if  someblock ( i + 1) not = emptyBC then
            drawfillbox ( startx + ( i mod 12) *  size, starty + ( i div 12) *  size, startx + ( i mod 12) *  size + size, starty + ( i div 12) *  size + size, someblock ( i + 1))
        end if
    end for
end  drawBlock
%
proc  combine (var  somemap : array 1 . . 288 of int , var  someblock : array  - 36 . . 288 of int)
    for  i : 1 . . 288
        if  someblock ( i) not = emptyBC and  somemap ( i) =  emptyBC then 
            somemap ( i) :=  someblock ( i)
        end if
    end for
end  combine
%
fcn  situation (var  somemap : array 1 . . 288 of int , var  someblock : array  - 36 . . 288 of int) : int
    for  i :  -36 . . 288  - 12
        if  i <= 0 and  someblock ( i) not = emptyBC then
            result 3
        elsif  i > 0 and ( someblock ( i) not = emptyBC) and ( somemap ( i) not = emptyBC) then
            result 2
        end if
    end for
    for  i :  -36 . . 288  - 12
        if  i > 0 and ( someblock ( i + 12) not = emptyBC and  somemap ( i) not = emptyBC) or ( someblock ( i) not = emptyBC and  i < 13) then
            result 1
        end if
    end for
    result 0
end  situation
%
proc  cBlock (var  someblock : array  - 36 . . 288 of int)
    for  i :  -36 . . 288 
        someblock ( i) :=  emptyBC
    end for
    for  j : 0 . . 15 
        temp2 := strint ( blocks1 ( b1 + cShape * 7) ( j + 1))
        if  temp2 not = 0 then 
            temp3 := ( center - ( j div 4) * 12  + ( j mod 4)  + 2)
            if  temp3 < 288 and  temp3 > -36 then 
                someblock ( temp3) :=  BC ( b1)
            end if
        end if
    end for
end  cBlock
%
proc  killLine (var  somemap : array 1 . . 288 of int)
    var  yay : int
    for  decreasing i : 23 . . 0 
        yay := 0
        for  j : 1 . . 12
            if  somemap ( i * 12  + j) not = emptyBC then 
                yay :=  yay + 1
            end if
        end for
        if  yay = 12 then 
            score :=  score + (20  - speed) * 50
            if  speed > 1 then 
                speed :=  speed * 0 .97
            end if
            for  j : ( i * 12) . . 274 
                somemap ( j + 1) :=  somemap ( j + 13)
            end for
        end if
    end for
end  killLine
%
fcn  sideCheck (var  someblock : array  - 36 . . 288 of int) : int
    var  r, l := false
    for  i : 0 . . 23
        if  someblock (12 *  i + 1) not = emptyBC then 
            r := true
        end if
        if  someblock (12 *  i) not = emptyBC then 
            l := true
        end if
    end for
    if  l = true and  r = true then
        result 3
    elsif  l = true then
        result 2
    elsif  r = true then
        result 1
    else
        result 0
    end if
end  sideCheck
%
proc  recieve (var  somemap : array 1 . . 288 of int)
    for  i : 1 . . 288
        get :  net, somemap ( i)
    end for 
    drawMap ( Ex, Ey, eMap, 10) 
    getPic ( Ex, Ey, 10 , ePic)
    if  eTotalB - totalB ( somemap)  > 36 then 
        moreLine ( map, 4)
    elsif  eTotalB - totalB ( somemap)  < 48 and  eTotalB - totalB ( somemap)  > 24 then 
        moreLine ( map, 2)
    elsif  eTotalB - totalB ( somemap)  < 36 and  eTotalB - totalB ( somemap)  > 12 then 
        moreLine ( map, 1)
    end if 
    eTotalB :=  totalB ( somemap)
end  recieve
% 
drawMap ( Ex, Ey, eMap, 10) 
getPic ( Ex, Ey, 10 , ePic) 
startTime := Time.Elapsed
loop 
    combine ( map, block) 
    killLine ( map) 
    drawMap ( x, y, map, 15) 
    getPic ( x, y, 15 , pPic)
    if  choice = "2"
            then 
        send ( map)
    end if 
    center := 280
    if  b1 = 0 then
        randint ( b1, 1 , upper ( BC))
    else 
        b1 :=  b2
    end if
    randint ( b2, 1 , upper ( BC)) 
    cShape := 0 
    cBlock ( block)
    if  situation ( map, block) = 2 then
        put "game over"
        View.Update
        exit
    end if
    loop
        cls 
        frame += 1
        Pic.Draw ( pPic, x, y, picCopy) 
        drawBlock ( x, y, block, 15)
        if  movecount > speed and  freeze = 0 then 
            center :=  center - 12 
            cBlock ( block) 
            movecount := 0
        end if
        put "Load time: ", (Time.Elapsed  - startTime)  / frame - (20  - round (1 .1 * * (20  - speed))) : 1 : 1 , " score: ", round ( score), " Speed: ", round (20  - speed)       %%%%
        var  yy := 30
        for  i : 0 . . 3
            locate ( i + 5 , yy)
            for  j : 1 . . 4
                if  blocks1 ( b2) (4 *  i + j) = "0" then
                    put " " . .
                else
                    put "#" . .
                end if
            end for
            put ""
        end for
        if  choice = "2" then
            if Net.CharAvailable ( net) then 
                safe :=  safe + 1
                if  safe > 20 then 
                    recieve ( eMap) 
                    safe := 0
                end if
            end if
            Pic.Draw ( ePic, Ex, Ey, picCopy)
        end if
        View.Update
        delay (20  - round (1 .1 * * (20  - speed)))
        Input.KeyDown ( key)
        if  key ( UP_ARROW) then
            if  canPress = 1 then 
                temp1 :=  sideCheck ( block)
                if  cShape = 3 then 
                    cShape :=  -1
                end if 
                cShape :=  cShape + 1 
                cBlock ( block)
                if  situation ( map, block) = 3 or  situation ( map, block) = 2 then 
                    cShape :=  cShape - 1 
                    cBlock ( block)
                elsif  sideCheck ( block) = 3 and  temp1 not = 1 then 
                    center :=  center - 1 
                    cBlock ( block)
                    if  sideCheck ( block) = 3 and  temp1 not = 1 then 
                        center :=  center - 1 
                        cBlock ( block)
                        if  sideCheck ( block) = 3 and  temp1 not = 1 then 
                            center :=  center - 1 
                            cBlock ( block)
                        end if
                    end if
                elsif  sideCheck ( block) = 3 and  temp1 = 1 then 
                    center :=  center + 1 
                    cBlock ( block)
                end if 
                canPress := 0
            end if
        elsif  key ( DOWN_ARROW) then
            if  canPress = 1 or  keyHold > autoMove then
                exit when  situation ( map, block) = 1 
                center :=  center - 12 
                cBlock ( block) 
                keyHold += 1
            end if
        elsif  key ( LEFT_ARROW) then
            if ( canPress = 1 or  keyHold > autoMove) and  sideCheck ( block) not = 1 then 
                center :=  center - 1 
                cBlock ( block)
                if  situation ( map, block) = 2 then 
                    center :=  center + 1 
                    cBlock ( block)
                end if
            end if 
            canPress := 0 
            keyHold += 1
        elsif  key ( RIGHT_ARROW) then
            if ( canPress = 1 or  keyHold > autoMove) and  sideCheck ( block) not = 2 then 
                center :=  center + 1 
                cBlock ( block)
                if  situation ( map, block) = 2 then 
                    center :=  center - 1 
                    cBlock ( block)
                end if
            end if 
            canPress := 0 
            keyHold += 1
        elsif  key ( SPACE) and  canPress = 1 then
            loop
                exit when  situation ( map, block) = 1 
                center :=  center - 12 
                cBlock ( block)
            end loop 
            canPress :=  -10
            exit
        else
            if  canPress < 1 then 
                canPress += 1
            end if 
            keyHold := 0
        end if 
        movecount += 1
        if  situation ( map, block) = 1 then 
            freeze += 1
        else 
            freeze := 0
        end if
        exit when  freeze > speed * 2
        exit when  center < 0
    end loop 
    score :=  score + (20  - speed)
end loop | 
   	| Spoiler: |  	| you can cheat in multi-player mode by pausing the game. |  |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| MichaelM 
 
  
 
 
 | 
			
				|  Posted: Fri Feb 01, 2008 10:11 am    Post subject: Re: Tetris 1.07 |  |   
				| 
 |  
				| Thats pretty good! The controls are very smooth, which is something a lot of other tetris games submitted to this site lack. You can actually play this one for over 30 seconds and not get fustrated! (no offense to any other people's games, just tryin to make some contsructive criticism) 
 -edit-
 
 Hey, I was playing and Im not sure if I found a glitch or if it ended.  I had a score of 8250 and at speed 18 (at losing
  ) and then It stopped (the exe sais execution finished) |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| CodeMonkey2000 
 
 
 
 
 | 
			
				|  Posted: Sun Feb 17, 2008 9:09 pm    Post subject: RE:Tetris 1.07 |  |   
				| 
 |  
				| That's pretty solid. Your code can be shortened. Other than that it's pretty addictive. |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| Sponsor Sponsor
 
  
   |  |   
		|  |   
		|  |  
 |