Jump to content
assignment_ind Existing user? Sign In

Sign In



person_add Sign Up
Go-Code.pl - Support SourceMod i Pluginy CS:GO
Brum Brum

[Rozwiązane] Problem z sortowaniem

Recommended Posts

Hej, próbuje napisać takie menu z listą wyników kto zabił najwięcej kurczaków jednak nie wiem jak mogę to posortować.
kod

Spoiler

public void UpdateMenu()
{
	if (active)
	{
		Menu menu = new Menu(EmptyHandler);
		menu.SetTitle("ADEPT -> Chicken Hunt");
		for (int i = 1; i < MaxClients; i++)
		{
			if (IsValidClient(i) && GetClientTeam(i) == CS_TEAM_TT)
			{
				char buffer[65];
				Format(buffer, sizeof(buffer), "-> %N zabił %d kurczaków", i, KilledChicken[i]);
				menu.AddItem("", buffer, ITEMDRAW_DISABLED);
			}
		}
		menu.ExitButton = false;
		menu.Display(client, 20);
	}
}

 

Czy ktoś mógłby mi napisać jak tutaj to posortować(malejąco)?

Share this post


Link to post
Share on other sites

Gdzie trzymasz te dane? W mySQL? jeśli tak, wystarczy przy select'ie wykorzystać ORDER BY XXX DESC i problem z głowy. Oczywiście, gdyby okazało się, że w trakcie mapy ktoś kogoś wyprzedzi, rezultat nie zaktualizuje się sam - musisz więc zastanowić się, czy aktualizacja co mapę będzie wystarczająca.

Jeśli chciałbyś częściej aktualizować ranking najprostszą opcją jest UPDATE wyników graczy i ponowne pobieranie topki np. co rundę.

 

Jeśli jednak trzymasz wszystko np. w jakimś pliku, KeyValues, lub po prostu w tablicy (nie zapisujesz tego nigdzie), trzeba zastosować jakiś algorytm sortujący. Implementacje quick sorta, lub merge sorta można znaleźć w języku C i przerobić pod Pawna. Ponadto sortowanie możesz wykorzystać nawet, jeśli masz MySQL'a - nie będzie wtedy potrzeby robienia update'ów co rundę, co odciąży bazę.

 

Wszystko zależy od tego czego potrzebujesz ?

 

Share this post


Link to post
Share on other sites
Przed chwilą, MAGNET napisał:

Gdzie trzymasz te dane? W mySQL? jeśli tak, wystarczy przy select'ie wykorzystać ORDER BY XXX DESC i problem z głowy. Oczywiście, gdyby okazało się, że w trakcie mapy ktoś kogoś wyprzedzi, rezultat nie zaktualizuje się sam - musisz więc zastanowić się, czy aktualizacja co mapę będzie wystarczająca.

Jeśli chciałbyś częściej aktualizować ranking najprostszą opcją jest UPDATE wyników graczy i ponowne pobieranie topki.

 

Jeśli jednak trzymasz wszystko np. w jakimś pliku, KeyValues, lub po prostu w tablicy (nie zapisujesz tego nigdzie), trzeba zastosować jakiś algorytm sortujący. Implementacje quick sorta, lub merge sorta można znaleźć w języku C i przerobić pod Pawna. Ponadto sortowanie możesz wykorzystać nawet, jeśli masz MySQL'a - nie będzie wtedy potrzeby robienia update'ów co rundę, co odciąży bazę.

 

Wszystko zależy od tego czego potrzebujesz ?

 

Nie jest to nigdzie zapisywanie, jest to zabawa na JB wiec wszystko jest w intach które nie są zapisywane, są jednorazowe oraz resetowane po każdej zabawie

Share this post


Link to post
Share on other sites

Z racji, że graczy w takiej zabawie będzie góra 30, nie powinno być większym problemem, aby wykonywać sortowanie co stały interwał czasowy, np. co sekundę. Warto wybrać algorytm, który będzie wykonywał przesunięcia tylko w momencie, w którym kolejność jest niewłaściwa - możesz nawet spróbować z bubble sortem

  • Lubię to! 1

Share this post


Link to post
Share on other sites

https://sm.alliedmods.net/new-api/sorting/SortIntegers
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! to algorytm quick sort ( https://github.com/alliedmodders/sourcemod/blob/master/core/logic/smn_sorting.cpp#L119 ),
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

będzie on wydajniejszy niż ręcznie napisany insert sort zaproponowany przez @mastah7991 ze względu na to że jest zaimplementowany w sourcemodzie, a nie obliczany na maszynie virtualnej (source)pawna.

 

Złożoność czasowa dla insert sort wynosi n^2 natomiast dla quick nlog(n) oraz pesymistyczne n^2, czyli w najgorszym wypadku będzie tak szybkie jak inseration sort.

Dla tablicy 64 elementowej:

64^2 = 4096

64 * log(64) = ~180

Edited by plx211
  • Lubię to! 3
By MAGNET,

Gdybym wiedział, że mają już gotową funkcję na to, dawno bym zasugerował to samo :D

Share this post


Link to post
Share on other sites

Quicksorta często się "ulepsza" poprzez sortowanie małej tablicy poprzez sortowanie przez wstawianie. 

 

Quicksort jest fajny dla dużych przypadków bo prawdopodobieństwo wystąpienia uporządkowanej tablicy maleje. ( Można to policzyć np z wzoru na liczbę catalana). Tutaj wydajniejszy może być nawet ten z większą złożonością.

 

Jedyne argumentem jaki przemawia za quicksortem jest to że jest wbudowany ?

  • Lubię to! 1

Share this post


Link to post
Share on other sites

Nie napisałem tutaj że dla złożoności czasowej istnieje jeszcze coś takiego jak stała przez która mnożymy, jak widać na zdjęciu ta stała jest mniejsza dla inserta:quicksort-vs-insertion-sort.gif

Ale maszyna vm mocno zwiększa tą stałą, więc natywny quick sort zdecydowanie szybciej będzie działał nawet dla mniejszych przypadków.

W sumie może zrobie testy pod wieczór, zobaczymy jak to w praktyce wypada ?

 

p.s.

Trzeba pamiętać że pisząc samemu, zwiększamy szanse na błąd.

A sourcemod korzysta (prawdopodobnie, na to wskazuje nazwa funkcji qsort) z quick sorta zaimplementowanego w biblioteke standardową języka C, który jest napewnno zoptymalizowany.

 

p.s. 2

Dla tych co nie wiedzą 1E-07 s = 1*10^-7 s = 0,0000001 s =  0,0001 ms = 0,1 μs

 

p.s. 3

Szacun za mashe, dobra bajka ?

Edited by plx211
  • Lubię to! 1

Share this post


Link to post
Share on other sites
3 godziny temu, plx211 napisał:

https://sm.alliedmods.net/new-api/sorting/SortIntegers
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! to algorytm quick sort ( https://github.com/alliedmodders/sourcemod/blob/master/core/logic/smn_sorting.cpp#L119 ),
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

będzie on wydajniejszy niż ręcznie napisany insert sort zaproponowany przez @mastah7991 ze względu na to że jest zaimplementowany w sourcemodzie, a nie obliczany na maszynie virtualnej (source)pawna.

 

Złożoność czasowa dla insert sort wynosi n^2 natomiast dla quick nlog(n) oraz pesymistyczne n^2, czyli w najgorszym wypadku będzie tak szybkie jak inseration sort.

Dla tablicy 64 elementowej:

64^2 = 4096

64 * log(64) = ~180

Po użyciu SortIntegers co jakiś czas ucina 1 zabójstwo, mianowicie plugin nalicza +1 punkt po sortowaniu raz usuwa raz nie usuwa
Kod na którym tak się dzieje. Może ja coś źle robię?
 

Spoiler

public void UpdateMenu()
{
	if (active && g_chicken)
	{
		Menu menu = new Menu(EmptyHandler);
		menu.SetTitle("ADEPT -> Chicken Hunt");
		for (int i = 1; i < MaxClients; i++)
		{
			if (IsValidClient(i) && GetClientTeam(i) == CS_TEAM_TT)
			{
				char buffer[65];
				PrintToChatAll("Przed sortowaniem %d", KilledChicken[i]);
				SortIntegers(KilledChicken, sizeof(KilledChicken), Sort_Descending);
				PrintToChatAll("Po sortowaniu %d", KilledChicken[i]);
				Format(buffer, sizeof(buffer), "-> %N zabił %d kurczaków", i, KilledChicken[i]);
				menu.AddItem("", buffer, ITEMDRAW_DISABLED);
				menu.ExitButton = false;
				menu.Display(i, 20);
			}
		}
	}
}

 

 

  • Lubię to! 1

Share this post


Link to post
Share on other sites

zrobiłeś to najgorzej jak można było, po za tym odrazu trzeba było wstawić kod ?

 

nie jest to najlespze rozwiazanie, ale sproboj tego (nie testowane):

public void UpdateMenu() {
  if (!(active && g_chicken)) {
    return;
  }
  
  ArrayList sorted = new ArrayList(2);
  Menu menu = new Menu(EmptyHandler);
  menu.SetTitle("ADEPT -> Chicken Hunt");
  menu.ExitButton = false;
  
  for (int i = 1; i < sizeof(KilledChicken); ++i) {
    if (IsValidClient(i) && GetClientTeam(i) == CS_TEAM_TT) {
      int index = sorted.Push(KilledChicken[i]);
      sorted.Set(index, i, 1);
    }
  }

  SortADTArray(sorted, Sort_Descending, Sort_Integer);
 
  for (int i = 0; i < sorted.Length; ++i) {
    char buffer[65];
    Format(buffer, sizeof(buffer), "-> %N zabił %d kurczaków", sorted.Get(i, 1), sorted.Get(i, 0));
    menu.AddItem("", buffer, ITEMDRAW_DISABLED);
  }

  for (int i = 1; i < MaxClients; ++i) {
    if (IsValidClient(i) && GetClientTeam(i) == CS_TEAM_TT) {
      menu.Display(i, 20);
    }
  }
}

 

Edited by plx211
  • Lubię to! 3

Share this post


Link to post
Share on other sites
11 minut temu, plx211 napisał:

zrobiłeś to najgorzej jak można było, po za tym odrazu trzeba było wstawić kod ?

 

nie jest to najlespze rozwiazanie, ale sproboj tego (nie testowane):


public void UpdateMenu() {
  if (!(active && g_chicken)) {
    return;
  }
  
  ArrayList sorted = new ArrayList(2);
  Menu menu = new Menu(EmptyHandler);
  menu.SetTitle("ADEPT -> Chicken Hunt");
  menu.ExitButton = false;
  
  for (int i = 1; i < sizeof(KilledChicken); ++i) {
    if (IsValidClient(i) && GetClientTeam(i) == CS_TEAM_TT) {
      int index = sorted.Push(KilledChicken[i]);
      sorted.Set(index, i, 1);
    }
  }

  SortADTArray(sorted, Sort_Descending, Sort_Integer);
 
  for (int i = 0; i < sorted.Length; ++i) {
    char buffer[65];
    Format(buffer, sizeof(buffer), "-> %N zabił %d kurczaków", sorted.Get(i, 1), sorted.Get(i, 0));
    menu.AddItem("", buffer, ITEMDRAW_DISABLED);
  }

  for (int i = 1; i < MaxClients; ++i) {
    if (IsValidClient(i) && GetClientTeam(i) == CS_TEAM_TT) {
      menu.Display(i, 20);
    }
  }
}

 

Kod był wstawiony już w pierwszym poście ? Kod zaraz przetestuje

Share this post


Link to post
Share on other sites

rzeczywiscie, umknal mi ?

Share this post


Link to post
Share on other sites

nowy post bo edycja mi sie bugguje na fonie,
usun == getteam w ostatniej petli, to wyswietlisz wszystkim

 

Share this post


Link to post
Share on other sites

Dzięki działa ? 
Do zamknięcia

Share this post


Link to post
Share on other sites

Wiadomość wygenerowana automatycznie

 

Pomoc udzielona

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.


O NAS Jesteśmy społecznością łączącą ludzi, którzy dzielą pasję poznawania CS:GO od strony programistycznej. Posiadamy duże zaplecze merytoryczne i zawsze cieszymy się, gdy dołączają do nas osoby gotowe do nauki. Gwarantujemy, że z odrobiną wytrwałości i otwartym umysłem bardzo szybko napiszesz swój pierwszy plugin. Zapraszamy! 🙂
Szablon wykonany z dużą ilością przez cyberpixelz / Mesharsky / Sitefuture
Forum dumnie napędzane przez: Invision Power Services, Inc.
×
×
  • Create New...