]> git.armaanb.net Git - pong.git/blob - pong.c
Initial commit
[pong.git] / pong.c
1 #include <ncurses.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <unistd.h>
5
6 int
7 die(int code)
8 {
9         endwin();
10         exit(code);
11 }
12
13 int
14 main(void) {
15         int x = 1, y = 0, aoff = 0, boff = 0;
16         int max_y = 0, max_x = 0;
17         int max_y_new = 0, max_x_new = 0;
18         int direction = 1;
19         int pad_h = 5;
20         int a_score = 0, b_score = 0;
21         int slope_x = 5;
22         int slope_y = 1;
23         int index = 0;
24         int index_dir = 1;
25
26         // Initialize curses
27         initscr();
28         noecho();
29         curs_set(0);
30         nodelay(stdscr, 1); // Don't wait for getch input
31         index = max_y/2;
32         x = max_x/2;
33
34         while(1) {
35                 getmaxyx(stdscr, max_y_new, max_x_new);
36                 --max_x_new;
37                 --max_y_new; 
38                 pad_h = 0.2 * max_y;
39                 if (max_y_new != max_y || max_x_new != max_x) {
40                         clear();
41                         max_x = max_x_new;
42                         max_y = max_y_new;
43                 }
44
45                 index += index_dir;
46
47                 // Parse keypresses
48                 int key = getch();
49                 if (key == 'q') {
50                         die(0);
51                 } else if (key == 'k') {
52                         boff += 2;
53                 } else if (key == 'i') {
54                         boff -= 2;
55                 } else if (key == 's') {
56                         aoff += 2;
57                 } else if (key == 'w') {
58                         aoff -= 2;
59                 }
60
61                 // Draw paddles
62                 for (int i = 0; i < max_y; i++) {
63                         mvprintw(i, 0, " ");
64                         mvprintw(i, max_x, " ");
65                 }
66                 for (int i = aoff; i < aoff + pad_h; i++) {
67                         mvprintw(i, 0, "|");
68                 }
69
70                 for (int i = boff; i < boff + pad_h; i++) {
71                         mvprintw(i, max_x, "|");
72                 }
73
74                 for (int i = 0; i < max_y; i++) {
75                         mvprintw(i, max_x/2, ":");
76                 }
77
78                 mvprintw(0, 2, "%d", a_score);
79                 mvprintw(0, max_x - 1, "%d", b_score);
80
81                 // Move ball
82                 mvprintw(y, x, " ");
83
84                 x += direction;
85                 y = index / slope_x * slope_y;
86                 mvprintw(y, x, "o");
87
88                 // Check if touching paddle
89                 if (x == max_x) {
90                         if (y >= boff && y <= boff + pad_h) {
91                                 direction *= -1;
92                         } else {
93                                 a_score += 1;
94                                 usleep(600000);
95                                 x = max_x/2;
96                                 index = max_y/2;
97                         }
98                 } else if (x == 0) {
99                         if (y >= aoff && y <= aoff + pad_h) {
100                                 direction *= -1;
101                         } else {
102                                 b_score += 1;
103                                 usleep(600000);
104                                 x = max_x/2;
105                                 index = max_y/2;
106                         }
107                 } else if (y < 0 || y > max_y) {
108                         index_dir *= -1;
109                 }
110                 usleep(3000000 * (1.0/((double)max_x + (double)max_y)));
111         }
112 }