From ce6d47845e1e00e6935682fafd7f29daf8f2317f Mon Sep 17 00:00:00 2001 From: Colton Staiduhar Date: Sun, 26 Apr 2026 16:33:55 -0400 Subject: [PATCH] Paddle and Ball --- include/object.h | 37 ++++++++++++++++ src/ball.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++ src/paddle.c | 69 +++++++++++++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 include/object.h create mode 100644 src/ball.c create mode 100644 src/paddle.c diff --git a/include/object.h b/include/object.h new file mode 100644 index 0000000..5a7c5b2 --- /dev/null +++ b/include/object.h @@ -0,0 +1,37 @@ +#ifndef GAME_PADDLE_H +#define GAME_PADDLE_H 1 + +#include "game.h" + +typedef struct { + int column; + int pos; + int height; + char c; +} Paddle; + +Paddle CreatePaddle(GameData* gd); +void DrawPaddle(Paddle*); +void MovePaddleUP(Paddle*); +void MovePaddleDown(Paddle*); + +typedef struct { + float x; + float y; + + int lastCharX; + int lastCharY; + char c; + int visible; + float vx; + float vy; +} Ball; + +Ball CreateBall(GameData* gd); +void DrawBall(Ball*); +void UpdateBall(Ball* ball, Paddle* paddle); +int CheckBallLose(GameData* gd,Ball* ball); +int CheckBallCourtChange(GameData* gd,Ball* ball); +void HideBall(Ball* ball); +void ServeBall(Ball* ball, GameData* gd); +#endif \ No newline at end of file diff --git a/src/ball.c b/src/ball.c new file mode 100644 index 0000000..5436252 --- /dev/null +++ b/src/ball.c @@ -0,0 +1,113 @@ +#include "../include/object.h" + +#include +#include + +Ball CreateBall(GameData* gd) +{ + Ball b; + b.visible = false; + b.c = 'O'; + b.y = TOP_ROW + 3; + b.x = RIGHT_COL - 3; + b.lastCharX = 0; + b.lastCharY = 0; + + b.vx = -0.2; + b.vy = 0.2; + + return b; +} +void UpdateBall(Ball* ball, Paddle* p) +{ + int x = ball->x; + int y = ball->y; + + float nx = ball->x + ball->vx; + float ny = ball->y + ball->vy; + + if (floor(ny) == TOP_ROW || floor(ny) == BOT_ROW) { + ball->vy = -ball->vy; + ny = ball->y + ball->vy; + } + + if (floor(nx) == p->column) { + if (ny >= p->pos && ny < p->pos + p->height) { + ball->vx = -ball->vx; + nx = ball->x + ball->vx; + } + } + + ball->x = nx; + ball->y = ny; + + int ncx = ball->x; + int ncy = ball->y; + + // if x y changes then re-draw + if (ncx != x || ncy != y) + DrawBall(ball); +} + +int CheckBallLose(GameData* gd, Ball* ball) +{ + int loseCol = 0; + if (gd->host) { + if (ball->x <= LEFT_COL) { + return true; + } + } else if (ball->x >= RIGHT_COL) + return true; + return false; +} + +int CheckBallCourtChange(GameData* gd, Ball* ball) +{ + if (gd->host) { + if (ball->x >= RIGHT_COL) { + return true; + } + } else if (ball->x <= LEFT_COL) + return true; + return false; +} + +void DrawBall(Ball* ball) +{ + int x = ball->x; + int y = ball->y; + + char lastChar = mvinch(ball->lastCharY, ball->lastCharX) & A_CHARTEXT; + if (lastChar == ball->c) + mvaddch(ball->lastCharY, ball->lastCharX, ' '); + + mvaddch(y, x, ball->c); + ball->lastCharY = y; + ball->lastCharX = x; + + refresh(); +} + +void HideBall(Ball* ball) +{ + ball->visible = false; + char lastChar = mvinch(ball->lastCharY, ball->lastCharX) & A_CHARTEXT; + if (lastChar == ball->c) + mvaddch(ball->lastCharY, ball->lastCharX, ' '); +} + +void ServeBall(Ball* ball, GameData* gd) { + ball->visible = true; + + float middle = TOP_ROW + (BOT_ROW-TOP_ROW)/2; + ball->y = middle; + + if (gd->host) + ball->x = RIGHT_COL-2; + else ball->x = LEFT_COL + 2; + + + ball->vx = -0.2; + ball->vy = 0.2; + if (!gd->host) ball->vx *= -1; +} \ No newline at end of file diff --git a/src/paddle.c b/src/paddle.c new file mode 100644 index 0000000..bcc0af6 --- /dev/null +++ b/src/paddle.c @@ -0,0 +1,69 @@ +#include "../include/object.h" + +#include + +Paddle CreatePaddle(GameData* gd) +{ + Paddle p; + GameData data = *gd; + + // Set Column + if (data.playerNumber == 0) + p.column = LEFT_COL + 2; + else + p.column = RIGHT_COL - 2; + + // Paddle height + p.height = 5; + + // Find Middle of screen; + float middle = (BOT_ROW - TOP_ROW) / 2.0f; + middle -= p.height / 2; + + // Set Y value to the top of the screen + p.pos = TOP_ROW + middle; + + // Set char + p.c = '#'; + + return p; +} + +void DrawPaddle(Paddle* paddle) +{ + Paddle p = *paddle; + for (int i = 0; i < p.height; ++i) { + move(p.pos + i, p.column); + addch(p.c); + } + + char topchar = mvinch(p.pos - 1, p.column) & A_CHARTEXT; + if (topchar == p.c) + mvaddch(p.pos - 1, p.column, ' '); + char bottomchar = mvinch(p.pos + p.height, p.column) & A_CHARTEXT; + if (bottomchar == p.c) + mvaddch(p.pos + p.height, p.column, ' '); + + move(p.pos, p.column); + refresh(); +} + +void MovePaddleUP(Paddle* paddle) +{ + int newPos = paddle->pos - 1; + + if (newPos > TOP_ROW) { + paddle->pos = newPos; + } + DrawPaddle(paddle); +} + +void MovePaddleDown(Paddle* paddle) +{ + int newPos = paddle->pos + 1; + + if (newPos + paddle->height <= BOT_ROW) { + paddle->pos = newPos; + } + DrawPaddle(paddle); +} \ No newline at end of file