Login [Register]
Don't have an account? Register now to chat, post, use our tools, and much more.
Laser Game CSE
When I was young, I played a very nice game with a laser and a target. Now I remembered that and I want to make it for my calc. So I started and voilą, here is my game.

Things to do:
- Winner/loser check
- Multiple levels
- A better look-up
And probably a lot more.

The most tricky part, is some seq(real( stuff, which works, as I don't expected.

Here's a .gif of it Smile (sorry, it is a bit laggy)

And here is the full code, optimizations are welcome.

Code:
ClrHome
If 80>det([[20
Then
   Disp "Get DoorsCSE to run this:","http://dcs.cemetech.net"
   Return
End
DelVar [A]{15,20->dim([A]
"rowSwap(LASER3"->Str0
1:det(0
expr(Str9->A
2:det(0
expr(Str9->B
For(A,1,dim(|LB
   1->[A](|LB(A),|LA(A
End
"LASER"
real(5,0,0
3:det(0
real(0,1,1
seq(real(3,0,0,0,20,9,0,0,19,14,X),X,1,0,~1
DelVar ADelVar BDelVar KWhile min(Ans!={9,55
   max(1,min(20,A+sum(DeltaList(K={2,3->A
   max(1,min(15,B+sum(DeltaList(K={4,1->B
   For(C,1,2
      real(7,8,8A-8,8B-8,8,8,1
      real(7,8,8A-8,8B-8,8,8,0
   End
   If [A](B,A) and max(K={49,53
   Then
      2+(K=49->[A](B,A
      8A-8->S
      8B-8->T
      seq(real(7,5,S,Ans+7,S+7,Ans,128+103(K=53),X),X,1,0,~1
      seq(real(7,5,S,T,S+7,T+7,231-103(K=53),X),X,1,0,~1
   End
   real(2,0,0->K
End
If K=55
   Goto A
164->A
64->B
DelVar D~1->C
Repeat A<8 or A>164 or B<4 or B>126
   real(7,3,A-8,B-4,255,1,1
   real(7,3,A-8,B-4,255,1,0
   A+C->A
   B+D->B
   If not(max(fPart(8^^-1{A-4,Ans
   Then
      [A](B/8,A/8-.5->S
      If 1<Ans
      Then
         C->E
         Dnot(C)(1-2(S=3->C
         Enot(D)(1-2(S=3->D
      End
   End
End
Lbl A
seq(real(0,3,4,255,X),X,1,0,~1
real(0,1,0,1

When all is ready, I want to upload it to the Archives. Hope you enjoy it!
That is a very cool idea! I assume there is a map that is generated, and you make the line to guide the pixel? How is the map generated?

I can't wait for a download! Smile
Hey this looks really good!

I was wondering if the line colour was configurable?
Are you talking about Laser Mayhem, of which Badja also made a superb TI-83+ port?
Unicorn wrote:
That is a very cool idea! I assume there is a map that is generated, and you make the line to guide the pixel? How is the map generated?
I made a map with real(3,0 etc, but since it exists only of yellow squares, I might change that.
And the program didn't draw the white line, that is the pixel, since I don't erase it.
tr1p1ea wrote:
I was wondering if the line colour was configurable?
Yet not, it is now white, but I might implement it.
KermMartian wrote:
Are you talking about Laser Mayhem, of which Badja also made a superb TI-83+ port?
No, I've never seen this before.

If I can find the original game again, I will post a link.
Ah, I see, it is quite a bit different from Laser Mayhem at second watching. In this game, you place the mirrors everywhere, while in Laser Mayhem, there are a few mirrors that you can turn (and other obstacles you can manipulate), but everything on the map is already there. I stared at your laser movement loop for a bit, trying to figure out how it could be optimized a bit, and two things jump out to me:
1) You should switch the map to the active GRAM when the laser starts being fired, and then just draw on the active (on-screen) GRAM without flipping buffers. This will be a lot faster than displaying to both buffers. In other words, assuming that you flipped the active GRAM onto the LCD before the loop, you'd only need the second line of this:
Code:
   real(7,3,A-8,B-4,255,1,1
   real(7,3,A-8,B-4,255,1,0

2) Your not(max(fPart line, which I believe checks whether A-4 mod 8 or B mod 8 are zero, seems overly complex for what it does, but I'm not sure what a better solution is. I assume that not(min(remainder({A-4,Ans},8 is not an option?
very cool! there's a game similar to this on lumosity, except it's where you have to look at the board for a few seconds, then it disappears, and you have to guess where the ball ends. just like how your laser bounces off the mirrors.
KermMartian wrote:
Ah, I see, it is quite a bit different from Laser Mayhem at second watching. In this game, you place the mirrors everywhere, while in Laser Mayhem, there are a few mirrors that you can turn (and other obstacles you can manipulate), but everything on the map is already there. I stared at your laser movement loop for a bit, trying to figure out how it could be optimized a bit, and two things jump out to me:
1) You should switch the map to the active GRAM when the laser starts being fired, and then just draw on the active (on-screen) GRAM without flipping buffers. This will be a lot faster than displaying to both buffers. In other words, assuming that you flipped the active GRAM onto the LCD before the loop, you'd only need the second line of this:
Code:
   real(7,3,A-8,B-4,255,1,1
   real(7,3,A-8,B-4,255,1,0

Wow, thank you a lot! And then I can save even more bytes by saying real(8,1,not(real(8,0 at the beginning, and then never update the LCD, always use real(....,0). I'm yet under the 700 bytes, with loser/winner detection!
I finally worked on it and it is finished now! (v1.0)
Take a look Smile

And the code, optimizations are always welcome Smile. In a few days I will upload it to the Archives.

Code:
ClrHome
If 80>det([[20
Then
   Disp "Get DoorsCSE to run this:","http://dcs.cemetech.net
   Return
End
Lbl 4
Menu("LaserGame CSE","Play",1,"Settings",2,"Quit",3
Lbl 3
Disp "Made by Peter Tillema
Return
Lbl 2
ClrHome
Disp "Color laser (1-255):
Repeat K=105
   getKey->K
   Output(2,1,"<
   Output(2,2,Z
   Output(2,3+int(log(Z)),"> 
   min(255,max(1,Z+sum(DeltaList(K={24,26->Z
End
Goto 4
Lbl 1
DelVar [A]{15,20->dim([A]
"rowSwap(LASER3->Str0
1:det(0
expr(Str9->A
2:det(0
expr(Str9->B
real(0,1,1
real(8,1,not(real(8,0
"real(7,8,8A,8B,8,8->Str5
Repeat A=136 and B=127
   real(0,3,4,0
   For(A,1,dim(|LB
      1->[A](|LB(A),|LA(A
      real(7,9,8|LA(A)-8,8|LB(A)-8,8,8,231
   End
   real(7,5,159,56,160,64,224
   real(7,5,128,119,136,119,224
   DelVar ADelVar Bexpr(Str5
   DelVar KWhile min(K!={9,55
      real(2,0,0->K
      If K
      Then
         expr(Str5
         max(0,min(19,A+sum(DeltaList(K={2,3->A
         max(0,min(14,B+sum(DeltaList(K={4,1->B
         If [A](B+1,A+1) and max(K={49,53
         Then
            2+(K=49->[A](B+1,A+1
            real(7,9,8A,8B,8,8,231
            real(7,5,8A,8B+7(K=49),8A+7,8B+7(K=53),128
         End
         expr(Str5
      End
   End
   If K=55
   Then
      real(0,3,4,255
      real(0,1,0,1
      Goto 4
   End
   expr(Str5
   160->A
   64->B
   {~1,0->X
   Repeat 78<abs(A-82) or 61<abs(B-65
      real(7,3,A-4,B-4,Z,1
      A+|LX(1->A
      B+|LX(2->B
      If not(max(remainder({A,Ans},8
      Then
         [A](B/8,A/8
         If 1<Ans
            not(|LX)sum(|LX)(5-2Ans->X
      End
   End
End
real(0,3,4,255

As you can see, I made a homescreen, where you can edit the color of the laser too. Everyone may test it ofc. The appvar looks like

Code:
{7,7,8,8,8,9,9,9,9,13,13,13,13,15,15,16,16,16,17,17,17,18,18
{6,10,5,6,7,5,6,7,10,2,6,7,8,5,7,7,8,9,2,7,9,5,6
The first line are the x-values, the second one the y-values. I must add multiple levels but hadn't enough free time yet.
It looks like at the end of the prog you have a bit of a dirty home screen... You can see the 255 thing or whatever still on the top row.

Also, if you want to take the time, you could make your program look much better with a custom menu, at the cost of size of course. My idea is that you could have like lasers and mirrors on the sides of the menu that kind of depict what the game's about. Then in the center would be your different menu options.
Michael2_3B wrote:
Also, if you want to take the time, you could make your program look much better with a custom menu, at the cost of size of course. My idea is that you could have like lasers and mirrors on the sides of the menu that kind of depict what the game's about. Then in the center would be your different menu options.
Thanks, do you mean something like this, or should I use the Text(-command?

And yes, the laser is very very slow, if someone can make it faster, here is the code:

Code:
real(0,3,4,255,1
real(0,3,4,255,0
real(8,1,0
"LaserG
real(6,0,112,40,0,33,1
"ame CSE
real(6,0,0,40,0,33,1
"Play!Sett!Quit
real(6,0,127,48,0,33,1
"ings
real(6,0,0,56,0,33,1
real(7,8,105,37,160,38,1
real(7,8,~1,37,60,38
0->A
160->C
120->D
~2->E
~1->F
real(8,1,1
Repeat K=105
   getKey->K
   real(8,0->G
   real(8,1,0
   ">"
   real(6,0,112,48+8A,0,33,0
   If K
      real(7,9,112,48+8A,8,8,255
   max(0,min(2,A+sum(DeltaList(K={25,34->A
   real(8,1,G
   not(real(8,0
   If Cnot(Ans)>58 or D<37 or D>75 or CAns<105 and Ans
      real(7,3,C,D,7,1,0
   C+E->C
   D+F->D
   real(8,0
   If C=160not(Ans
   Then
      160Ans->C
      real(8,1,not(real(8,0
   End
   If D=120 or not(D
      ~F->F
   If not(C or real(8,0)) or C=160real(8,0
      ~E->E
End
Ooh, that's actually not what I was thinking, but it does look pretty cool. If you were going to keep it though it should be much faster.

What I was thinking is just a static background image showing mirrors and lasers going everywhere, bouncing off them or whatever. You could try to add some animations on it but if you do it needs to be relatively fast to be worth it.

Edit: I do like the custom menu btw. It is pretty generic, but that should be fine Smile
Why don't' you draw the laser using real(7,5 (DrawLine) to draw the laser?

Here.
First of all, I prefer a continuing laser, which is only possible with SetPixel.
Next, when doing that, I must always draw lines of 4 pixel, which would be (I think) difficult.
Oh, and do you like my homescreen?
Oh, that looks great! Just get rid of the status thing.
I've uploaded it to the Archives.
The only thing I need to do is create more levels, and of course then the possibility to choose a level before start.
Unicorn wrote:
Oh, that looks great! Just get rid of the status thing.
Thanks, and I did it. Check it out!
I'd recommend either slowly animating the menu drawing while the menu is running in the foreground (just add it stepwise while the getkey loop is running) or caching the menu in a picture after the first call and recalling it every time the menu is drawn, then deleting the cache pic at exit, because even that half second looks annoying. But other than that it looks good!

Edit: Maybe it also would be good animating something like an explosion on the tile that gets hit by the laser (game won) and putting a game won screen after that. Just an idea.
Hmm this game is almost an except clone of my game lazer! Shock (Which is for the ti83+/ti84+)Except mine has portals and other goodies in the newer version Razz Do to the fact that I am not a shameless advertiser, I will not post the link to it here unless someone wants it Wink

Side note: Hello cemetech!
That title screen is amazing Very Happy. Also the game seems well-done so far for this calc. I will definitively give it a try when it comes out.
  
Register to Join the Conversation
Have your own thoughts to add to this or any other topic? Want to ask a question, offer a suggestion, share your own programs and projects, upload a file to the file archives, get help with calculator and computer programming, or simply chat with like-minded coders and tech and calculator enthusiasts via the site-wide AJAX SAX widget? Registration for a free Cemetech account only takes a minute.

» Go to Registration page
Page 1 of 1
» All times are GMT - 5 Hours
 
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

 

Advertisement