Jump to content

Zoles spēlēšanas algoritms


MarisO

Recommended Posts

Iesakiet kādu labu un interesantu zoles algoritmu. 

 

Es vienu dienu uzrakstīju open source zoli,  kas gan vēl nav 100% pabeigta.

 

https://github.com/maruks/erl-zole

 

Varbūt kāds vēlas tādu algoritmu uzkodēt un atsūtīt pull request.

Edited by MarisO
Link to post
Share on other sites
  • Replies 80
  • Created
  • Last Reply

Top Posters In This Topic

  • MarisO

    17

  • camel

    11

  • AndrisBB

    5

  • aoma

    5

Top Posters In This Topic

Popular Posts

sāc spēlēt uz naudu, kad būsi pakāsis piķi ātri sapratīsi kā jāspēlē 😀

Dzīve mums dota tikai viena un izšķiest to zoles spēlē utml., manuprāt, nav labākais ceļš.😏 Zekiem, tiem jau mazāka izvēle.

Es tomēr par to, lai vidējā vērtība arī tajās 8 stundās būtu ar pluszīmi. Kaut nelielu. Pasarg'Dies, ja sanāk kārtot lietas ar tādu, kam ir mīnuszīme vai vienalga. Ir taču izvēles brīvība ar ko nodarb

Ar algoritmu es domāju programmu, kas spēlē zoli,  izrēķina, kuru kārti izspēlēt.

To rēķināšanu noteikti var veikt vairākos veidos, implementēt dažādas stratēģijas utml

Link to post
Share on other sites
AndrisBB

Es domāju būtu interesanti uztaisīt neatkarīgu serveri, kautvai parasts node.js socket servers, kurš dala kārtis un pārbauda vai klienti nešmaucas. Tad pie servera var pieslēgties dažādi klienti un izspēlet partijas, tādā veidā noskaidrot, kurš var uzrakstīt labāko klientu.

Protams lai būtu iespējams salīdzināt, partijas būtu jāizpēle vairākas reizes ar tām pašām kārtīm, mainot klientus vietām, kas gan var novest pie šmaukšanās.

---------------

Vai arī vienkārši jāizspēlē liels daudzums partiju

Edited by AndrisBB
  • Patīk 1
Link to post
Share on other sites

Var sākt ar vispārzināmajiem "likumiem":

- mazais: caur savējo ar to, kas mazāk

- mazais: caur lielo ar to, kas vairāk (kuru?)

- ...

Sākot ar vienkāršiem likumiem parasti var diezgan tālu tikt.

 

Galdiņa pacelšanas izvērtēšana jau gatava?

Būtu interesanti arī aplūkot pašmācīšanos.

Ja uznāks vēlme mācīties erlang, varbūt pakodēšu.

Link to post
Share on other sites
Mezavecis

Es nesaprotu šī topika jēgu. Pats ielicis kaut kādu kodu (nevis algoritmu), kas dara kaut ko, un tagad meklē muļķus, kas lasīs viņa kodu un meklēs kļūdas tajā. Tak pats miljons reižu esi teicis, ka svešu kodu labot ir slikti.

 

P.S. Būtu ieliecis kodu kādā no vispārzināmām programmēšanas valodām, varbūt kāds mēģinātu iedziļināties, ko un kāpēc esi saveidojis. Atliek griezties pie saviem Londonas pagrīdes kluba korišiem. 

  • Patīk 1
Link to post
Share on other sites
šis te izskatās savādi:

 

 

Tie ir punkti, cik par to kārti savāc.  

 

 

atvērta koda zoles serveri ar nesamākslotu, pārskatāmu kodu

 

 

Serveris jau ir ,  tikai  tam vēl nav web socketa.    Es tagad pie tā strādāju. Tad botus varēs rakstīt jebkurā valodā.    Tagad to var erlangā - skatīt  player.erl  - pašlaik tas prasa izvēles ievadi no klaviatūras.

Edited by MarisO
Link to post
Share on other sites

Varbūt ne pa tēmu, bet gribu uzjautāt @MarisO par FP.

Īsti nesaprotu funkcionālās programmēšanas konceptu. Operēšanu ar mainīgajiem iekš FP laikam notiek šādi:

state = f(state, event)

- funkcija reagējot uz notikumu paņem visu mainīgo kopumu (state), izmaina, piemēram, vienu baitu un saliek jaunu state objektu, jo cita varianta saglabāt izmaiņas FP taču neparedz. Vai es esmu sapratis kautko ne tā?
 

Link to post
Share on other sites

@camel,    Jā tā ir,  tikai funkcija ,  paņem tikai to state, kas uz to attiecas

Ir ērti lietot rekursiju.

Par piemēru,  zoles klienta state vienmēr atrodas f-jas argumentos  Name, Table, Cards

Tā mainās,  kad dabon citas kārtis no servera


loop(Name, Table, Cards) ->
    receive   %  saņem event no servera
{cards, NewCards} ->   %  jaunas kārtis
   loop(Name, Table, NewCards);   %  state update
{prompt, play} ->
   io:format("Player ~p~n",[Name]),
   print_menu(Cards),
   C = list_to_integer(io:get_chars(">",1)),
   send(Name,Table, {play, lists:nth(C, Cards)}),
   loop(Name, Table, Cards);
Edited by MarisO
Link to post
Share on other sites

To, ka paņem ..., saprotu, bet ko dara ar atgrieztajām izmaiņām. Ja mainīgais parasti ir pakārtots kautkādam state, tad izmainot šo mainīgo, jāliek viss state no jauna - šito es nesaprotu.

Link to post
Share on other sites

Nu izliktais ir prasts spēles dzinējs, kas iedala kārtis, pārbauda izspēlēto kāršu adekvātumu, skaita stiķus.

 

neredzu, kur būtu reklamēts AI. redzu tikai pieprasījumu pašārēt kāda inteliģenta klienta speceni/izpildījumu.

Varbūt kāds vēlas tādu algoritmu uzkodēt un atsūtīt pull request.

Ar algoritmu es domāju programmu, kas spēlē zoli,  izrēķina, kuru kārti izspēlēt.

pašlaik tas prasa izvēles ievadi no klaviatūras.

joprojām neredzu, kur būtu kāds AI sludināts.

  • Patīk 1
Link to post
Share on other sites

nu es no eerlang saprotu tikai mazliet vairaak kaa  topika autors no darba tirgus latvijaa, bet tur ir implementeeta elementaara zoles speelees 'gramatika' (tas notiek peec taa utml.). Interesantaa dalja - kad kaa riikoties (kur zoles gadiijumaa interesantaaakais ir 'mineeshana' kaadas rokas ir citiem un mazo speeleeshana kopaa). Zjeel :>

 

p.s. erlang AI realizaacijai ir ... diivaina izveele. Klasiski buutu vai nu py (ko var lasiit arii ielejkoderis) vai arii kaads modernais LISPa paveids (alias scala)

Link to post
Share on other sites

kāds vēl ir tik senā pagātnē iesprūdis, ka instalē tildes un apostrofus priekš grāmatzīmēm? latviešu valoda pat vairākos layoutos tak jebkurai populārai OS nāk, vai te visi vēl uz xp sēž?

Edited by Guest
  • Patīk 1
Link to post
Share on other sites

Es esmu uzkodējis web soketu.

 

https://github.com/maruks/erl-zole-ws

 

Tagad var spēlēt lietotāji savā starpā  vai pret vienkāršu servera botu,  ja atver galdu ar "pvb-table-" prefiksu nosaukumā.

 

Klientam gan vēl nav nekāda GUI.    Tas atrodas šeit  http://maruks.homelinux.org:8080/

 

Ja kāds vēlas uzkodēt labāku botu vai GUI klientu  tad lūdzu dariet tā !

 

servera bota kods:   https://github.com/maruks/erl-zole/blob/master/src/player.erl

Edited by MarisO
Link to post
Share on other sites

Daži ieteikumi art-intelektam:

 

Spēlēt uz naudu. Motivē

Caur savējo ar kungu vai 9, ja Tev rokās ir divi sūdi

Dot Lielajam 10 (vai ļoti lielas pārliecības gadījumā) dūzi, ja tev ir 3 tādi lieki un Tev jāiet spēles sākumā caur viņu

Caur savējo ar Dūzi vienā no sākuma gājieniem, ja vispār esi pie gājiena ticis

Pietaupi trumpas beigām, ja sūdi rokās. Galvenais skaitīt, kādas kārtis ir spēlē. Nomest vai steidzīgi atbrīvoties no trumpja, ja to kopskaits spēles sākumā ir 2 un mazāk

Atmesties uz sūda, ar ko iziet Lielais, bet ievēro 50/50%% uz Jelgavniekiem

Nomest dāmu, jo 3p kalpa 2p vietā, ja briest sūdi

Pietaupīt lielāko trumpi, ja otrs Mazais ir švaks

Nedabūt pa degunu no otra Mazā, spēlēt pareizi un partijā nepieļaut kļūdas, kas izšķir uzvaru

....

un vēl n-principi, par pašas zoles spēlēšanu nerunājot..

 

Labprāt ar tiesnesi Mežaveci un vēl dažiem pensionāriem no boot vecbiedriem uzspēlētu zoli.

Edited by Sanchus
Link to post
Share on other sites
Raimonds1

uzraksti kodam komentus

šite tiek noteikts, ja prasa trumpi, liek trumpi, ja nav, var likt pīķi, kreicu, ercu

šite-nosaka, kuram stiķis

site nosaka , ka prasa atteicīgo mastu, tieksim, ercu un atļauj likt ko citu, ja nav

šite paziņo, signalziē, ka šito lieko tu neliksi, ja tev ir trumpe prasītā vai attiecīgā masta kārts

šeit skaita punktus

šeit pieļauj atmešanos un skaita punktus

Link to post
Share on other sites

Varbūt to tur ir ērti lietot clojurē, bet tas nemaina to, ka lai izmainītu vienu baitu, papildus jāveic apjomīgas manipulācijas. Paņemsim F#, sarakstīsiem objektus, kas satur citus objektus un pamēģināsim tur saglabāt izmaiņas - tas taču ir nereāls, neefektīvs pasākums. Ja to iekš FP var noorganizēt kaukā savādāk, tad izstāsti kā. Savādāk FP ir drīzāk bezjēdzīgs.

 

Par mainīgo glabāšanu argumentos:

Erlangā tas receive konstrukts izskatās neaatbilstošs FP garam, jo tu nosūti mesidžu funkcijas loopam, kas rada blakusefektus - izmaina loopa argumentus. Vai to vispār var uztaisīt tīrā FP?

Edited by camel
Link to post
Share on other sites
Ja to iekš FP var noorganizēt kaukā savādāk, tad izstāsti kā.

 

 

Var gan:

https://en.wikipedia.org/wiki/Persistent_data_structure

Iekš F# noteikti tās ir implementētas.   Clojurē visas iebūvētās datu struktūras ir funkcionālas.   Tām ir non-destructive update.

 

Var pats tādu uzrakstīt:

https://github.com/maruks/clj-data

Tās ir no šīs grāmatas   http://www.amazon.co.uk/Purely-Functional-Data-Structures-Okasaki/dp/0521663504

 

 

blakusefektus - izmaina loopa argumentus. Vai to vispār var uztaisīt tīrā FP?

 

 

Tā būtu pure funkcija, kas saņem sarakstu ar saņemtajiem ziņojumiem  un returno atbildes ziņojumu.    Tas gan īsti nebūtu idiomatic erlang. Viss jau nav "tīra" funkcija.

 

http://blog.jenkster.com/2015/12/what-is-functional-programming.html

Tajā okasaki grāmatā ir visādi hīpīši,  bet iekš clojure standarta lib tāda nav.

Haskelī gan tāds hīpītis ir  un visi haskelisti varēja viegli uzkodēt vienu hackerrank uzdevumu, kur šādu hipīti vajag.

Tad es pamēģināju to leftist heap ,  ko esmu uzkodējis ,  un viss notikās.

Edited by MarisO
Link to post
Share on other sites

Mans viedoklis ir tāds, ka padarīt programmas mainīgo kopumu (state) persistent (izmaiņu saglabāšana nezaudējot vecos datus) ir pārāk darbietilpīga un neefektīva padarīšana. Gala lietotājs no tā neko neiegūst, un programmētājam arī maz labuma no tā FP.

 

Gaidiju, ka tu piekritīsi tam.

Link to post
Share on other sites
erikonkulis

 

 

latviešu valoda pat vairākos layoutos tak jebkurai populārai OS nāk
win7 nav lv uz apostrofa, tātad tā nav vairs populāra OS?
Link to post
Share on other sites
pārāk darbietilpīga un neefektīva padarīšana.

 

 

Parasti tas ir tikai + log n,  salīdzinot ar parastu, imperatīvu datu struktūru. 

 

 

Gala lietotājs no tā neko neiegūst, un programmētājam arī maz labuma no tā FP.

 

 

Es gan domāju, ka FP ir krietni ērtāk,  vismaz man tā ir.    Es tāpēc vairs nekodēju javā,  jo tur nav persistentās datu struktūras,  variabļi  nav  single-assignment  un ir daudz visāds bullshit,  objekti un klases.   WTF

Edited by MarisO
Link to post
Share on other sites

Parasti tas ir tikai + log n

 

Paņemsim tipisku programmu:

class MyClass
{
  int var1jfdjsl;
  int var2k97fhv;
  .....
  int var1000kgkgu;
}

MyClass c;

void OnMsg(int msg)
{
   switch(msg)
   {
      case 1: c.var1jfdjsl = 12;
      ....
   }
}

Jautājums: par cik lēnāka būs FP implementācija, kad aiz katras var = val operācijas jātaisa jauns myclas objeckts un vecie dati jākopē. Ja starpība nav 10x lielāka, tad varbūt vēl var apsvert iespēju pamēģināt kautkādu haskeli vai F#.

Edited by camel
Link to post
Share on other sites

Ja tās klases vietā tiek lietota persistentā Map struktūra?     tad par log32 n

 

HAMT Map implementācija

 

https://en.wikipedia.org/wiki/Hash_array_mapped_trie

 

The programming languages Clojure,[2] Scala, and Frege[3] use a persistent variant of hash array mapped tries for their native hash map type

Link to post
Share on other sites

nu tas atkarīgs no tā,  cik tajā struktūrā ir elementu

HAMT koka algoritmiskā sarežģītība ir  log32 n

10 elementi - papildus 1 operācija

1'000'000 - papildus 4

protams, plus/mīnus kautkāda konstante, kas no implementācijas atkarīga  (heštabula  vs  koks)

 

vienkāršāk izsakoties "tikai drusku lēnāk" (praktiski par konstanti) kā parasta Map implementācija

 

 

 

 

Te laikam nav daudz open source / zole  entuziastu ?  Nav uzkodēts ne bots,  ne web klients.    Vakar webs tika mēģināts clojurescript "hack the tower" eventā,  diemžēl programmētāji to nevarēja izdarīt.    Iekš UK zolīte nav pazīstama.  Šeit spēlē tādu "shithead".

Edited by MarisO
Link to post
Share on other sites
AndrisBB

Es jau labprāt uzrakstītu savu klientu, kurš pieveiktu tavējo, tik ir citas prioritātes un brīvais laiks ir ierobežots.

Link to post
Share on other sites
  • 1 month later...

>Londonas java koderis / iOS fanātiķis....Sveiks! Tev ir Zoles portaals gatavs, vai kaa?


>Maris O. Ja zolīte nav,_-tad naff arī skaidrot  rekursīvās fff-jās tautai, n(!) > def factorial( n ): if n == 1: return 1 return n * factorial( n - 1 ) Tas lieki! Ok, varbūt visiem saprotamā val. UK, Jums Zolīte tur jāspēlē ar "shithead", bet nav doma to botāniķu pulciņu pamest??

Edited by Edis7
Link to post
Share on other sites
  • 4 weeks later...

Malacis.

Izspēlēju vienu partiju pret datoru. Biju lielais. Kaut kā negudri tie mazie spēlēja, visu laiku līda zem maniem trumpjiem, kaut bija viņiem stipras kārtis, vinnēju.

Malacis, Māri.

Link to post
Share on other sites
  • 4 months later...

Tam ir izmantojams polimorfisms.   Iekš OOP (visādās javās) - klašu hierarhija.  Type klases haskelī.  Multimetodes / protokoli clojurē.   Pattern matching erlangā.

Edited by MarisO
Link to post
Share on other sites
Леший

Es īpaši nepārzinu erlang un neesmu iedziļinājies tavā algo, bet:

strength({R, S} = C) ->
    trump(C) + strength(R) + strength(S);
strength(clubs) -> 4;
strength(spades) -> 3;
strength(hearts) -> 2;
strength(diamonds) -> 1;
strength(queen) -> 130;
strength(jack) -> 120;
strength(ace) -> 110;
strength(king) -> 95;
strength(N) -> N * 10.

Kad es jaunības gados mēģināju uzprogrammēt zoles botu, strength bija daudz vienkāršāks: ne-trumpa 9 - 0, ne-trumpa karalis - 1, ne-trumpa desmit - 2, ne-trumpa dūzis - 3. Tālāk visām trumpām spēks izaug, un nav divu trumpu ar vienādu spēku, tāpēc [7d .. Qc] = [4..17].

Pēc tam aprēķināt uzvarētāju ir elementāri.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...