Jump to content

Zoles spēlēšanas algoritms


MarisO
 Share

Recommended Posts

 

 

pie kam open source?
A kas vainas - cilvēks vismaz pārmaiņas kaut ko netaisa, lai noslauktu piķi. Apsveicami! 
  • Patīk 1
Link to comment
Share on other sites

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 comment
Share on other sites

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

Labots - AndrisBB
  • Patīk 1
Link to comment
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 comment
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 comment
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.

Labots - MarisO
Link to comment
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 comment
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);
Labots - MarisO
Link to comment
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 comment
Share on other sites

@@drunk_lizard, vai varētu, lūdzu, izvērstāku komentāru par saviem iebildumiem? kuri aspekti programmas izpildījumā Tevi satrauc?

  • Patīk 1
Link to comment
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 comment
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 comment
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ēž?

Labots - Guest
  • Patīk 1
Link to comment
Share on other sites

es.sēžu.uz.xp..divos.datoros.bet.ar.garumzīmēm.man.nav.problēmu.

Link to comment
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

Labots - MarisO
Link to comment
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.

Labots - Sanchus
Link to comment
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 comment
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?

Labots - camel
Link to comment
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.

Labots - MarisO
Link to comment
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 comment
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 comment
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

Labots - MarisO
Link to comment
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#.

Labots - camel
Link to comment
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".

Labots - MarisO
Link to comment
Share on other sites

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 comment
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??

Labots - Edis7
Link to comment
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 comment
Share on other sites

  • 4 months later...
(labots)

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

Labots - MarisO
Link to comment
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 comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...