return to table of content

Show HN: Pong Wars

archon1410
28 replies
21h24m

The code links this tweet as the source of the idea: https://twitter.com/nicolasdnl/status/1749715070928433161 [nitter: https://nitter.net/nicolasdnl/status/1749715070928433161]

Quote: "The endless fight for #genuary23 #genuary #genuary2024

It's not an original idea, I've seen this before but couldn't put a hand on it."

It says the battle is endless. I wonder if there's any way to mathematically prove that.

barnabee
6 replies
20h47m

It would be interesting to know if it can get into a looping state after which it just repeats previous moves forever. I guess that would be an “end” of sorts.

cjg
5 replies
19h36m

Because there are a finite number of states, it will always loop.

An interesting question might be around how many distinct loops there are and whether there's some pattern to the loop lengths.

schwartzworld
4 replies
17h34m

Because there are a finite number of states, it will always loop.

No it wouldn't. The fact that it will pass through every state infinite times doesn't mean it will do it in the same order each time. Each digit of pi has only 10 possible states, but it never loops.

tedsanders
3 replies
17h20m

If the state evolution:

(a) is deterministic

(b) depends only on the current state, and

(c) can only occupy a finite number of states

then it will loop.

Pi digits do not satisfy this because while the digit space is finite (10), the next digit depends on more than just the prior digit.

Related (but not the same): https://en.wikipedia.org/wiki/Poincaré_recurrence_theorem

bobsmooth
1 replies
16h3m

The speed of the balls are changed by a small random amount when they hit a tile, so it's not deterministic.

Scarblac
0 replies
9h28m

If it's a deterministic RNG then it just means the state space is very large.

BriggyDwiggs42
0 replies
16h52m

Ooh that’s cool I’ve never seen that before.

baq
4 replies
21h21m

By definition… if there’s no end condition, it won’t end ;)

praptak
2 replies
21h13m

On top of this there's a negative feedback loop. The ball whose territory gets smaller has less distance to travel between hits.

This means that even if there was anything resembling a "win" condition it would be hard to achieve.

yellowapple
0 replies
19h48m

One possible win condition would be a ball reaching the opponent's side. That happened in my case, with "night" eventually breaking through to the left-most edge.

mrec
0 replies
20h44m

You'd think, but I'm currently looking at a 161/863 split which has been pretty stable for a while now. I thought at first that ball speed is being scaled by territory size to cancel out the negative feedback, and the "winning" ball is moving noticeably faster than the losing one, but I can't see that being deliberate in the code. (There is some randomization of speed on a bounce, but it ought to be pure noise.)

EDIT: 120/904 now.

keyle
0 replies
19h3m

Which makes the name War even better. There is no winner in war and the cycle repeats itself.

lou1306
3 replies
4h6m

It should suffice to check out what happens (code-wise) if one of the "players" has only one square left. Does the "winning" player have a chance to hit that square and conquer it? Or does the program immediately register a collision for the "losing" player, who goes back to two squares?

onionisafruit
2 replies
3h19m

That could show that it’s endless, but it wouldn’t necessarily show that an end is possible.

noSyncCloud
1 replies
3h4m

I don't believe an end is possible. As one player's territory sprinks, it should quite naturally follow that it will have less travel time, hence more collisions.

noSyncCloud
0 replies
3h3m

s/sprinks/shrinks

eps
3 replies
19h36m

The smaller the area, the more bounces its ball gets per time unit compared to the opponent and more chances to expand the area. So any extreme case of one ball being super-confined will be very short-lived.

realPubkey
2 replies
18h0m

But it seems that the balls speed increases with a bigger are.

throwup238
0 replies
16h4m
teraflop
0 replies
16h3m

From what I can see from a quick glance at the code, you have the causality backwards. Each bounce adds a small random variation to each ball's velocity, and if one of them randomly ends up moving faster, then it will tend to gain more territory.

sgtnoodle
1 replies
21h14m

Well, it seems like there must be a relatively stable equilibrium. As the owned area decreases, the rate of annexation increases.

GolfPopper
0 replies
17h33m

Mine seems to have reached a meta-stable state after running for a few hours around 320/704, where the ball with less area is bouncing almost vertically, and a nearly flat border between the two.

https://i.ibb.co/7bNTtsK/daynight.png

geraneum
1 replies
8h33m

The first time I opened the link, I kept watching until both balls ended up in a point where they blocked each other between opposite side’s tiles. The was no way to go and they kept bouncing off each other in a tiny space. I wouldn’t call it an end but there was no progress anymore either.

soneca
0 replies
7h33m

I got to a similar place, but it only lasted one or two seconds, then they got separated and the game continued

nonfamous
0 replies
1h53m

I didn’t grab a screenshot, but I did see how the simulation can end. The day and night balls collided with each other at the boundary and got locked in place in a tight infinite loop, and never moved again.

hombre_fatal
0 replies
20h0m

You can see what happens when the left ball has one tile and the right ball has the rest of the tiles:

    x1 = y1 = y3 = squareSize, x2 = canvas.width - squareSize
    squares = Array.from({ length: numSquaresX }, (_, i) =>
        Array.from({ length: numSquaresY }, (_, j) => 
            i === 0 && j === 0 ? TEAM1 : TEAM2))

conductr
0 replies
20h51m

Each ball will occupy a minimum area of 1x1, so the opposing ball can never occupy 100%

bazzargh
0 replies
17h49m

I think further back, part of the idea may have been mine.

https://hachyderm.io/deck/@bazzargh/111829275276749971

Originally I saw https://twitter.com/CasualEffects/status/1390290306206216196 which the author says was based on a pico8 original (which I remember seeing, but can't find now). Those earlier ones had the pong bats as well, but when I did the demake in basic, I couldn't fit the code into a tweet to get the bbcmicrobot to run it. So, I removed the bats.

Mine is a bit slow and janky, @rheolism (I think?) posted back a much faster, smoother version using custom characters instead of plotting, and then I saw a remake of the demake in processing? These things take a life of their own.

Anyway, long ago deleted my twitter account, but dug it out of the archive.

sega_sai
6 replies
20h15m

It is really cool. It would be interesting to make the speed proportional to the either the number of squares owned or the square root of that. Because right now as the area the ball owns gets smaller, the number of hits will increase at the same speed.

JKCalhoun
5 replies
20h12m

Like the card game, "War", it seems to self-regulate that way. I assume neither side will ever win.

sodality2
2 replies
19h4m

War is also entirely deterministic and contains no choices, so some don't consider it a game

Waterluvian
1 replies
17h54m

Hmm! Because once the cards are shuffled everything is a fixed series of events?

Would Snakes and Ladders be the same then if we replaced a die with a randomized deck of cards of the numbers 1-6? And in that sense: any “game” that’s purely random is also not a game then?

jaredsohn
0 replies
10h53m

Agree but I think these things can be considered games in the sense that it gives younger kids practice in following rules and interacting within a group. Also is an activity for them to spend time and there is a concept of 'winning' even if the participants cannot impact that.

yellowapple
0 replies
19h46m

With "War" it's indeed possible to win, though.

stevekemp
0 replies
3h25m

The only winning move is not to play?

geor9e
5 replies
21h31m

3 colors would get interesting, because as the other two bully one into a corner, the small space causes rapid block zapping, quickly bringing it back from the brink of defeat.

brown
4 replies
19h45m
almostnormal
1 replies
17h55m

In that one balls seem to be able to punch through (and flip) squares (when going almost vertical) instead of bouncing on every square they hit.

bitcurious
0 replies
3h16m

It's a bug/choice that is present in the original as well.

macintux
0 replies
2h26m

Spent a fair bit of time watching that one last night, thanks. I can definitely see why computer scientists were entranced by Conway's Game of Life.

DylanSp
0 replies
19h18m

That's definitely cool to watch, the patterns of territories get a lot more complex.

boredhedgehog
5 replies
10h53m

I'm greatly fascinated by this kind of thing, but I have to call it "this kind of thing" because I don't even know if there are genre terms to categorize and analyze them.

They're inspired by game algorithms, but they aren't games; Conway's "Game of Life" was a misnomer. They're animated, but they aren't scripted like animations. In the real world we have someone like David C. Roy, who calls his art "kinetic sculptures".

Algorithmic motion pictures? Game simulators? Autonomous automatons?

wavemode
0 replies
2h36m

"Simulation" probably covers it.

rickdeveloper
0 replies
8h28m

I have seen the term "zero player game" used for this. There is even a short Wikipedia article: https://en.wikipedia.org/wiki/Zero-player_game.

quijoteuniv
0 replies
10h6m

Algorithm haiku

lou1306
0 replies
4h11m

Chaotic systems? As in, fully deterministic systems that are highly sensitive to initial conditions?

EDIT: browsed the code a bit and there is some randomness in the bounce dynamics, so it's only "fully deterministic" if you count the PNRG seed as part of the initial conditions.

drclegg
0 replies
6h44m

I'm a fan of the term "toy", in a similar lens as "executive toy"

billylo
5 replies
20h44m

What if it has real paddles? left-hand (using A,Z) vs. right-hand mode (K,M)? :-)

notfed
2 replies
14h24m

Hold my beer.

notfed
1 replies
14h23m

Done, I opened a pull request for this.

https://github.com/vnglst/pong-wars/pull/5

notfed
0 replies
10h39m

Hosted it here: https://identity.pub/pong-wars-web/

Control the paddles with:

- Q (Player 1, Up)

- A (Player 1, Down)

- P (Player 2, Up)

- L (Player 2, Down)

NKosmatos
1 replies
19h27m

Hey, I can see an addictive mini game being developed pretty soon… I’m sure one of the bright minds of HN will offer us this game so we can alter/control/influence this never ending battle of the two pongs :-)

netsharc
0 replies
18h21m

Seeing "day" and "night", I thought the site was taking the local time reported by browsers of all the visitors, and rendering a "pie graph" of the proportion of visitors currently with daylight and visitors without daylight...

Although I suppose with the planet's unequal distribution of population (and then the distribution of HN visitors), such a graph would have a correspondence with the time of day.

Now I'm wondering if there is a visualization of time of day at Z vs number of world population in daylight (assuming good weather and no smog...)

eigenvalue
4 replies
16h5m

Not trying to steal anyone's thunder here, but I was so taken with this little program when I saw it earlier today on Twitter that I thought it might be fun to make it somewhat interactive, so that the players could actually influence the path of the balls using the keyboard, and also activate a "speedup" (mode but at the expense of their ability to influence the path). I also added some charts to track the state over time. You can "play" it here:

https://dicklesworthstone.github.io/ball_fighters/

And code is here:

https://github.com/Dicklesworthstone/ball_fighters

I give full credit to the original author of this post FWIW.

voisin
1 replies
14h15m

Something seems off in the behaviour, at least on mobile. The bouncing doesn’t seem to be the same.

eigenvalue
0 replies
14h3m

The original collision behavior glitched (the ball would skip through blocks of the opposite color)when the velocity was higher, so I tweaked it a bit so that wouldn’t happen. That probably explains the difference.

notfed
1 replies
14h12m

I just did my own mod, hosted here:

https://identity.pub/pong-wars-web/

Control the paddles with:

- Q (Player 1, Up)

- A (Player 1, Down)

- P (Player 2, Up)

- L (Player 2, Down)

Pull request opened:

https://github.com/vnglst/pong-wars/pull/5

I give full credit to the original author of this post FWIW.

Ditto :)

starshadowx2
0 replies
13h21m

Sometimes a ball gets stuck behind the paddle in your version.

throwaway2046
2 replies
21h47m

So hypnotizing... I was waiting for something magical to happen when the two balls touch.

zeeZ
0 replies
21h2m

The dividing line slowly shifted to diagonal and then horizontal.

JKCalhoun
0 replies
20h12m

Saw them get kind of intertwined briefly.

prakashn27
2 replies
9h31m

Can someone explain what is use of this ? Is there something I am missing?

More confined the area ball bounces more Other ball always occupies 1 spot at time

These two conditions make this game never ending

reqo
0 replies
9h23m

It does not have to have a use or a point, it is up to you to decided what it represents. I see at as an interactive yin and yang!

fifilura
0 replies
9h19m

It represents a statistical distribution.

Probably not a a bell curve but something related.

The use of it? Humanity has yet to find out, but there are lots of uses for other statistical distributions.

Maybe it finds it use in a machine that calculates the optimal route for autonomous robot drones to take in a warehouse? (Just making it up)

Meanwhile it is there for you to enjoy. A toy.

layer8
2 replies
19h26m

There’s a universe in which it will reach a yin-yang configuration.

joshuahutt
0 replies
15h33m
jareklupinski
0 replies
1h20m
tamimio
1 replies
21h1m

It look like the white ball is faster..

sbarre
0 replies
20h47m

The code introduces some speed variation on each bounce, either positive or negative so it's possible that over time one ball ends up a lot faster?

ramijames
1 replies
4h57m

This is genuinely beautiful on a few levels. Esthetically it is pleasing to just sit and watch. Philosophically it is interesting in that it is a digital metaphor for an ongoing struggle.

Lastly, and most interestingly, it remixes two really simple old ideas into something new. This is an exceedingly rare thing to do well.

Kudos. Many kudos.

busfahrer
0 replies
1h10m

Also, it sort of models yin-yang both in what the game is simulating as well as what is presented visually

pbiggar
1 replies
21h20m

Would love to be able to speed this up!

sbarre
0 replies
20h54m

I had the same thought... If you drop this in the console you can speed things up:

    dx1*=2;dx2*=2;dy1*=2;dy2*=2;
edit: someone else in the thread figured out a better way, I updated mine, but credit to them.

Although it has accuracy issues when you get too fast...

orenlindsey
1 replies
21h46m

Only a single HTML file. All you need.

geor9e
0 replies
21h26m

I thought this comment was saying they only used html like this other HN post was talking about https://www.htmhell.dev/adventcalendar/2023/2/ . But no, the comments just saying they put all the .js and .css inside the .html file.

ericskiff
1 replies
20h11m

Oh man - I love this, but I thought it was going to be a loving write up of the freeware “mortal kombat but it’s pong” game from 1994 https://archive.org/details/msdos_Pong_Kombat_1994

BugsJustFindMe
0 replies
17h52m
dorus42
1 replies
6h23m

My 12 year old son just made it in Scratch:

https://scratch.mit.edu/projects/957461584/

jprd
0 replies
4h36m

You are rightfully proud!

Tepix
1 replies
16h53m

Neat. Isn't it a bug that sometimes the ball drills deeper?

wkjagt
0 replies
6h5m

I don’t thinks so. It’s a bit like in a breakout game where the ball gets “stuck” behind some blocks and clears a ton of them by bouncing back and forth between them.

TacticalCoder
1 replies
21h15m

There's beauty in knowing that one could be ported and run perfectly fine on any old 8 bit computer! So simple yet mesmerizing...

wkjagt
0 replies
6h9m

Now I want to try this on my Commodore 64. I should already have some code I could reuse as I was already working on a breakout type of game. So the “clearing a block and bounce the ball back in the right direction” should be somewhat reusable.

widea
0 replies
7h21m

Interesting, I wonder if randomness and jitter as its source play a part here. Than, is this the visualisation of a True Random Number Generator?

totetsu
0 replies
14h35m

It’s like staring into a mirror for the soul. It’s just dots and square why should it feel so dramatic

senkora
0 replies
21h34m

See also OP’s post on Mastodon: https://hachyderm.io/@vnglst/111828811496422610

robblbobbl
0 replies
8h0m

haha cool, reminds me of kid cudi day 'n' night

qwertyforce
0 replies
21h41m

dx1*=2; dy1*=2; dx2*=2; dy2*=2;

qwertox
0 replies
6h13m

Great idea, but watching it makes me feel terribly anxious.

ognarb
0 replies
17h4m

Just did an implementation of this in C++ with Qt Scene Graph as a learning experience in case someone is interested https://invent.kde.org/carlschwan/warpong/-/blob/master/src/...

jb1991
0 replies
8h9m

This is unexpectedly hypnotizing.

dbrueck
0 replies
19h1m

Darn, I wish they had named it breakout wars instead.

cypherpunk666
0 replies
14h2m

€0.02 another pong variant, desktop only tho... https://www.obfusco.com/pn0gjs/index.html

charlieyu1
0 replies
8h12m

Interesting, but is it possible to speed up, or change the color scheme?

breaker-kind
0 replies
14h56m
Wowfunhappy
0 replies
15h28m

I wish the speed of the balls didn't change. I would prefer that randomness come from slight changes to the bounce angle.

Waterluvian
0 replies
17h56m

I love how the “losing” side has a shorter distance to go to “fight back” so it is a somewhat endless battle.

MegaDeKay
0 replies
1h42m

This would look great running on a HUB75 LED panel driven by an ESP32!

Duanemclemore
0 replies
2h47m

Tooo cool. I sat and watched it play for a length of time that's longer than I'm comfortable admitting last night.