3 * Released under Creative Commons
7 * - ansi terminal with resolution >= 80x24 characters
17 int turntime
= 25; //Time of turn in ms (inverted speed)
18 int debugturntime
= 0; //Turntime for debuging
20 unsigned char padsize
= 1; //Size of pad
21 char padspeed
= 2; //Speed of pad (pixels per keypress)
23 unsigned char ui_skill_l
= 255; //Skill of UI = (0-255); 0=disabled, 255=godmode
24 unsigned char ui_skill_r
= 200; //Skill of UI = (0-255); 0=disabled, 255=godmode
25 unsigned char debug
= 0; //UI Debug mode
27 unsigned char music
= 0; //Enable music? (Bool)
28 char music_cmd
[] ="while true; do mplayer /usr/share/chiptunes/* >/dev/null 2>&1; done;";
30 unsigned char arduino
= 0; //Enable Arduino? (Bool)
31 char arduinodev
[] = "/dev/ttyUSB0";
34 unsigned char *stadium_bitmap
[] = {
35 "#### hPong 0.3 ################################################",
51 "########################################### <~~Harvie 2oo8 ####"};
52 char stadium_lines
= 17; //15+2
53 char stadium_width
= 63; //60+2+1
56 unsigned char banner_start
[] =
57 "\n\n\n\n\n\n\n\n\n\n\n"
58 " ## #### by: <~~Harvie 2oo8\n"
60 " ## ## ## #### ### #### ###\n"
61 " ####### ###### # # # # # # #\n"
62 " ## ## ## # ### # # ####\n"
64 " ## Press any key to start! ###\n";
66 unsigned char banner_lose
[] =
67 "\n\n\n\n\n\n\n\n\n\n\n\n\n"
68 " ### # # ### # # # ### #\n"
69 " # # # # # # # # # #\n"
70 " # # ### ### ### # # #\n"
71 " # # # # # # # # #\n"
72 " ### # # ### # # # # #\n"
75 " (Press Any Key to continue...)\n";
78 char stadium_offset
= 7;
79 char score_space
[] = " ";
80 unsigned char *num_bitmaps
[]={
81 "#### ## ## ####", //0
90 "#### #### ####"}; //9
93 char stadium_max
; //Set by init()
97 char ballmove_c
= 1; //x
98 char ballmove_l
= 1; //y
100 char player_l
= 7; //Left
101 char player_r
= 7; //Right
103 unsigned int score_l
= 0;
104 unsigned int score_r
= 0;
109 FILE *musicfd
= NULL
;
110 FILE *arduinofd
= NULL
;
114 printf("\033[2J"); //Clear screen
115 printf("\033[0;0H"); //L:C = 0:0
119 if(arduino
) fclose(arduinofd
);
121 system("stty icanon");
123 printf("hPong exited! Scrore was %d : %d\n<~~Harvie 2oo8\n", score_l
, score_r
);
125 if(music
) pclose(musicfd
);
129 if( (musicfd
= popen(music_cmd
, "r"))==NULL
) {
130 printf("Cannot initialize music\n");
135 void win(char player
) {
139 ball_l
= 2; ball_c
= stadium_width
-3; ballmove_c
= -1;
144 ball_l
= 2; ball_c
= 3; ballmove_c
= 1;
148 printf(banner_lose
, score_l
, score_r
);
150 if(!arduino
&& (ui_skill_l
== 0 || ui_skill_r
== 0)) getchar();
155 printf("\033[0;0H"); //L:C = 0:0
158 void pixel(char c
, char line
, char col
) {
159 printf("\033[%d;%dH", line
, col
);
161 printf("\033[0;0H"); //L:C = 0:0
164 void draw_stadium() {
165 unsigned char i
, x
, sl
, sr
;
166 sl
= score_l
%10; sr
= score_r
%10;
167 for(i
=0;i
<stadium_offset
;i
++) {
171 printf("%s%c%c%c . %c%c%c", score_space
,
172 num_bitmaps
[sl
][x
], num_bitmaps
[sl
][x
+1], num_bitmaps
[sl
][x
+2],
173 num_bitmaps
[sr
][x
], num_bitmaps
[sr
][x
+1], num_bitmaps
[sr
][x
+2]
178 for(i
=0;i
<stadium_lines
;i
++) printf("%s\033[K\n", stadium_bitmap
[i
]);
184 if((unsigned char)rand() < ui_skill_l
) { //Left
185 if(player_l
< ball_l
) player_l
++;
186 if(player_l
> ball_l
) player_l
--;
189 if((unsigned char)rand() < ui_skill_r
) { //Right
190 if(player_r
< ball_l
) player_r
++;
191 if(player_r
> ball_l
) player_r
--;
195 ball_c
+= ballmove_c
;
196 ball_l
+= ballmove_l
;
199 if(ball_c
== 1) { //left
200 if(abs(ball_l
-player_l
) <= padsize
+1) {
201 ballmove_c
= -ballmove_c
;
208 if(ball_c
== stadium_width
-3) { //right
209 if(abs(ball_l
-player_r
) <= padsize
+1) {
210 ballmove_c
= -ballmove_c
;
217 //Bounce ball (vertical)
218 if(ball_l
>= stadium_max
|| ball_l
<= 0) ballmove_l
= -ballmove_l
;
229 //Check player pos limits
230 if(player_r
< 0) player_r
= 0;
231 if(player_r
> stadium_max
) player_r
= stadium_max
;
233 if(player_l
< 0) player_l
= 0;
234 if(player_l
> stadium_max
) player_l
= stadium_max
;
237 for(i
=-padsize
;i
<padsize
+1;i
++) pixel(pixchar
, stadium_offset
+2+i
+player_l
, 2);
238 for(i
=-padsize
;i
<padsize
+1;i
++) pixel(pixchar
, stadium_offset
+2+i
+player_r
, stadium_width
-1);
241 pixel(pixchar
, stadium_offset
+2+ball_l
, 2+ball_c
);
252 void control(unsigned char key
) {
254 case 'A': player_r
-=padspeed
; break; //A = Arrow UP
255 case 'B': player_r
+=padspeed
; break; //B = Arrow DOWN
260 case 'e': case 'E': player_l
-=padspeed
; break; //e key
261 case 'd': case 'D': player_l
+=padspeed
; break; //D key
267 void alarm_handle(int signo
) {
270 if(signo
== SIGTERM
|| signo
== SIGINT
|| signo
== SIGQUIT
) quit();
276 //Init random generator
278 //Disable both input buffers
280 system("stty -icanon");
281 //Handle alarm (timer)
282 signal(SIGALRM
, alarm_handle
);
283 signal(SIGINT
, alarm_handle
); signal(SIGTERM
, alarm_handle
); signal(SIGQUIT
, alarm_handle
);
284 //Compute lower sprite position in stadium
285 stadium_max
= stadium_lines
- 3;
287 if(debug
) turntime
= debugturntime
;
289 if( arduino
&&((arduinofd
=fopen(arduinodev
,"rb"))==NULL
) ) {
290 printf("Cannot open %s\n", arduinodev
);
295 //Main... Short & simple ;)
301 if(music
) music_start();
304 ualarm(turntime
*1000+1, turntime
*1000+1);
306 if(arduino
) player_r
= getc(arduinofd
); //Arduino
307 else control(getchar()); //Keyboard
This page took 0.599133 seconds and 4 git commands to generate.