From a4ee6d55b5e41e12a428f70a7fa80c8f8f9c8511 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sun, 15 Jun 2025 20:39:58 +0200 Subject: [PATCH] added options to remove the barriers (// if you touch a barrier you're send to the last stable position) --- Makefile | 8 +- answer.txt | 2 +- lastActions.txt | 248 ++++++++++++++++++++++++++++++++++++++--- leaderboard.txt | 8 +- output.txt | 20 ++-- src/base.c | 5 + src/cars.c | 5 + src/collisions.c | 282 +++++++++++++++++++++++++++++++++-------------- src/display.c | 3 +- src/main.c | 15 +++ src/structure.c | 2 +- src/structure.h | 6 +- tempLeader.txt | 8 +- 13 files changed, 487 insertions(+), 125 deletions(-) diff --git a/Makefile b/Makefile index 406d1ee..dd873a2 100644 --- a/Makefile +++ b/Makefile @@ -4,15 +4,15 @@ LFLAGS = -lSDL2 -lSDL2_image -lm all: bin/back -replay: bin/back - bin/back levels/test.txt bots/dumb bots/dumb2 bots/dumb3 bots/dumb4 - testL: bin/back - bin/back levels/test.txt bots/dumb bots/dumb2 bots/dumb3 bots/dumb4 bots/dumb5 bots/dumb6 + bin/back levels/long.txt bots/dumb bots/dumb2 bots/dumb3 bots/dumb4 bots/dumb5 bots/dumb6 test: bin/back bin/back levels/test.txt bots/follow1 bots/follow2 bots/follow3 bots/dumb4 +test2: bin/back + bin/back levels/long.txt bots/follow1 bots/follow2 bots/follow3 bots/dumb4 + ez: bin/back bin/back levels/simple.txt bots/dumb bots/dumb2 bots/dumb3 bots/dumb4 diff --git a/answer.txt b/answer.txt index 95b86b2..c5afa23 100644 --- a/answer.txt +++ b/answer.txt @@ -1 +1 @@ -312 74 \ No newline at end of file +15 60 \ No newline at end of file diff --git a/lastActions.txt b/lastActions.txt index 78f42ac..3b8fc5e 100644 --- a/lastActions.txt +++ b/lastActions.txt @@ -1,16 +1,232 @@ --93.744313 76.432231 -116.117314 137.544103 --108.851340 -205.127439 --39.162874 101.722447 --101.439733 -85.837810 -180.096064 -170.152889 --167.076955 -186.299969 --105.566090 -54.025360 --151.804605 175.133056 -143.612213 161.055315 --195.623634 -3.422337 -43.548113 142.177413 -226.881116 52.960296 -99.886135 -130.792870 --192.161607 118.121488 -83.948961 -98.039540 +-164.876636 19.899629 +-131.793958 142.637930 +-35.313109 202.939788 +31.598090 123.177047 +-72.709254 -146.236387 +167.465280 -160.606464 +-15.466478 190.742777 +-113.615798 114.656903 +-137.030419 -30.450931 +73.528832 -119.056420 +-22.441415 240.372419 +27.306206 162.745110 +128.978022 -190.339990 +-32.328017 96.659938 +171.966882 -120.219159 +-177.165811 -42.747950 +133.355650 28.931980 +-121.650614 109.756008 +-158.618004 88.437235 +-184.518541 -163.020850 +30.193845 133.756412 +136.650719 -156.823801 +34.042093 210.930566 +-203.624243 -111.244981 +53.561036 186.500620 +-154.788353 53.762090 +149.519829 115.961924 +-0.546410 185.296582 +128.339963 -23.835604 +191.888500 -137.989675 +158.485594 49.178646 +79.823772 133.410342 +43.509856 141.435608 +-162.478660 -106.472242 +-195.234761 -29.200025 +-133.665895 -16.267565 +99.319570 15.260796 +196.348045 6.568111 +173.042173 -38.252209 +-52.740724 -218.691870 +46.028600 122.962056 +51.867701 -147.720968 +72.447883 186.744649 +80.124954 189.646459 +-87.094817 127.640372 +117.092358 25.875959 +-203.447572 -3.687761 +176.876470 -12.491359 +160.000303 -75.636880 +-113.120377 -37.010111 +177.458511 -36.941434 +36.643910 180.906647 +-29.114493 148.502977 +-58.550805 136.189113 +10.476107 -203.692536 +99.392763 -182.298258 +-123.922262 -25.812484 +67.708986 136.736176 +151.615675 115.814645 +-63.304437 -203.449472 +39.177306 -138.117487 +33.036223 164.482142 +-97.023064 -148.570859 +-174.547334 94.748045 +161.666149 35.378155 +-32.042213 111.465654 +-186.112498 -3.328420 +-68.160481 -146.909768 +-79.909244 99.252495 +-94.187705 -52.868307 +179.235732 -42.175283 +179.443311 46.704399 +-50.147668 151.315084 +-74.791729 192.098011 +-172.738639 6.289572 +56.881383 178.815273 +30.929376 157.136440 +-5.160238 -158.972241 +233.529442 106.742601 +209.255010 0.645630 +24.661504 -114.333565 +-207.836726 -22.173055 +-57.756658 -215.848892 +-46.798571 -132.859262 +139.134254 -75.832466 +-183.134469 163.389721 +-94.529561 -137.885661 +-59.247523 132.523873 +-112.370963 -5.683564 +121.408439 -129.404117 +-140.040462 158.280215 +-25.859626 -181.316033 +-97.036059 132.042199 +166.494511 -104.706804 +-158.519766 -195.240271 +60.175525 95.806721 +-150.252442 104.972901 +56.429178 173.910136 +-181.083300 54.835290 +-145.856729 20.485311 +51.752973 -105.278905 +-149.622544 -43.024281 +143.535309 213.914450 +-108.491656 -124.748348 +49.658568 -90.534766 +-117.067993 132.637241 +152.114332 -144.443519 +249.793417 -68.991815 +-136.453687 13.037382 +83.341785 71.310446 +-58.710710 252.921140 +195.872638 -114.100544 +-192.900725 15.469874 +6.182071 130.846122 +-251.299931 51.366640 +-210.069968 -15.747961 +176.893730 151.876228 +-95.249381 -102.486712 +15.359101 192.296747 +-45.591694 266.808291 +-146.376425 101.877975 +56.073277 143.911676 +-107.635160 -116.766613 +172.732231 -33.546957 +-179.860685 175.033756 +93.059084 -45.132589 +15.605335 -170.023508 +-73.390211 -111.401032 +-101.446883 223.948117 +106.459664 -18.918352 +-193.563254 36.405068 +-235.494997 38.498427 +-230.163625 0.041291 +-127.165631 -21.312624 +-45.621901 189.267225 +126.480850 169.532029 +115.246764 -131.338987 +-44.457073 122.750467 +216.667693 -129.520231 +108.245895 154.259396 +221.132741 11.576041 +114.223203 -56.141271 +229.602891 59.666708 +-177.370950 -119.341067 +91.156217 -154.529352 +-39.824547 -143.294433 +-65.674258 -160.940022 +-203.665153 -59.336865 +-89.292979 193.934446 +98.908107 -98.459523 +158.295770 68.748970 +-53.390834 -168.704926 +-152.004524 -167.178374 +122.610769 34.051383 +109.474339 150.681326 +-135.655457 138.596429 +15.797554 214.292890 +-118.483302 -63.473311 +-231.215638 97.253671 +-151.328243 -79.824562 +3.098388 171.259667 +94.841262 -114.786068 +134.817518 -171.068071 +69.537313 -180.367643 +-225.561887 -78.384990 +-110.783481 -76.878757 +141.931161 -160.337536 +200.384232 34.701917 +-132.468011 -186.721770 +2.308866 -184.610935 +226.181539 -90.522499 +109.494698 -78.683610 +162.480524 191.429014 +126.511640 -79.825025 +-126.415076 168.036147 +179.839455 -49.489592 +158.096728 -17.460192 +81.268221 80.079465 +-84.704466 212.941911 +-20.892930 -116.493503 +79.229842 217.766200 +-32.203277 -101.189233 +-244.149247 -44.699792 +-156.849364 103.341992 +144.430750 62.478498 +157.338730 -73.760521 +-54.540289 198.052385 +58.775681 116.284743 +-133.090178 113.116505 +137.104165 -86.307220 +-162.652402 156.153891 +172.119108 -118.289943 +-169.350223 42.685176 +-161.756411 -51.234001 +-78.828134 -239.895237 +21.897849 190.928634 +110.756934 -91.561042 +109.215894 -36.721603 +-27.426429 -192.311576 +105.731650 63.681074 +-130.224095 30.549887 +149.030146 -48.350946 +179.744970 56.181260 +173.146361 -36.692215 +-161.608998 -191.212124 +46.405002 -110.601725 +-126.494430 -182.844076 +82.565319 -153.900977 +-159.803180 20.293362 +90.700865 -136.990084 +-153.689848 89.127693 +49.694125 159.942072 +-34.742757 -205.970802 +-100.398021 -93.644589 +65.927274 244.127943 +142.635188 -112.380019 +95.344345 137.565429 +63.870301 116.862762 +-34.130933 209.000317 +-163.815603 16.381362 +-142.724086 75.330433 +122.840677 116.919247 +-94.536550 149.752365 +-7.870342 130.029191 +-31.054691 -235.845912 +60.969559 -95.327286 +-159.216181 -44.547472 +-179.029626 78.955844 +-148.122749 106.017190 +145.503305 -25.752061 +239.604803 74.792529 +128.906511 38.617973 diff --git a/leaderboard.txt b/leaderboard.txt index af6e889..3754037 100644 --- a/leaderboard.txt +++ b/leaderboard.txt @@ -2,10 +2,10 @@ name, elo ./bots/dumb 1347 ./bots/dumb2 1404 ./bots/dumb3 1355 -./bots/dumb4 980 +./bots/dumb4 885 ./bots/dumb5 540 ./bots/dumb6 562 -./bots/follow1 854 -./bots/follow2 1003 -./bots/follow3 899 +./bots/follow1 881 +./bots/follow2 1055 +./bots/follow3 933 ./bots/follow4 648 diff --git a/output.txt b/output.txt index 2d4a0f4..75e026d 100644 --- a/output.txt +++ b/output.txt @@ -1,18 +1,14 @@ 4 -0 (3 0) (7.52 40.94) -1 (3 0) (66.47 11.34) -2 (3 0) (44.58 8.01) -3 (3 2) (37.59 39.59) +0 (1 0) (15.98 83.38) +1 (6 0) (12.66 31.55) +2 (1 0) (22.92 36.40) +3 (3 0) (80.42 49.95) 3 -7 8 -...S.... -..35.... -..24.... -...24... -...353E. -...215.. -........ +3 10 +.S11111114 +E........0 +2111111115 100 220 5 0.90 0.80 0.20 0.00 0.20 diff --git a/src/base.c b/src/base.c index 2cf8dc4..f034383 100644 --- a/src/base.c +++ b/src/base.c @@ -31,6 +31,8 @@ int RED = 0; int GREEN = 0; int BLUE = 0; +bool* offTheMap; + color assignColor() { color res = (color){.red = RED, .green = GREEN, .blue = BLUE}; @@ -63,11 +65,13 @@ void init_all(int nPl) { winners = malloc(sizeof(int)*nPlayers); players = malloc(sizeof(carData)*nPlayers); remainingD = malloc(sizeof(double)*nPlayers); + offTheMap = malloc(sizeof(bool)*nPlayers); for(int p = 0; p < nPlayers; p++) { winners[p] = 0; players[p].rgb = assignColor(); remainingD[p] = 0.0; players[p].c = init_car(p, nPlayers); + offTheMap[p] = false; } minRemD = 0.0; maxRemD = 0.0; @@ -78,6 +82,7 @@ void destroy_all() { destroy_car(players[p].c); } free(players); + free(offTheMap); } // 1 = N diff --git a/src/cars.c b/src/cars.c index e76452e..278c84f 100644 --- a/src/cars.c +++ b/src/cars.c @@ -30,10 +30,15 @@ car* init_car(int nPl, int nTotPl) { car* res = malloc(sizeof(car)); res->itm = NULL; res->nCoins = 0; + res->pos = get_position(nPl, nTotPl); res->lastPos = (ptf){.fx = res->pos.fx, .fy = res->pos.fy}; + res->chx = START_CHY; + res->lastChx = START_CHY; res->chy = START_CHX; + res->lastChy = START_CHX; + res->vel = (ptf){.fx = 0.0, .fy = 0.0}; //double theta = (2.0*MAX_THETA_SPAWN*nPl/((nTotPl-1==0)?(1):(nTotPl-1)) - 1.0*MAX_THETA_SPAWN); //res->vel = (ptf){.fx = (rand()%100)/100.0*2.0*MAX_SPEED, .fy = (rand()%100-50.0)/100.0*2.0*MAX_SPEED}; diff --git a/src/collisions.c b/src/collisions.c index b02bc7d..2c4f59a 100644 --- a/src/collisions.c +++ b/src/collisions.c @@ -57,33 +57,57 @@ void move_on_START(int nPl) { (START_DIR != 3 && c->pos.fx-PLAYER_R <= 0.0 && c->vel.fx < 0.0) || (START_DIR == 3 && c->pos.fx-PLAYER_R <= 0.0 && c->vel.fx < 0.0 && (c->pos.fy-PLAYER_R <= ROOM_SIZE*DIST_EDGE || c->pos.fy+PLAYER_R >= ROOM_SIZE*(1.0-DIST_EDGE))) ) { // left wall - c->vel.fx *= -1.0; - c->pos.fx += 2.0*c->vel.fx*DT; - c->vel.fx *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fx *= -1.0; + c->pos.fx += 2.0*c->vel.fx*DT; + c->vel.fx *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if( (START_DIR != 1 && c->pos.fx+PLAYER_R >= 1.0*ROOM_SIZE && c->vel.fx > 0.0) || (START_DIR == 1 && c->pos.fx+PLAYER_R >= 1.0*ROOM_SIZE && c->vel.fx > 0.0 && (c->pos.fy-PLAYER_R <= ROOM_SIZE*DIST_EDGE || c->pos.fy+PLAYER_R >= ROOM_SIZE*(1.0-DIST_EDGE))) ) { // right wall - c->vel.fx *= -1.0; - c->pos.fx += 2.0*c->vel.fx*DT; - c->vel.fx *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fx *= -1.0; + c->pos.fx += 2.0*c->vel.fx*DT; + c->vel.fx *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if( (START_DIR != 0 && c->pos.fy-PLAYER_R <= 0.0 && c->vel.fy < 0.0) || (START_DIR == 0 && c->pos.fy-PLAYER_R <= 0.0 && c->vel.fy < 0.0 && (c->pos.fx-PLAYER_R <= ROOM_SIZE*DIST_EDGE || c->pos.fx+PLAYER_R >= ROOM_SIZE*(1.0-DIST_EDGE))) ) { // top wall - c->vel.fy *= -1.0; - c->pos.fy += 2.0*c->vel.fy*DT; - c->vel.fy *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fy *= -1.0; + c->pos.fy += 2.0*c->vel.fy*DT; + c->vel.fy *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if( (START_DIR != 2 && c->pos.fy+PLAYER_R >= 1.0*ROOM_SIZE && c->vel.fy > 0.0) || (START_DIR == 2 && c->pos.fy+PLAYER_R >= 1.0*ROOM_SIZE && c->vel.fy > 0.0 && (c->pos.fx-PLAYER_R <= ROOM_SIZE*DIST_EDGE || c->pos.fx+PLAYER_R >= ROOM_SIZE*(1.0-DIST_EDGE))) ) { // bottom wall - c->vel.fy *= -1.0; - c->pos.fy += 2.0*c->vel.fy*DT; - c->vel.fy *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fy *= -1.0; + c->pos.fy += 2.0*c->vel.fy*DT; + c->vel.fy *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } } @@ -95,30 +119,54 @@ void move_on_FINISH(int nPl) { if( (c->pos.fx-PLAYER_R <= 0.0 && c->vel.fx < 0.0) ) { // left wall - c->vel.fx *= -1.0; - c->pos.fx += 2.0*c->vel.fx*DT; - c->vel.fx *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fx *= -1.0; + c->pos.fx += 2.0*c->vel.fx*DT; + c->vel.fx *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if( (c->pos.fx+PLAYER_R >= 1.0*ROOM_SIZE && c->vel.fx > 0.0) ) { // right wall - c->vel.fx *= -1.0; - c->pos.fx += 2.0*c->vel.fx*DT; - c->vel.fx *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fx *= -1.0; + c->pos.fx += 2.0*c->vel.fx*DT; + c->vel.fx *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if( (c->pos.fy-PLAYER_R <= 0.0 && c->vel.fy < 0.0) ) { // top wall - c->vel.fy *= -1.0; - c->pos.fy += 2.0*c->vel.fy*DT; - c->vel.fy *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fy *= -1.0; + c->pos.fy += 2.0*c->vel.fy*DT; + c->vel.fy *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if( (c->pos.fy+PLAYER_R >= 1.0*ROOM_SIZE && c->vel.fy > 0.0) ) { // bottom wall - c->vel.fy *= -1.0; - c->pos.fy += 2.0*c->vel.fy*DT; - c->vel.fy *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fy *= -1.0; + c->pos.fy += 2.0*c->vel.fy*DT; + c->vel.fy *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } } @@ -127,14 +175,26 @@ void move_on_STR_V(int nPl) { c->pos.fx += c->vel.fx*DT; c->pos.fy += c->vel.fy*DT; if(c->pos.fx-PLAYER_R <= ROOM_SIZE*DIST_EDGE && c->vel.fx < 0.0) { // left wall - c->vel.fx *= -1.0; - c->pos.fx += 2.0*c->vel.fx*DT; - c->vel.fx *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fx *= -1.0; + c->pos.fx += 2.0*c->vel.fx*DT; + c->vel.fx *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if(c->pos.fx+PLAYER_R >= ROOM_SIZE*(1.0-DIST_EDGE) && c->vel.fx > 0.0) { // right wall - c->vel.fx *= -1.0; - c->pos.fx += 2.0*c->vel.fx*DT; - c->vel.fx *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fx *= -1.0; + c->pos.fx += 2.0*c->vel.fx*DT; + c->vel.fx *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } } @@ -144,14 +204,26 @@ void move_on_STR_VB(int nPl) { c->pos.fx += c->vel.fx*DT; c->pos.fy += c->vel.fy*DT; if(c->pos.fx-PLAYER_R <= ROOM_SIZE*DIST_EDGE && c->vel.fx < 0.0) { // left wall - c->vel.fx *= -1.0; - c->pos.fx += 2.0*c->vel.fx*DT; - c->vel.fx *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fx *= -1.0; + c->pos.fx += 2.0*c->vel.fx*DT; + c->vel.fx *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if(c->pos.fx+PLAYER_R >= ROOM_SIZE*(1.0-DIST_EDGE) && c->vel.fx > 0.0) { // right wall - c->vel.fx *= -1.0; - c->pos.fx += 2.0*c->vel.fx*DT; - c->vel.fx *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fx *= -1.0; + c->pos.fx += 2.0*c->vel.fx*DT; + c->vel.fx *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if(absf(c->pos.fx - 0.5*ROOM_SIZE) < ROOM_SIZE*STR2_W/2.0) { // middle area apply_friction(nPl); @@ -164,14 +236,26 @@ void move_on_STR_H(int nPl) { c->pos.fx += c->vel.fx*DT; c->pos.fy += c->vel.fy*DT; if(c->pos.fy-PLAYER_R <= ROOM_SIZE*DIST_EDGE && c->vel.fy < 0.0) { // top wall - c->vel.fy *= -1.0; - c->pos.fy += 2.0*c->vel.fy*DT; - c->vel.fy *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fy *= -1.0; + c->pos.fy += 2.0*c->vel.fy*DT; + c->vel.fy *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if(c->pos.fy+PLAYER_R >= ROOM_SIZE*(1.0-DIST_EDGE) && c->vel.fy > 0.0) { // bottom wall - c->vel.fy *= -1.0; - c->pos.fy += 2.0*c->vel.fy*DT; - c->vel.fy *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fy *= -1.0; + c->pos.fy += 2.0*c->vel.fy*DT; + c->vel.fy *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } } @@ -180,14 +264,26 @@ void move_on_STR_HB(int nPl) { c->pos.fx += c->vel.fx*DT; c->pos.fy += c->vel.fy*DT; if(c->pos.fy-PLAYER_R <= ROOM_SIZE*DIST_EDGE && c->vel.fy < 0.0) { // top wall - c->vel.fy *= -1.0; - c->pos.fy += 2.0*c->vel.fy*DT; - c->vel.fy *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fy *= -1.0; + c->pos.fy += 2.0*c->vel.fy*DT; + c->vel.fy *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if(c->pos.fy+PLAYER_R >= ROOM_SIZE*(1.0-DIST_EDGE) && c->vel.fy > 0.0) { // bottom wall - c->vel.fy *= -1.0; - c->pos.fy += 2.0*c->vel.fy*DT; - c->vel.fy *= RESTITUTION_WALL; + if(BARRIERS == 1) { + c->vel.fy *= -1.0; + c->pos.fy += 2.0*c->vel.fy*DT; + c->vel.fy *= RESTITUTION_WALL; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } if(absf(c->pos.fy - 0.5*ROOM_SIZE) < ROOM_SIZE*STR2_W/2.0) { // middle area apply_friction(nPl); @@ -207,60 +303,84 @@ void move_on_TURN(int nPl, int cenX, int cenY) { // inner circle if(prevDist-PLAYER_R > ROOM_SIZE*DIST_EDGE && nextDist-PLAYER_R <= ROOM_SIZE*DIST_EDGE) { - ptf to_in = normalize((ptf){ - .fx = cenX-prev.fx, - .fy = cenY-prev.fy - }); - double inwards = dot(to_in, c->vel); - c->vel = add(c->vel, (ptf){.fx = -2.0*to_in.fx*inwards, .fy = -2.0*to_in.fy*inwards}); + if(BARRIERS == 1) { + ptf to_in = normalize((ptf){ + .fx = cenX-prev.fx, + .fy = cenY-prev.fy + }); + double inwards = dot(to_in, c->vel); + c->vel = add(c->vel, (ptf){.fx = -2.0*to_in.fx*inwards, .fy = -2.0*to_in.fy*inwards}); - c->pos.fx += 2.0*c->vel.fx*DT; - c->pos.fy += 2.0*c->vel.fy*DT; + c->pos.fx += 2.0*c->vel.fx*DT; + c->pos.fy += 2.0*c->vel.fy*DT; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } // in case someone clips (inner) if(nextDist-prevDist < 0.0 && prevDist-PLAYER_R < ROOM_SIZE*DIST_EDGE) { - ptf to_in = normalize((ptf){ - .fx = cenX-prev.fx, - .fy = cenY-prev.fy - }); - double inwards = dot(to_in, c->vel); - c->vel = add(c->vel, (ptf){.fx = -2.0*to_in.fx*inwards, .fy = -2.0*to_in.fy*inwards}); + if(BARRIERS == 1) { + ptf to_in = normalize((ptf){ + .fx = cenX-prev.fx, + .fy = cenY-prev.fy + }); + double inwards = dot(to_in, c->vel); + c->vel = add(c->vel, (ptf){.fx = -2.0*to_in.fx*inwards, .fy = -2.0*to_in.fy*inwards}); - c->pos.fx += 2.0*c->vel.fx*DT; - c->pos.fy += 2.0*c->vel.fy*DT; + c->pos.fx += 2.0*c->vel.fx*DT; + c->pos.fy += 2.0*c->vel.fy*DT; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } // outer circle if(prevDist+PLAYER_R < ROOM_SIZE*(1.0-DIST_EDGE) && nextDist+PLAYER_R >= ROOM_SIZE*(1.0-DIST_EDGE)) { - ptf to_out = normalize((ptf){ - .fx = prev.fx-cenX, - .fy = prev.fy-cenY - }); - double outwards = dot(to_out, c->vel); - c->vel = add(c->vel, (ptf){.fx = -2.0*to_out.fx*outwards, .fy = -2.0*to_out.fy*outwards}); + if(BARRIERS == 1) { + ptf to_out = normalize((ptf){ + .fx = prev.fx-cenX, + .fy = prev.fy-cenY + }); + double outwards = dot(to_out, c->vel); + c->vel = add(c->vel, (ptf){.fx = -2.0*to_out.fx*outwards, .fy = -2.0*to_out.fy*outwards}); - c->pos.fx += 2.0*c->vel.fx*DT; - c->pos.fy += 2.0*c->vel.fy*DT; + c->pos.fx += 2.0*c->vel.fx*DT; + c->pos.fy += 2.0*c->vel.fy*DT; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } // in case someone clips (outer) if(nextDist-prevDist > 0.0 && prevDist-PLAYER_R > ROOM_SIZE*(1.0-DIST_EDGE)) { - ptf to_in = normalize((ptf){ - .fx = cenX-prev.fx, - .fy = cenY-prev.fy - }); - double inwards = dot(to_in, c->vel); - c->vel = add(c->vel, (ptf){.fx = -2.0*to_in.fx*inwards, .fy = -2.0*to_in.fy*inwards}); + if(BARRIERS == 1) { + ptf to_in = normalize((ptf){ + .fx = cenX-prev.fx, + .fy = cenY-prev.fy + }); + double inwards = dot(to_in, c->vel); + c->vel = add(c->vel, (ptf){.fx = -2.0*to_in.fx*inwards, .fy = -2.0*to_in.fy*inwards}); - c->pos.fx += 2.0*c->vel.fx*DT; - c->pos.fy += 2.0*c->vel.fy*DT; + c->pos.fx += 2.0*c->vel.fx*DT; + c->pos.fy += 2.0*c->vel.fy*DT; + } else { + c->vel.fx = 0.0; + c->vel.fy = 0.0; + offTheMap[nPl] = true; + } } } void bumpOtherCars(int nPl) { for(int p = 0; p < nPlayers; p++) { - if(p != nPl && 0==winners[p]) { + if(p != nPl && 0==winners[p] && !offTheMap[p]) { double sep = distance( get_absolute_coords(p), get_absolute_coords(nPl) diff --git a/src/display.c b/src/display.c index 17bfc02..ccb0a32 100644 --- a/src/display.c +++ b/src/display.c @@ -569,7 +569,8 @@ void renderPlayers(SDL_Renderer* renderer, int cx, int cy, int range, int rsize) //printf("[%d]", p); int cox = (WIDTH-rsize)/2+rsize*(players[p].c->chx-cy) + (int)((players[p].c->pos.fx*1.0)/ROOM_SIZE*rsize); int coy = (HEIGHT-rsize)/2+rsize*(players[p].c->chy-cx) + (int)((players[p].c->pos.fy*1.0)/ROOM_SIZE*rsize); - SDL_RenderFillCircle(renderer, cox, coy, PLAYER_R*rsize/ROOM_SIZE, players[p].rgb.red, players[p].rgb.green, players[p].rgb.blue, 255); + int divd = (offTheMap[p])?(2):(1); + SDL_RenderFillCircle(renderer, cox, coy, PLAYER_R*rsize/ROOM_SIZE, players[p].rgb.red/divd, players[p].rgb.green/divd, players[p].rgb.blue/divd, 255); } else { // } diff --git a/src/main.c b/src/main.c index f22731b..5a54b23 100644 --- a/src/main.c +++ b/src/main.c @@ -252,6 +252,21 @@ int main(int argc, char** argv) { // no movement placeRectToRenderer(rend, 0, HEIGHT-50, 50, 50, 255, 32, 32, 192); //B *= -1.0; + // update stable positions + for(int p = 0; p < nPlayers; p++) { + if(!offTheMap[p]) { + players[p].c->lastPos.fx = players[p].c->pos.fx; + players[p].c->lastPos.fy = players[p].c->pos.fy; + players[p].c->lastChx = players[p].c->chx; + players[p].c->lastChy = players[p].c->chy; + } else { + players[p].c->pos.fx = players[p].c->lastPos.fx; + players[p].c->pos.fy = players[p].c->lastPos.fy; + players[p].c->chx = players[p].c->lastChx; + players[p].c->chy = players[p].c->lastChy; + } + offTheMap[p] = false; + } updateWins(ranks); if(ONEATATIME == 1) { if(remainingTurns != 0 && 0==winners[playerToMove]) { diff --git a/src/structure.c b/src/structure.c index 527b97a..1420dee 100644 --- a/src/structure.c +++ b/src/structure.c @@ -19,7 +19,7 @@ const double RESTITUTION_PLAYER = 0.8; // keep equal to previous constant const int PLAYER_R = 5; const int MAX_THETA_SPAWN = 80; // degrees -const int BARRIERS = 1; // enables/disables barriers [UNUSED] +const int BARRIERS = 0; // enables/disables barriers const int ONEATATIME = 0; // 0 = everyone move at the same time, 1 = turn-based movement (one player at a time) const double BARRIER_WIDTH = 0.05; diff --git a/src/structure.h b/src/structure.h index d959ad2..f89a6ce 100644 --- a/src/structure.h +++ b/src/structure.h @@ -26,9 +26,11 @@ typedef struct item_t { typedef struct car_t { ptf pos; // remains in [0, ROOM_SIZE[ - ptf lastPos; + ptf lastPos; // last static position for the car (used when barriers are off) int chx; int chy; + int lastChx; + int lastChy; ptf vel; int nCoins; item* itm; // either NULL or a pointer to an item @@ -79,6 +81,8 @@ extern int currentTurn; // name explains extern carData* players; // contains each player and its corresponding data extern int nPlayers; // size of players + +extern bool* offTheMap; // offTheMap[p] = true <==> the player p is off the map (groundbreaking I know) // ------------------------------------------------------------------------ // // constants extern const int WIDTH; diff --git a/tempLeader.txt b/tempLeader.txt index af6e889..3754037 100644 --- a/tempLeader.txt +++ b/tempLeader.txt @@ -2,10 +2,10 @@ name, elo ./bots/dumb 1347 ./bots/dumb2 1404 ./bots/dumb3 1355 -./bots/dumb4 980 +./bots/dumb4 885 ./bots/dumb5 540 ./bots/dumb6 562 -./bots/follow1 854 -./bots/follow2 1003 -./bots/follow3 899 +./bots/follow1 881 +./bots/follow2 1055 +./bots/follow3 933 ./bots/follow4 648