-4

I rotate each piece by rotation formula. More detail, because rotation angle is 90 so :

xNew = y;  

yNew = -x;

But my method has met two problems :

1) Out of box : each type of pieces is fit in square 4x4. (0,0 at under left) But by this rotation, at some case they will out of this box. For example, there is a point with coordinate (5,6) So, please help me how to fit these coordinate into 4x4 box again, or give me another formula for this.

2) at I case : (4 squares at same row or same column), just has two rotations case. but in method above, they still has 4 pieces. So, how to prevent this.

Thanks :)

hqt
  • 29,632
  • 51
  • 171
  • 250

2 Answers2

3

The Tetris board is a grid layout. A very simple way of understanding is that a Tetris piece is just a set number of squares that are 'filled'. In a boolean sense, a piece can be viewed as 0, or unfilled, or 1, filled. Using a grid (or tile-based) approach will prevent your blocks from ever going out of bounds and as an added bonus also simplifies collision code when you reach a bottom-collision.

Pseudo-code: You can do a check if (!grid[x][y]) block.move(direction) where grid[x][y] is a space you want to move into and block.move(direction) is an arbitrary function that adjusts your piece and map by one grid space in whatever direction is specified. In this sense, your game loop could also use block.move('down') to drop the piece incrementally and else block.stop(), game.generateBlock() for the next piece.

Using the grid method, you can easily check to see if your rotated piece will be out-of-bounds as if(x < 0 || x > gridWidth) block.move(direction), in which direction is the direction opposite of the way it would had moved out-of-bounds.

Continuing with the grid-based example, your pieces are really just a pattern of on/off as well and their rotation is displayed as so:

  ▇    ▇        ▇ ▇    ▇ ▇ ▇
  ▇ or ▇ ▇ ▇ or ▇   or     ▇
▇ ▇             ▇

What is illustrated just by this rudimentary artwork is that the pieces don't rotate around a central point due to the often rectangular pieces. The patterns can be stored in their boolean state easily enough, however, and you can just track which 'position' it is in and write your code to test it regardless of the orientation.

Since each piece has a finite number of patterns it can be in (4 maximum) and it is probably in your best interest to simply hard-code them in. This answer provides some code you may find inspiring: https://stackoverflow.com/a/8131337/571506

I highly recommend doing the research and learning a little linear algebra with these simple variables if there's even the slightest chance you'll move into 3D game programming. Since each piece can be stored as a matrix, you can apply simple transformations to the base 'piece matrix' to get the new pattern. This can be faked easily enough, or you can go all-out. I highly recommend doing the research and learning a little linear algebra with these simple variables if there's even the slightest chance you'll move into 3D game programming. For algorithms, check out this question: How do you rotate a two dimensional array?

Tetris is an extremely well-documented game and can add a lot of skills to your 'toolbox'. Try to figure as much of it out using provided paradigms as possible while doing majority of the programming by hand and you'll find it a great to benefit in the long run.

Community
  • 1
  • 1
joverboard
  • 335
  • 1
  • 3
  • 13
0

I don't understand question 2, but for question 1, you need to do more than just rotate, you must also move the piece over left/right/up/down.

Yusuf X
  • 14,513
  • 5
  • 35
  • 47
  • yes. I have though to your solution. but I think it is complicate for this small problem, so I think there will be another nice solution – hqt Jun 19 '12 at 17:55
  • question 2 mean : as you see, if I rotate `|` four times, it just have two : `|` and `__`. but in fact, it will have four pieces. (2 pieces other same, but at different location !!!) – hqt Jun 19 '12 at 17:56
  • This is because you're not rotating around the center. The fix is the same as for #1. I don't know of a simpler solution. – Yusuf X Jun 19 '12 at 23:46
  • No. it doesn't matter about center or not. but, first post helps me many things – hqt Jun 20 '12 at 08:30