The Quest for Tetris... Part 2

Started by
9 comments, last by adam_o 16 years, 10 months ago
Hello all, Continuing from part 1, I have even more problems with my code. (Ok, so only one right now, but I'm pretty sure that it's messing everything else up) PROBLEM 3: My line-removing code doesn't work correctly. It funks out and makes weird patterns. So I'm placing the brick and then it cleared all the lines on top. Then I placed it again and it made weird lines which went away when my brick hit it. Many thanks in advance for the help. adam_o UPDATED CODE EDIT 1: Updated code, updated Problem 3. [Edited by - adam_o on June 9, 2007 9:02:31 PM]
_______________________My computer stats:Xcode 3.1.2Mac OS 10.5.8---Visual C++ 2008 Express EditionWindows XP---NetBeansUbuntu 9.04---Help needed here!
Advertisement
Sounds like an off-by-one error. Remember that C++ arrays start at 0 and go to n-1.
Quote:Original post by Ravuya
Sounds like an off-by-one error. Remember that C++ arrays start at 0 and go to n-1.


I don't think it's off-by-one, because that kicks up the debugger... I had that happen between Problem 2 and Problem 3, but I was able to get the help on that one... nice try...
_______________________My computer stats:Xcode 3.1.2Mac OS 10.5.8---Visual C++ 2008 Express EditionWindows XP---NetBeansUbuntu 9.04---Help needed here!
Quote:Original post by adam_o
Quote:Original post by Ravuya
Sounds like an off-by-one error. Remember that C++ arrays start at 0 and go to n-1.


I don't think it's off-by-one, because that kicks up the debugger... I had that happen between Problem 2 and Problem 3, but I was able to get the help on that one... nice try...


Not quite. Off-by-one errors are simply miscalculations of location by one, because you forgot to compensate for a starting point or such. First, this is not guaranteed to cause an error, if you overrun an array, so it may or may not crash/invoke debugging. This is not something you can rely on. Second, the off-by-one error may not even be causing you to overrun the array, which would not even generate a potential for an overrun, so a crash/debug wouldn't even happen. It is merely a logic off-by-one.

If you're code is removing a line above the one you want to remove, you probably do, in fact, have an off-by-one error. Check you're code for calculating which row to remove. In a C++ array, the second item is index 1.

I know only that which I know, but I do not know what I know.
I looked at your code and I'm not sure where the problem is, but I wanted to say 3 things:

1) You should create helper functions that operate on a whole row (check if it's full, clear it, ...). This will make functions like check_clear_row() much cleaner (and less error-prone!).

2) In the loop, why is the first index of the array always 0 on the right?

3) Why did you choose to have the the array as -
arr_tetris_screen[Width][Height]? Arrays are row major so switching between the width and the height will make the code more intuitive.

These are just quick suggestions, sorry if I misunderstood your code (regarding 2 and 3).
Quote:Original post by Daishim
Not quite. Off-by-one errors are simply miscalculations of location by one, because you forgot to compensate for a starting point or such. First, this is not guaranteed to cause an error, if you overrun an array, so it may or may not crash/invoke debugging. This is not something you can rely on. Second, the off-by-one error may not even be causing you to overrun the array, which would not even generate a potential for an overrun, so a crash/debug wouldn't even happen. It is merely a logic off-by-one.

If you're code is removing a line above the one you want to remove, you probably do, in fact, have an off-by-one error. Check you're code for calculating which row to remove. In a C++ array, the second item is index 1.

I understand this. It doesn't just remove the line above though, it removes every line.
Quote:Original post by Gage64
I looked at your code and I'm not sure where the problem is, but I wanted to say 3 things:

1) You should create helper functions that operate on a whole row (check if it's full, clear it, ...). This will make functions like check_clear_row() much cleaner (and less error-prone!).

That sounds good. I'll add that to the code.
Quote:
2) In the loop, why is the first index of the array always 0 on the right?

The first one of the set is always 0, because that's the first one I decided to remove. I didn't really decide to do it in any particular order, just that it's easier if I just do it from low to high to remember. I didn't entirely understand the question, so that's what I hope you're asking.
Quote:
3) Why did you choose to have the the array as -
arr_tetris_screen[Width][Height]? Arrays are row major so switching between the width and the height will make the code more intuitive.

I didn't know! Interesting... I guess width by height is just easier for me, because that way it goes along with the (x,y) coordinate system. It's just the way I tought myself, I guess.
_______________________My computer stats:Xcode 3.1.2Mac OS 10.5.8---Visual C++ 2008 Express EditionWindows XP---NetBeansUbuntu 9.04---Help needed here!
Ok, so I'm really confused about what to do... could somebody show what some pseudocode for clearing lines would look like?
_______________________My computer stats:Xcode 3.1.2Mac OS 10.5.8---Visual C++ 2008 Express EditionWindows XP---NetBeansUbuntu 9.04---Help needed here!
I'm not sure if this will work, but try it anyways.
void check_clear_row(){	int row;	// Scan through all the rows	for(row = 0; row < SCREENH - 1; row++)	{			int i;			BOOL isFull = TRUE;			// Does this row need to be cleared?			for(i = 0; i < 8; i++)			{				if(arr_tetris_screen[row] == NO_TILE) isFull = FALSE;			}			// Clear row			if(isFull)			{				int currow;				// Scan through all rows above this one, starting from this one.				for(currow = row; currow > 0; currow--)				{					// Replace this row by the one right above it					for(i = 0; i < 8; i++)					{						arr_tetris_screen[currow] = arr_tetris_screen[currow - 1];					}				}			}	}		translate();}
Quote:Original post by AcePilot
I'm not sure if this will work, but try it anyways.
*** Source Snippet Removed ***


It didn't work, thanks for trying. I located the spot in the code where the code whas wrong- and it was an off by one code error. WHOOPS! LOL New code attached, looking for new problems.
_______________________My computer stats:Xcode 3.1.2Mac OS 10.5.8---Visual C++ 2008 Express EditionWindows XP---NetBeansUbuntu 9.04---Help needed here!
I found a new problem... see above, I wrote a ton on it... dangit I thought it worked, but aparently, it didn't.
_______________________My computer stats:Xcode 3.1.2Mac OS 10.5.8---Visual C++ 2008 Express EditionWindows XP---NetBeansUbuntu 9.04---Help needed here!

This topic is closed to new replies.

Advertisement