Hier ne kleine Funktion fuer random Floats
Einfach wie random(); benutzen nur mit f am Anfang
Hier ne kleine Funktion fuer random Floats
Einfach wie random(); benutzen nur mit f am Anfang
Pastebin Link im Startpost hinzugefuegt http://pastebin.com/xjDwk1B0
Damit ihr mal Einblick habt
Ziel ist es das Script nicht mit irgendwelchen Funktionen vollzupumpen, soll so wenig Kram wie moeglich beinhalten, so wie das urspruengliche Bedwars
Freut mich sehr dass es euch zusagt
Wenn jemand sich den Server anschauen will, bringt paar Leute mit und schreibt mir ne Nachricht dann schmeiss ich den an
Naechstes grosses Gamemode Update kommt naechste Woche Freitag, und wird dann veroeffentlicht.
Version 0.1b
Ich gruesse euch liebe Community,
Hiermit praesentiere ich mein aktuelles Miniprojekt Last Bed Standing, basierend auf Grand Larceny!
Motivation:
Idee und Ziel dieses Projekts war es das Bedwars Minigame welches es auf vielen Minecraft Servern gibt in SA-MP und im SA-MP Stil nachzubauen (Bett sprengen statt abbauen etc..), und mal ein andere Art von Servern erstellen, denn man sieht ja leider nur noch Reallife.
Weiterhin programmiere ich im Rahmen meines Studiums viel in C, und warum nicht mal bisschen ueben durch Programmieren in einer C aehnlichne Sprache? Daraus ist dieses Projekt in nun ca. 2 Wochen entstanden, und was geht schon ueber ein Selfmade?
Desweiteren bin ich ein Fan von OpenSource Software, weshalb auch dieses Projekt hier fuer alle verfuegbar sein sollte.
Letztlich ist das Projekt nur aus Spass, und etwas Uebung fuer das Studium entstanden, und wird in Zukunft noch geupdated.
Aktuell befindet sich der Gamemode im Alpha Stadium und wird vorraussichtlich jede Woche geupdated.
Wenn es eine fehlerfreie Version gibt wird unter die GNU Public License gestellt, damit jeder das Werk aendern, verbreiten kann usw. soll ja schliesslich etwas fuer alle sein
Das Fragment welches aus Grand Larceny ist, ist lediglich die Team bzw. Stadtauswahl, meiner Ansicht nach viel schoener als der Standardkram den man auf sovielen Servern sieht.
Aktuell gibt es 3 Teams zur Auswahl aehnlich wie in Bedwars wo es zu Beginn auch eine Teamauswahl gibt.
Team ROT befindet sich am Sherman Staudamm, westlich von El Castillo del Diablo, Team GRAU bei Area 51 und Team BLAU bei Verdant Meadows, dem Flughafen.
Jedes Team verfuegt ueber einen Shop mit einem "Villager" bei welchem man Waffen, Armour , Skills und eine Bombe kaufen kann die noetig ist um ein feindliches Bett zu zerstoeren.
Alle Teams haben nahe Ihrer Base irgendein Fahrzeug wie z.B. Panzer oder Seasparrow um sich besser vor Feinden verteidigen zu koennen.
Jedes Team besitzt einen "Bronzespawner" bzw. da ich das ganze im GTA Stil machen wollte, einen Geldspawner, welcher random Geldpickups generiert, welche noetig sind um sich Waffen und andere Dinge zu kaufen.
Ziel ist es das Bett des feindlichen Teams zu zerstoeren (wobei nach dem Zerstoeren eines Betts das jeweilige Team nicht mehr respawnen kann), und dann die restlichen Spieler zu eliminieren, und so das Spiel zu gewinnen, wie in Bedwars halt.
Der Gamemode ist inzwischen im Vergleich zum Ursprungs Grand Larceny, nun mit insgesamt 2400 Zeilen ziemlich umfangreich.
Das ganze habe ich inzwischen mit 4 Spielern insgesamt ausprobiert, und ein Spiel dauert durchschnittlich 10 Minuten.
Der Spassfaktor ist trotz der Einfachheit des Gamemodes sehr gross!
Der Gamemode ist komplett in ENGLISCH geschrieben um auch Spieler aus anderen Laendern anzulocken!
Aktuell laeuft das Script unter knogleinsi.de als SA-MP Server mit 32 Slots, und wird auch weiterhin dort laufen.
Weiterhin sind aktuell 4 verschiene Maps spielbar, und man kann problemlos weitere erstellen, dazu einfach die Muster in pawno/includes anschauen.
Die Teamanzahl kann nun auch variabel zwischen 2 und 6 eingestellt werden.
Download, inklusive Changelog:
https://github.com/Knogle/LastBedStanding
Hier mal einen kleinen Ueberblick ueber die Teams, und deren Lage.
Bilder:
Eine Bombe wird an einem Bett platziert!
Das Bett detoniert, und geht in Flammen auf!
Die auf Grand Larceny basierende Teamauswahl
Eins der 3 Teams die man auswaehlen kann.
Der Shop des Teams ROT
"Bronzespawner" und kleine Tafel die jedes Team besitzt, auf welcher Informationen zum Spiel angezeigt und aktualisiert werden.
Die aus Bedwars bekannte "Mitte"
Das Bett von Team GREY
So,
Ich will wie vorhin folgendes machen.
Aktuell werden durch ein Array PKills[MAX_PLAYERS]; jedem Spieler bei einem Kill PKills[playerid] += 1; zugewiesen.
Nun will ich die Kills der besten 5 Spieler in einer Auflistung darstellen.
Das ganze sieht fuer mich recht scheisse aus.
Ausprobieren kann ich es leider nicht da ich nicht soviele Spieler habe, aber vielleicht kann ja einer hinsehen ob das Konstrukt funktionieren wuerde.
Hier mal kommentiert, mit dem was meiner Ansicht nach geschehen soll
stock Scoreboard()
{
new k;
new kills[MAX_PLAYERS][2];
for(new k;k < MAX_PLAYERS; k++); /// Kills der Spieler werden zusammen mit playerid in einem neuen 2 dimensionalen Array gespeichert
{
if(!IsPlayerConnected(k)) continue;
kills[k][0]= PKills[k];
kills[k][1]= k;
}
HeapSort(kills);// Array wird mit Heapsort sortiert nach kills
for(new i;i < MAX_PLAYERS; i++);
{
SendClientMessageEx(i,COLOR_WHITE,"Top player stats below.");//Nachricht wird einmal an alle Spieler versandt
if(!IsPlayerConnected(i)) continue;
for(new d;d < 5;MAX_PLAYERS; )
{
if(!IsPlayerConnected(d)) continue;
new formated[128];
new pname[playerid][32];
GetPlayerName(kills[d][1],pname);
format(formated,sizeof(formated),"%d. place: %s with %d kills",d+1,pname,kills[d][0]);
SendClientMessage(i,COLOR_WHITE,formated);
//Es werden die ersten 5 Spieler im Array ausgegeben (der mit den hoechsten Kills als erster, usw.)
}
}
}
Alles anzeigen
Vielen Dank
Was ist eigentlich der signifikante Nachteil beim Verwenden es C99 Stils? Gibts da Probleme mit den Compilern oder der Ausfuehrung?
Ich mag das so sehr aus PAWN
Ja habs mal so uebernommen, jedoch wird auch da bei mir der Teil in der Schleife leider nicht geprintet.
Beim debuggen mit gdb meckert er wegen fehlendem printvf.c, daher weiss ich nicht ob es daran liegen kann
Laeuft der Code denn bei dir, also beide Varianten?
Die Zweite Schleife habe ich da dran gepappt weil ich mich gewundert habe dass die erste nicht ausgefuehrt wurde
Gruesse dich
Leider wieder das gleiche Problem Habe echt keine Ahnung woran es jetzt liegt.
Die letzte for und while Schleife in main() werden ebenfalls nicht ausgefuehrt.
Siehe jetzt keinen Fehler
Vielleicht liegt der Fehler bei mir im System?
int main()
{
int size=0;
int *array;
printf("Array-Groesse eingeben: ");
scanf("%d", &size);
// Allocate memory
array = (int *) malloc(size * sizeof(int));
if(array != NULL)
{
printf("\nSpeicher ist reserviert\n");
printf("\nFilling array.\n");
for(int loop=0;loop<size;loop++)
{
int qrand=rand() %20;
array[loop]=qrand;
printf("%d",qrand);
}
}
else
{
printf("\nKein freier Speicher vorhanden.\n");
}
heapsort(array,size);
int loop2;
for(loop2=0;loop2<size;loop2++)
{
printf("%d",array[loop2]);
}
while(loop2<size)
{
printf("%d",array[loop2]);
loop2++;
}
printf("\nSpeicher ist freigegeben\n");
free(array);
return 0;
}
Alles anzeigen
Ohje wie einfach das Leben manchmal sein kann
Moin
Habe folgendes Skript:
Bisher hat es funktioniert, jedoch habe ich jetzt aufeinmal das Problem dass der Teil von Zeile 75- 80 nicht ausgefuehrt wird!
Woran kann das liegen? Ich weiss aktuell nicht wo der Fehler liegt
#include <stdio.h>
#include <stdlib.h>
void quicksort(int *A, int len);
int heaparray[100];
int max (int *a, int n, int i, int j, int k)
{
int m = i;
if (j < n && a[j] > a[m]) {
m = j;
}
if (k < n && a[k] > a[m]) {
m = k;
}
return m;
}
void downheap (int *a, int n, int i)
{
while (1) {
int j = max(a, n, i, 2 * i + 1, 2 * i + 2);
if (j == i) {
break;
}
int t = a[i];
a[i] = a[j];
a[j] = t;
i = j;
}
}
void heapsort (int *a, int n)
{
int i;
for (i = (n - 2) / 2; i >= 0; i--) {
downheap(a, n, i);
}
for (i = 0; i < n; i++) {
int t = a[n - i - 1];
a[n - i - 1] = a[0];
a[0] = t;
downheap(a, n - i - 1, 0);
}
}
void quicksort(int *A, int len)
{
if (len < 2) return;
int pivot = A[len / 2];
int i, j;
for (i = 0, j = len - 1; ; i++, j--)
{
while (A[i] < pivot) i++;
while (A[j] > pivot) j--;
if (i >= j) break;
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
quicksort(A, i);
quicksort(A + i, len - i);
}
int main () {
printf("\n Filling array with %lu elements \n",sizeof(heaparray));
for(int zf;zf<sizeof(heaparray);zf++)
{
int r = rand() % 20;
heaparray[zf]=r;
printf("%d",r);
}
printf("\n\n ");
printf("\nSorting..\n");
printf("\n\n ");
if(sizeof(heaparray) != sizeof(heaparray))
return printf("Something went wrong during filling");
heapsort(heaparray,sizeof heaparray);
printf("\n\n ");
for(int zn;zn<sizeof(heaparray);zn++)
{
printf("%d",heaparray[zn]);
}
return 0;
}
Alles anzeigen
Ah danke dir, dann scheint QuickSort wirklich besser zu sein fuer den Normalfall Bubblesort habe ich mal getestet, das ist derbe langsam!
Habe folgendes Problem:
Ich will die 5 Spieler mit den meisten Kills ausgeben im Chat.
Die Kills werden in einem Array der Groesse MAX_PLAYERS gespeichert mit der playerid als Index.
Das Array wird dann sortiert, jedoch habe ich ja dann das Problem dass ich die Kills dann einem entsprechenden Spieler nicht mehr zuordnen kann.
Habe daher gedacht ein zweites Array mit den gleichen Werten zu erstellen, und dann Index Inhalt aus dem urspruenglichen Array mit dem sortierten Array zu vergleichen, aber ich glaube das ist ineffizient.
Hoffe jemand hat hier bessere Ideen
Also ich denke nicht, dass du den PAWN Editor PAWNO meinst, sondern eher das: https://github.com/compuphase/pawn (PAWN)(oder https://github.com/Zeex/pawn)
Ansonsten: http://wiki.sa-mp.com/wiki/Scripting_Editors#Pawno
Ne diesmal meine ich in der Tat den PAWN Editor PAWNO
Wuerde den gern umbauen
Moin
Habe eine Frage
Warum ist Heapsort bei mir eigentlich immer um einiges langsamer als Quicksort? Trifft das worst case fuer Quicksort nie ein?
Ich genierere ein Random Array mit 1000 Werten, und schreibe diese Werte in ein neues Array.
Dann lasse ich Quick Sort das erst Array sortieren, und Heapsort das zweite.
Vielleicht ist ein Fehler im Code? Heapsort sollte ja immer O(n logn) haben, und Quicksort im Worst Case sogar O(n*n)
Daher werde ich nicht aus den krassen Unterschieden schlau
#include <a_samp>
#include <hex>
//new
// lilarray[] = { -541, 54, 689, 12, 3, 0, 3, 55, 66, -541, 5468484, -564, 1554, 1656 }
//;
new lilarray[10000];
new bigarray[sizeof(lilarray)];
new heaparray[sizeof(lilarray)];
#define START_BENCH(%0); {new __a=%0,__b=0,__c,__d=GetTickCount(),__e=1;do{}\
while(__d==GetTickCount());__c=GetTickCount();__d=__c;while(__c-__d<__a||\
__e){if(__e){if(__c-__d>=__a){__e=0;__c=GetTickCount();do{}while(__c==\
GetTickCount());__c=GetTickCount();__d=__c;__b=0;}}{
#define FINISH_BENCH(%0); }__b++;__c=GetTickCount();}printf(" Bench for "\
%0": executes, by average, %.2f times/ms.",floatdiv(__b,__a));}
stock HeapSort (array [], n = sizeof (array))
{
new i;
for (i = n / 2; i > 0; --i)
SiftDown (array, i, n);
for (i = n; i > 1; --i)
{
Swap (array [i - 1], array [0]);
SiftDown (array, 1, i - 1);
}
}
stock quickSort(array[], left, right)
{
new
tempLeft = left,
tempRight = right,
pivot = array[(left + right) / 2],
tempVar
;
while(tempLeft <= tempRight)
{
while(array[tempLeft] < pivot) tempLeft++;
while(array[tempRight] > pivot) tempRight--;
if(tempLeft <= tempRight)
{
tempVar = array[tempLeft], array[tempLeft] = array[tempRight], array[tempRight] = tempVar;
tempLeft++, tempRight--;
}
}
if(left < tempRight) quickSort(array, left, tempRight);
if(tempLeft < right) quickSort(array, tempLeft, right);
}
static stock SiftDown (array [], i, m)
{
new j;
while (2 * i <= m)
{
j = 2 * i;
if (j < m && array [j - 1] < array [j])
++j;
if (array [i - 1] < array [j - 1])
{
Swap (array [i - 1], array [j - 1]);
i = j;
}
else
i = m;
}
}
static stock Swap (&a, &b)
{
new s;
s = a;
a = b;
b = s;
}
main()
{
//START_BENCH( 1000 );
for(new zf;zf < sizeof(lilarray);zf++)
{
lilarray[zf]=random(100);
//printf("%d",lilarray[zf]);
}
for(new zf;zf < sizeof(lilarray);zf++)
{
heaparray[zf]=lilarray[zf];
}
print(" ");
START_BENCH( 1000 );
quickSort(lilarray, 0, sizeof(lilarray) - 1);
FINISH_BENCH( "quicksort" );
START_BENCH( 1000 );
HeapSort(heaparray);
FINISH_BENCH( "heapsort" );
}
public OnGameModeInit()
{
}
Alles anzeigen
Funktioniert! Du musst nur im Fenster "ersetzen" unter Suchen nach \n und bei Ersetzen durch \n<deinbefehl/text ussw> reinpacken, fertig. Siehe Screenshot:
Perfekt, klappt super! Vielen Dank!
Ich gruesse euch.
Aktuell will ich einige der Vehicle Dateien von Grand Larceny ins AddStaticVehicle Format umwandeln.
Gibt es jedoch eine Moeglichkeit am Anfang jeder Zeile "AddStaticVehicle" dranzuhaengen? Bei ueber 1000 Fahrzeugen das ganze von Hand zu machen wuerde ewig dauern.
Hier ein Codeausschnitt, habe bisher ; durch );// ersetzt
409,2481.3877,1544.0386,10.5123,202.9677,1,1);//
579,2498.4194,1676.3019,10.5524,1.3521,101,101);//
474,2463.0220,1676.7267,10.5831,359.3129,97,1);//
518,2788.6519,2431.3220,10.4912,314.8943,2,39);//
516,2815.1465,2406.8418,10.6541,315.8335,119,1);//
506,2833.4592,2309.8750,10.5247,179.7437,76,76);//
516,2891.3560,2379.1252,10.6230,270.9466,41,29);//
417,2093.3755,2415.1582,74.7678,94.3180,2,29);//
402,2095.8645,2410.8191,45.0503,267.7614,110,110);//
516,2104.4490,2396.0525,40.6341,271.3880,119,62);//
402,2095.8438,2398.7417,27.8898,268.8989,99,81);//
477,2086.5784,2416.6394,23.4231,90.8221,3,3);//
516,2103.9829,2419.3713,14.8978,270.8129,24,55);//
561,2065.8535,2479.7612,10.6989,359.7305,4,1);//
414,2130.8403,2514.2134,10.9140,193.6682,24,1);//
410,1900.4618,2437.4229,10.4740,92.5165,45,1);//
408,1730.6010,2336.2703,11.3685,2.6346,26,26);//
486,2707.1851,822.1658,10.7179,2.5507,1,1);//
486,2707.0010,908.6336,10.8980,176.3525,1,1);//
482,2697.6646,885.6911,10.3113,271.4880,71,71);//
554,2701.6409,828.3740,10.1758,359.8369,15,32);//
524,2635.2407,848.0072,6.7986,311.1720,61,27);//
524,2630.1240,851.0532,6.9725,315.8478,65,31);//
530,2687.1553,909.9475,10.4912,199.4376,111,1);//
530,2683.3469,908.7888,10.4567,197.7386,112,1);//
455,2685.8137,864.3542,10.3588,358.5818,84,58);//
560,2705.9065,788.8524,10.6037,359.2399,33,0);//
403,2873.0920,920.3176,11.3572,94.3495,28,1);//
Alles anzeigen
Ja Ausschlussprinzip habe ich gemacht wobei ich Anfangs alle 3 ausschliessen musste
Ist das ganze in PAWN identisch?
Ich gruesse euch liebe Community,
Habe folgende Klausuraufgabe gegeben gehabt:
Welcher Ausdruck ist Aequivalent zu A[B]? Wenn A ein Array ist und B ein Index:
a) *A +B
b) B[A]
c) *B +A
Habe gedacht b und c kann ja schonmal garnicht sein, also habe ich auf a) getippt.
Nun die Loesung: b sei richtig.
Ich habe zur Ueberpruefung dann ein Programm geschrieben was das tut
#include <stdio.h>
int A[4]={4,2,3,4};
int main()
{
printf("\n %d \n A[3]", A[3]);
printf("\n %d \n A[3]", 3[A]);
if(A[3] == 3[A])
{
printf("A[3] und 3[A] sind gleich");
}
return 0;
}
Alles anzeigen
Und da habe ich mich gewundert dass A[3] = 3[A] rauskommt! Aber warum ist das so? Ich raff das nicht!
Ist das in PAWN auch so?
Danke @Kaliber jetzt habe ich das auch gerafft.
public OnPlayerPickUpPickup(playerid, pickupid)
{
if(pickupid == shopteamblue || pickupid == shopteamred || pickupid == shopteamgrey)
{
ShowMenuForPlayer(shopmenu,playerid);
TogglePlayerControllable(playerid,false);
}
else
{
maxmoney = maxmoney -1;
DestroyPickup(pickupid);
GivePlayerMoney(playerid, 1000);
}
return 1;
}
Alles anzeigen
Folgende Sache:
Ich genieree in 3 Zonen jede Sekunde 1 Geld pickup an einer random Stelle.
Jedoch habe ich recht schnell die Grenze von 4096 erreicht.
Macht das Einsetzen von einem Streamer da sinn, bzw. wieviele Pickups koennte ich dann einsetzen, und gibt es da dann sowas wie eine Stream Distanz bei Objekten? Oder verhalten diese sich genauso wie normale Pickups?
Weiteres Problem ist: Ich habe letztendlich nur 3 Pickups mit ID, und alle anderen (Geldscheine) geben dem Spieler 1000$.
Nun will ich jedoch andere Pickuptypen spawnen, Geldtaschen zum einsammeln die dann 10000 bringen sollen.
Jedoch weiss ich nicht wie ich bei random und immer wieder generierten Pickups dort eine ID zuweisen kann um damit was in OnPlayerPickUpPickup zu machen
public MoneyVillage()
{
totaltime = totaltime+1;
if(maxmoney < 4096)
{
new Float:ra1=((frandom(6)-334.0716));
new Float:ra2=((frandom(21)+2211.4011));
new Float:ra3=((frandom(1)+42.4844));
maxmoney = maxmoney +1;
bagvar = bagvar +1;
CreatePickup(1212,19,ra1,ra2,ra3, 0);
moneyval= moneyval+100000;
printf("SPAWNED: %d",maxmoney);
}
}
Alles anzeigen
Weiterhin habe ich einen Befehl geschaffen um Geld zu droppen, kann ich den eventuell noch optimieren? Ich wollte verhindern dass beim droppen die Grenze von 4096 Pickups ueberschritten wird weil sonst der Serber abgeschmiert ist
maxmoney ist hierbei die Anzahl an pickups, frandom eine Funktion fuer random Floats
if(strcmp(cmd, "/dropmoney", true) == 0)
{
new tmp[20], dropval;
tmp = strtok(cmdtext, idx);
dropval = strval(tmp);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /dropmoney [value]");
if(GetPlayerMoney(playerid) >= dropval && maxmoney <= 4000 && dropval > 0 && dropval <= 100000 && (maxmoney+dropval/100)<4095 && dropval != 0)
{
if(dropval%1000 == 0)
{
new dropstring[32];
format(dropstring,sizeof(dropstring),"SERVER: Dropped $%d",dropval);
SendClientMessage(playerid, COLOR_WHITE, dropstring);
GivePlayerMoney(playerid,-dropval);
for(new i; i <dropval/1000; i++)
{
maxmoney = maxmoney +1;
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid,x,y,z);
new Float:ra1=((frandom(3)+x+0.5));
new Float:ra2=((frandom(3)+y+0.5));
new Float:ra3=((frandom(1)+z-0.8));
CreatePickup(1212,19,ra1,ra2,ra3, 0);
}
}
else
{
if(dropval%1000 != 0)
{
SendClientMessage(playerid, COLOR_WHITE, "SERVER: The desired value has to be divisible by 1000");
}
}
}
else
{
if(GetPlayerMoney(playerid) < dropval )
{
SendClientMessage(playerid, COLOR_WHITE, "SERVER: You do not have enough money.");
}
if(dropval > 100000)
{
SendClientMessage(playerid, COLOR_WHITE, "SERVER: The desired value has to be $100000 or less");
}
if(dropval==0)
{
SendClientMessage(playerid, COLOR_WHITE, "SERVER: You can not drop nothing!");
}
if((maxmoney+dropval/1000)>=4095 && dropval <= 100000)
{
new allowmoney[128];
format(allowmoney,sizeof(allowmoney),"SERVER: Because of limitations you can not drop more than $%d right now!",(4095-maxmoney)*1000);
SendClientMessage(playerid,COLOR_WHITE,allowmoney);
printf("Player may only drop %d",(4095-maxmoney)*1000);
}
}
}
Alles anzeigen
Den wuerde ich dann gerne in den Codeschnippsel Thread posten