Kodecafe - Pong
Vi vil genskabe spillet Pong i en terminal-udgave:
Pong består af en rektangulær bane med to bat og en bold. Bolden gives op i en eller anden retning og hvis den rammer den øverste eller nederste væg reflekteres den tilbage ind på banen. Hvis den rammer et bat reflekteres den tilbage mod det andet bat. Hvis den rammer væggen bag et bat, så har det andet bat vundet.
Battene her styres af en simpel (og fejlbarlig) AI, da vi ikke har mulighed for at lave bruger-input så nemt.
Download filerne nedenfor. I program.c
vil man finde den generelle struktur.
Man behøver ikke at rette i andre filer.
Funktioner der skal laves:
start_ball
: Bestem hvor bolden skal starte og hvilken retning den skal bevæge sig.update_ball
: Opdater bold-position og tjek for kollision med vægge.update_paddle
: Opdater bat-position, tjek for kollision mellem bat og væg samt kollision mellem bat og bold.check_winning
: Tjek om nogle af battene har vundet.- Returner 0, hvis ingen har vundet endnu.
- Returner -1, hvis venstre bat har vundet.
- Returner 1, hvis højre bat har vundet.
Yderligere kommentarer kan findes i program.c.
Man har selv mulighed for at bestemme hvordan spillets “look-and-feel” skal være. Fx kan man styre hvordan bolden bouncer af, når den rammer et bat eller en væg.
Man har også mulighed for at forbedre AI’en til begge bat ved at rette på paddle_AI
.
Hjælp til at komme i gang
- Download filerne nedenfor og kig dem igennem. Se hvilke steder der skal udfyldes noget.
- Ret
start_ball
: Giv bolden en start-hastighed i en retning ved at rette påvx
ogvy
. - Ret
update_ball
for at undgå at bolden ryger uden for banen ved at tjekke for kollision med vægge. Et sådant tjek kan væreif (ball->y < 1)
for at tjekke om bolden er kommet for langt op. - Ret
update_paddle
for at undgå at battene ryger ud af banen. Det er også her at kollision mellem bold og bat skal beregnes. - Ret
check_winning
: Tjek om bolden har ramt venstre eller højre væg. - Bonus: Ret
paddle_AI
for at gøre battene klogere. - Bonus: I stedet for at stoppe spillet, når en spiller har vundet, så skriv points i hver side og lad spillet køre for evigt. Dette kan gøres med
canvas_text
(sedeclare_winner
for eksempel).