# Visual Basic > Games and Graphics Programming > Game Demos >  Tetris

## Jenner

I've decided to post my first major XNA work for review, criticism, etc: Tetris.

This game was originally programmed in VB.NET 2008 and XNA 3.1.  I made all the graphics myself and all the sounds effects are public domain.  The current version uploaded uses VB.NET 2010, .NET4 and XNA 4.0.  

In order for you to get the sound to work, you'll need to download bass.dll here.  It's the link at the VERY TOP of the page that says: "Platform: Win32, OSX" with two very tiny "Download" links.  The Bass.NET library found further down the page is not used.  The bass.dll file must simply be in your output directory.

If you drop OGG or MP3 files in the "Music" directory created in the output directory, it'll random shuffle them and play them as you play the game.  Once again, you need the bass.dll library to make this work.

I chose to use the Bass.dll library over the native XNA methods for it's native support of MP3s (thus making file sizes much smaller), it's easy on-demand firing of sound FX and it's simplicity.  Compared to the ugly behemoth XNA gave me which requires conversions of audio files with the XACT tool and only allowing storage of those audio files as bulky WAV files, it was a no-brainer.

The game is completely keyboard driven:
F1 = New Game
Esc = Quit Program
Left - Right Arrow Keys = Move Piece
Down Arrow = Drop Piece
Up Arrow = Rotate Piece

I tried to keep the game action as faithful to the arcade original as I could, thus, there's extensive coding in just mapping how the controls work with things like grace periods before a piece is considered "stacked" and auto-repeat for holding left and right.  I really was impressed by how much time I had to spend tweaking the controls; it was something I totally didn't expect.  Leaving the controls as simple keypresses made for lackluster game play on the early levels and immense frustration at the higher levels when pieces would unforgivingly stack as soon as they made contact.  It was certainly a learning experience.

I'm not entirely happy with the actual code I used; it's probably some of my sloppiest work, but I was trying to go for functionality over form with this project.  Plus, I upgraded the project several times without rewrite and it shows.  

Anyways, download it, compile it, tell me what you think.  Tear it apart and show me how I could have written it better or study it to learn how to make your own VB.NET/XNA games.   I appreciate all comments.  :Smilie:  

Project files only (no binary code, needs XNA installed and bass.dll): Tetris.zip

_UPDATE_:  Full solution package with binaries, bass.dll, XNA runtime installer and setup project.. 

_UPDATE_: Here is an updated version that has been modified to work in Visual Studio 2010 under .NET 4 and XNA 4.0.  This contains project files only.  You'll need bass.dll to make it work:  Tetris_NET4_XNA4.zip

----------


## Pino

I've moved this to the Game Demos Section and left a redirect in the XNA forum. I will check this out soon!

Pino

----------


## Jenner

Thanks much!  I didn't even know there was a Game Demos section!   :Smilie:

----------


## Lord Orwell

i've noticed that giving a program (a game in my experience) an update or a recode in a particular area almost always results in some ugly coding, especially when you have to nest if/thens or cases to take into account stuff like you said before.

----------


## Nightwalker83

@ Jenner,

Cool! Although, I can't open the project I download the express edition of VB2008 but when I tried to open the project I received a message saying the program was created in a newer version of VB2008.

----------


## Jenner

@Lord Orwell: I may rewrite this one soon actually.  I've learned some nifty tricks with shaders and particles that could make for some interesting effects.  I also want to have an animating backdrop as well; like in some of the arcade versions.  I've been tempted with some other projects though as of late.

@Nightwalker:  It should work just fine in VB2008 express; though when I wrote it, I used XNA 3.0.  XNA 3.1 is the new standard, and you'll probably have to replace the XNA references with those to get it to work.

----------


## Nightwalker83

Damn! I Tried opening the code using VS 2010 and the converter apparently converted the code but when I ran the code I received a big list of errors in the VS console.

Edit:

I don't have XNA! Do I need it? If so which site can I get it from?

----------


## Jenner

Straight from Microsoft.

You may need to download Visual C# Express 2008 to install it.  The installer is stupidly picky about this sort of thing.  Last time I did, I installed VC#2008, installed XNA3.1, and uninstalled VC#2008.  You can manually install it as well without having the installer scream at you that you NEED C# installed by following the instructions here.

----------


## Nightwalker83

Thanks! Great game. I managed to get up to level 2 before I had to stop.

I had to dowload/install bass.dll regardless of whether I wanted music or not. Perhaps the you could make it so the gam can still be played without bass.dll?

For those trying to figure out where to put bass.dll it seems to do in the "bin -> debug" folder if you are running the game in Visual Studios.

----------


## Jenner

Yea, I should use a little reflection to make the library link and load at runtime.  I just figured out how to do that with a small installer program I had to write that needed to open a firewall port on both Windows XP and Windows Vista/7 machines.  XP named the firewall access dll one thing, and Vista/7 named it something else.  Had to detect it and load/link it appropriately.

I have other little games that I wrote in VB.NET, but policy on here makes things a pain to post, because I'm telling everyone how to recreate my development environment. 

"Go here to get XNA, go here to get BASS, go here to get FlatRedBall, go here to get Farseer... ok, this is how you install ALL this mess...."

I understand the policy and why it exists, but it would be nice to be able to upload an install file on here just so people can easily see a program in action.  Even if you have to go through a "Are you sure you understand the risks?"  type dialog.  Maybe as a perk of high reputation on here?  Maybe I'll post that as a suggestion on the forums thread.  :Smilie:

----------


## kfcSmitty

> I understand the policy and why it exists, but it would be nice to be able to upload an install file on here just so people can easily see a program in action.  Even if you have to go through a "Are you sure you understand the risks?"  type dialog.  Maybe as a perk of high reputation on here?  Maybe I'll post that as a suggestion on the forums thread.



Actually, I was just informed (and then read the rules again just so I was up to date) but you are allowed to post executables in this section. So if you wanted to post an installer, it would be ok in the Game Demos section.

The only drawback being that people are hesitant of downloading exes, but when someone with your rep and post count puts something up, I'm sure most people wouldn't hesitate much.

----------


## Jenner

Oh that's cool.  Yea, I think I will post up a zip to an installer that'll install the XNA runtimes, BASS.dll, etc.   That way, people don't need to elaborately recreate my development environment.  :Big Grin:

----------


## Nightwalker83

> Actually, I was just informed (and then read the rules again just so I was up to date) but you are allowed to post executables in this section. So if you wanted to post an installer, it would be ok in the Game Demos section.


Yeah, I was informed by Penagate via pm about that.

----------


## Gamemaster1494

Okay. =) Good game! =D Fun, and informative. Some comments on code would be nice.... =D

----------


## Jenner

Having some time lately, someone requested I upload my full Tetris solution, binary, installer and all.  I finally did so and it is available here.  

The installer in the TetrisSetup project comes with the XNA 3.1 runtime package, but not .NET 3.5 or Windows Installer 3.1 (I assume you have those already).  In the Tetris project, I left the release source if you didn't want to recompile it yourself.  I also included the aforementioned bass.dll.   

Have fun!

----------


## WhiteBabylon

> Having some time lately
> .....
> Have fun!


Hey Jenner, I saw a post you made here:
showthread.php?t=625045 
and this has really helped me with starting out 3D visual basic programming. 

I was going to start with a cube.. and then branch into a 3D tetris game. And then to my looking about I found this where you yourself made a tetris game.
I tried to find out how to PM you, but I failed. I made an account just to say wow, we must have a lot of the same interests.
I myself love tetris! I actually spent three days making my own visual basic tetris before I started digging around with 3D things.
youtube.com/watch?v=VFywKMim4yc would demonstrate the attempt I made.
Maybe you can teach me to be elite, for I am newb. lol

----------


## Lord Orwell

> Thanks much!  I didn't even know there was a Game Demos section!


i didn't know there was an xna forum!

----------


## Jenner

Awesome WB!  Yea, I love Tetris too and decided it would be a great choice to teach myself game programming.  It was a rough lesson too!  Learning XNA wasn't too hard.  Adapting it for use in VB.NET was the tricky part.  I don't blame Lord Orwell for switching to C#; it certainly makes trolling the forums easier.

But I love VB and I saw no reason why I couldn't use VB.NET with XNA.  I'm glad I did, because once I had the basics down, it was ridiculously easy..

----------


## Lord Orwell

> Awesome WB!  Yea, I love Tetris too and decided it would be a great choice to teach myself game programming.  It was a rough lesson too!  Learning XNA wasn't too hard.  Adapting it for use in VB.NET was the tricky part.  I don't blame Lord Orwell for switching to C#; it certainly makes trolling the forums easier.
> 
> But I love VB and I saw no reason why I couldn't use VB.NET with XNA.  I'm glad I did, because once I had the basics down, it was ridiculously easy..


what other games have you worked on?

----------


## Jenner

Actually finished projects, I don't have many.  Tetris was my first XNA project, and the only one that uses XNA exclusively.  After Tetris, I discovered some game engines that work in conjunction with XNA as well as things like audio engines, physics libraries, lighting and rendering systems...  One of those "learning curve" things I learned about game programming is that it's like a salad bar.  

Salad bars are filled with all sorts of things you use to make a salad with; you take some and leave the rest.  Game programming is like that though.  There are engines, tools, APIs, all sorts of things out there to help you make a killer game.  When programming games, you need to "explore the salad bar".  A game made with VB.NET alone can certainly be done; but like a salad bar, there are other things you can pile on the plate to make it better.

I've got a lot of unfinished test projects.  I made both a pac-man and space invader's game.  Not refined enough to really play too hardcore.  Both games just lack polishing; the space invaders needs better art and the pac-man becomes unplayable at later levels.   I did some platforming examples, but I'm not really a platform player so I never did anything with them besides a gravity simulation and edge detection.  I have some 3D projects as well, some using the Torque XNA game engine.

I have a 100&#37; working layered tile engine I wrote in VB.NET, XNA and FlatRedBall for making a game like final fantasy 6 or Ultima 5, but haven't made any games with it yet and want to write some better world-building tools first.  I also want to do some work on the script engine for scripting sequences.  

I'm also working on crime-lord based game using VB.NET, XNA and FlatRedBall.  It's somewhat of a simulation game as you build a criminal network and thus, a crime empire.  As you get larger, you begin to attract more attention to your organization and thus, need to put more time and efforts into protecting it.  It's about 30% done and I'm deciding if I want to make it real-time where actions happen on a timer or turn-based more like a 4X game.  I can go either direction at this point since the AI is pretty rudimentary.  It's my current game project I've been playing with for the last three-four months now.  I don't get much time to program for myself anymore.

----------


## Lord Orwell

i was just about to start work on a layered tile engine.  Can you tell me how you did the land structure?  I've been wondering the best way to serialize it.

----------


## Jenner

I wrote a program that stores the map data as bitmap files.  It's a basic map builder/editor program.  Each discrete color of the bitmap corresponds to a tile.  myland_0.bmp is my base-layer.  myland_1.bmp is the first layer on top that.  You can further save space by then saving the bitmaps in a non-lossy graphic format.  It makes the files extremely tiny.  The correspondence table that maps colors to tile-files is just XML.  This file also holds the information about the tile such as if a player or monster can move through it or not.  The game, when loading a new map then just reverses the process.  Nice part is, if you want, you can tweak the maps in a graphics editor like Paint.  

The engine pre-loads my tilesets, reads the map file, and assembles the map graphic in memory as a sprite.  It does this for each layer.  Then, it draws those on the screen during the render loop.  Since each map is at most 3-4 layers, it's only displaying 3-4 sprites, thus it's fast.  Monsters, objects, NPCs, the player... are all their own sprites at some layer-depth; I believe they're all at layer 5 by default unless told to be drawn otherwise.  My maps are typically 0 being water and hole fields, 1 being the main terrain with transparent edge-pieces that overlap the water and hole pieces, 2 being things like walls, structures, tree-trunks, and then I skip up to 8 for tree-tops, roofs, things that obscure the view of characters/etc.  

When it creates the layer-sprites, it also makes collision zones around non-movable tiles.  I can then use the collision detection of the FlatRedBall engine as a control for boundaries.

----------


## WhiteBabylon

I started using MySQL to make an mmorpg. rofl. literally just started. I got it so when you log in your a cube.. and when you move your cube around it shows it on all other windows logged in. <_<

----------


## NancyMerrison

Nice game . Thank you.

----------

