Master
59.2997
Selamlar,

Turnuva sistemi geliştirmek isteyipte mantığını geliştiremeyen veya esin kaynağı arayan arkadaşlar için ufak bir prototip hazırladım. Hem uzun zamandır da kod yazmıyordum, bakalım ne durumdayım onu da tekrardan test etmek istedim. :)

Kodu şu anki hali ile kullanmamanızı öneririm. Basit, örnek bir kodlama yaptığım için çok fazla sorunla karşılaşabilirsiniz. Ayrıca belirtmem gerekir ki kodları önceden test etmeniz de yararınıza olacaktır. Zirâ kodlar tamamen UO ve sphere emülatörü olmayan bir ortamda geliştirildi.

Kodları kullanabilmeniz için biraz bilginiz olması gerekmektedir. Hiç bilmeyen birisinin şu anki halde alıp düzenlemesi pek mümkün değildir. Kullanacaklar, kullanılan yöntem ve komutlar konusunda temel bir araştırma yapıp o şekilde düzenlemelidir.

Umarım birilerine faydam dokunur.

[comment tournament]
hazırlayan: Slothere
tarih: 31 Mayıs 2011
version: 56b+ 
# [!] List komutundan ötürü güncel sürüm gerekir.
-------------------------------------------------

[plevel 4]
turnuvaDuzenle

[function turnuvaDuzenle]
if (<var0.tournamentStone>)
	sysmessage Su anda zaten bir turnuva duzenleniyor.
else
	serv.b Turnuva duzenlenmektedir. Katilimlar icin ".katil" komutunu kullanabilirsiniz.
	serv.b Katilimlar 5 dk sonra sonra erecektir.
	serv.newitem i_grave_stone
	new.p 1,1
	new.attr attr_move_never|attr_decay|attr_invis
	new.name tournament stone
	var0.tournamentStone = <new>
	new.type = t_stone_tournament
	new.timer = 300
	new.more1 = 1
	List.tournamentPlayers.Clear
	List.tournamentWinners.Clear
endif

[plevel 1]
katil

[function katil]
if !(<var0.tournamentStone>)
	sysmessage Su anda turnuva duzenlenmiyor.
elseif (<List.tournamentPlayers.FindElem <uid>>)
	sysmessage Su an zaten turnuvaya katilmis vaziyettesin.
elseif (<uid.<var0.tournamentStone>.more1> > 1)
	sysmessage Turnuva basladigi icin katilamazsiniz.
else
	List.tournamentPlayers.Add = <uid>
	sysmessage Turnuvaya katildiniz. Oyundan ayrilirsaniz otomatik diskalifiye olursunuz.
	events +e_tournament_viewer
	go xxxx,yyyy,z	// buraya bekleyen oyuncuların gidecegi koordinat girilmeli.
	tag0.lastPosition = <p>
	serv.b <name> turnuvaya katildi.
	serv.b Toplam katilimci sayisi: <List.tournamentPlayers.Count>
	serv.b Katilimlarin sona ermesine <eval(<uid.<var0.tournamentStone>.timer>/60)>dk kaldi.
endif

[events e_tournament_viewer]
on=@attack
return 1
on=@hittry
return 1
on=@gethit
return 1
on=@hunger
return 1
on=@skillstart
return 1

on=@spellcast
if !((<argn>==4) || (<argn>==6) || (<argn>==7) || (<argn>==9) || (<argn>==11) || (<argn>==15) || (<argn>==16) || (<argn>==17) || (<argn>==29) || (<argn>==36))
	return 1
endif

on=@click
message [Turnuvada]

on=@logout
local.index = <List.tournamentPlayers.FindElem <uid>>
List.tournamentPlayers.<dlocal.index>.Remove
serv.b <name> oyundan ayrildigi icin turnuvadan diskalifiye oldu.
go <tag0.lastPosition>
tag0.lastPosition


[typedef t_stone_tournament]
on=@timer
if (<dmore1> == 1)
	serv.b Katilimlar sona erdi. Turnuva basliyor...
	more1 = 2
	timer = 5
	return 1
endif
if ((<List.tournamentPlayers.Count> % 2) > 0)
	local.lastIndex = <eval(<List.tournamentPlayers.count>-1)>
	ref13 = <List.tournamentPlayers.<dlocal.lastIndex>>
	ref13.sysmessage Turnuvadaki katilimci fazlaligindan oturu otomatik olarak yarismadan cikartildiniz.
	ref13.go <ref12.tag0.lastPosition>
	ref13.tag0.lastPosition
	ref13.events -e_tournament_viewer
	List.tournamentPlayers.<dlocal.lastIndex>.Remove
endif
if (<List.tournamentPlayers.Count> >= 2)
	local.totalCount = <eval(<List.tournamentPlayers.Count>)>
	while (<dlocal.totalCount> > 0)
		local.totalCount = <eval(<local.totalCount>-1)>
		local.rand = <r<dlocal.totalCount>>
		local.t1 = <List.tournamentPlayers.<dlocal.totalCount>>
		local.t2 = <List.tournamentPlayers.<dlocal.rand>>
		List.tournamentPlayers.<dlocal.totalCount> = <local.t2>
		List.tournamentPlayers.<dlocal.rand> = <local.t1>
	endwhile
	ref10 = <List.tournamentPlayers.0>
	ref11 = <List.tournamentPlayers.1>
	List.tournamentPlayers.0.Remove
	List.tournamentPlayers.1.Remove
	serv.b [Turnuva] <ref10.name> vs <ref11.name>
	ref10.go xxxx,yyyy,z	// düellodaki ilk oyuncunun gönderileceği koordinat girilmeli.
	ref11.go xxxx,yyyy,z	// düellodaki ikinci oyuncunun gönderileceği koordiant girilmeli.
	ref10.events -e_tournament_viewer
	ref11.events -e_tournament_viewer
	ref10.events +e_tournament_duel
	ref11.events +e_tournament_duel
	ref10.tag0.opponent = <ref11>
	ref11.tag0.opponent = <ref10>
timer = 300
	return 1
else
	if (<List.tournamentWinners.Count> < 2)
		ref12 = <List.tournamentWinners.0>
		ref12.tag0.opponent
		ref12.go <ref12.tag0.lastPosition>
		ref12.tag0.lastPosition
		ref12.events -e_tournament_viewer
		ref12.gold += 100000
		ref12.update
		List.tournamentWinners.Clear
		List.tournamentPlayers.Clear
		serv.b Turnuvayi <ref12.name> kazandi.
		var0.tournamentStone
		remove
	else
		List.tournamentPlayers.Clear
		while !(<isempty <List.tournamentWinners.<dlocal._while>>>)
			List.tournamentPlayers.Add = <List.tournamentWinners.<dlocal._while>>
			List.tournamentWinners.<dlocal._while>.Remove
		endwhile
		List.tournamentWinners.Clear
		serv.b Turnuvada mevcut tur tamamlandi, diger tura geciliyor.
		timer = 3
	endif
endif
return 1

[events e_tournament_duel]
on=@hunger
return 1

on=@callguards
return 1

on=@famechange
return 1

on=@karmachange
return 1

on=@spellcast
if (<argn>==24) || (<argn>==33) || (<argn>==40) || (<argn>==44) || (<argn>==45) || (<argn>==50) || (<argn>==58) || (<argn>==60) || (<argn>==61) || (<argn>==62) || (<argn>==63) || (<argn>==64)
	return 1
endif

on=@death
ref20 = <tag0.opponent>
tag0.opponent
List.tournamentWinners.Add = <ref20>
ref20.events -e_tournament_duel
events -e_tournament_duel
ref20.go xxxx,yyyy,z	// buraya bekleyen oyuncuların gidecegi koordinat girilmeli.
ref20.events +e_tournament_viewer
go <tag0.lastPosition>
tag0.lastPosition
serv.b <name> vs <ref20.name> | Kazanan: <ref20.name>
ref21 = <var0.tournamentStone>
ref21.timer = 3


on=@logout
ref20 = <tag0.opponent>
tag0.opponent
List.tournamentWinners.Add = <ref20>
ref20.events -e_tournament_duel
events -e_tournament_duel
ref20.go xxxx,yyyy,z	// buraya bekleyen oyuncuların gidecegi koordinat girilmeli.
ref20.events +e_tournament_viewer
go <tag0.lastPosition>
tag0.lastPosition
serv.b <name> oyundan ayrildigi icin hukmen maglup oldu. Kazanan <ref20.name>
ref21 = <var0.tournamentStone>
ref21.timer = 3

[eof]

Ayrıca bu kodda kullanmak amacıyla Fisher-Yates karıştırma algoritması olarakta bilinen yöntemi kullanarak oluşturduğum liste karıştırma kodlarını fonksiyon halinde veriyorum. Listelerinizi bu komut aracılığı ile rastgele karıştırıp sıralayabilirsiniz.

Kullanım şekli ".listShuffle <listeadı>"

[function ListShuffle]
local.totalCount = <eval(<List.<args>.Count>)>
while (<dlocal.totalCount> > 0)
	local.total = <eval(<local.totalCount> - 1)>
	local.rand = <r<dlocal.totalCount>>
	local.t1 = <List.<args>.<dlocal.totalCount>>
	local.t2 = <List.<args>.<dlocal.rand>>
	List.<args>.<dlocal.totalCount> = <local.t2>
	List.<args>.<dlocal.rand> = <local.t1>
endwhile
Özlemişiz yahu senin paylaşımlarını, ellerine sağlık dostum. :asik2
Expert
34.0001
Çok büyük ihtimalle bu hali çalışmayacak, fakat mantık anlaşılır durumda. Ayrıca geliştirmeye de çok açık. Eline sağlık diyorum :)
teşekkürler slothere iyi gidiyorsun :)
Güzel paylaşım ve geliştirilebilir emeğine sağlık Gökberk.
Master
59.2997
Aslında amaç kodu yayınlamaktan çok mantığını yayınlamaktı. Basit bir örnekleme kullanarak mantığı biraz da olsa kavratabildiysem eğer ne mutlu. Geliştirme kısmına gelince hayal gücünü ve birazda bilgiyi kullanarak çok detaylı bir sistem üretilebilir, mesela örnek olarak;

- Daha detaya indirilip bir turnuva yönetim paneli yapılabilir. Bu panel üzerinden belirtilen ve tanımlanan tüm turnuvalar sisteme enjekte edilebilir.

- Puan sistemi geliştirilebilir. Şu anki halinde örneklemek gerekirse iki yarışmacı berabere kaldığında ikisi de otomatikman elenir. En çok hasar veren vs. hesaplanıp galip sayılabilir. (Arda'nın "Kell" fikridir)

- Şu anki yapıda çift katılımcı olması sağlansa da mesela 10 katılımcı olduğunda 5 galip olacağından, sistemin eşleri sağlaması için bir galip otomatikman diskalifiye olacaktır. Ufak bir matematiksel hesap ile denklem düzeltilebilir veya katılımcı sayısı elle belirtilebilir. (Berkay'ın "Jesus" fikridir.)

- Haftalık, aylık, yıllık şeklinde istatistik tutulabilir ve döneme göre ödüller verilebilir. Böylece hem otomasyonu daha iyi hale gelir hemde oyuncuları cezbedici bir hal alır.
Kim kazanıcak diye bahis :) bekleyenler oturduğu yerden para kazansın veya kaybetsin olabilir belki :)
Aldarson : Kim kazanıcak diye bahis :) bekleyenler oturduğu yerden para kazansın veya kaybetsin olabilir belki :)

işte bu fikir güzel =)
Gökberk aklındaki denklemi paylaşırsan eklentiyi ben tamamlayıp paylaşabilirim.
Master
59.2997
Halihazırda bir denklem tasarlamadım. Eğer aklıma bir yöntemi gelirse veya kodlarla ilgilenirsem sana iletirim.

Ekleme;

Ayrıca okunulabilirliği daha fazla olan ve girintilerin de görüntülendiği şu bağlantıdan da kodları inceleyebilirsiniz;
https://pastebin.com/i9tZG61z
Güzel paylaşım eline sağlık.

Slothere : - Şu anki yapıda çift katılımcı olması sağlansa da mesela 10 katılımcı olduğunda 5 galip olacağından, sistemin eşleri sağlaması için bir galip otomatikman diskalifiye olacaktır. Ufak bir matematiksel hesap ile denklem düzeltilebilir veya katılımcı sayısı elle belirtilebilir. (Berkay'ın "Jesus" fikridir.)

Eğer katılım 2 kişiden fazlaysa herkezin birbiriyle eş sayıda karşılaşıp galibin belrilenebilmesi için katılımcı sayısının 2 ile modunun 0 olması farketmiyor ki şuanki yazdığın sistemde ufak bir ekleme ile buna gerek yok.

Tournamentplayers(1) listesindeki playerları birbirleri ile karşılaştırıp kazananı tournamentwinners(2) listesine attırmışsın ve birdahaki dönüşte 1. listedeki toplam eleman sayısı 2 den küçükse ki başta yaptığın sorgu yüzünden 2 ve 2 nin katları olmak zorunda liste 2 deki elemanları tekrar liste 1 e atarak bir döngü sağlamışsın bu döngüyü değiştirmek yerine baştaki mod sorgusunu çıkarıp 120. satırdaki else kısmını elseif sorgusu haline getirip bu sorguda liste1 eleman sayısı 2 den küçük ve 0 dan büyük (1) ise liste1 deki elemanı liste2 ye aktarıp sorguyu başa döndürürsek katılımcı sayısı 2 ile modu 0 ise doğrudan sistem rayına oturacaktır fakat 2 ile modu 0 olan bir sayının +1 ine eşitse yarışmacı sayısı 2 ve 2 nin katlarına eş olana kadar fazlalık kişiyi pas geçirerek devam devam edecektir.(turnuvayı bir insan düzenlese dahi bu şekilde olacağı için sıkıntı olmuyacaktır).

Gene bu düzenekte katılımcı sayısı 1 ise otomatikman turnuvayı kazanacaktır , katılımcı sayısı 3 ise ilk 2 kişi random olarak seçilip karşılaştıktan sonra pas geçen kişi bu karşılaşmanın galibi ile karşılacaktır ve kazanan turnuvanın galibi olacaktır.

Finalleri atlattıktan sonra geliştirme kısmında bende yardımcı olmak isterim :)

Düzenleme ; yazım yanlışlığı.

Bu konu unknow tarafından düzenlendi(2011-06-03 06:51, 12 yıl önce)
şahane olmuş gökberk eline sağlık.
Members
0.2
Çok başarılı gerçekten..
çok iyi.

Üye Ol veya Giriş Yap

Bu forum başlığına mesaj atmak istiyorsanız hemen üye olun veya giriş yapın.