Jump to content

F#, zolīte un vēl kautkas


camel
 Share

Recommended Posts

Lasiju par F#, ka ir kruta programmēšanas valoda. F# kods sanākot īsāks, vieglāk saprotams un mazāk iespēju kļūdīties, jo mainīgie ir nemainīgi un funkcijām nav blakusefektu. Saņēmos to pārbaudīt praksē un uztaisiju mazu F# programmiņu - zolīti (atkal). UI daļa ir WPF un c#, spēles loģika F#. Rezultāts itkā darbojas un kods varbūt arī ir īsāks (nez vai smukāks), bet rakstīšana nebija viegla. For ... in ... cikliem nav break iespējas, jāraksta rekursīva funkcija; klasēm nav protected locekļu, jāņemās ar interfeisiem; un nevar no funkcijas iziet vienkārši kā c# ar if ... then return ..., aiz then jābūt else, sanāk nesmukāk kā gribētos. Un pie garākiem koda failiem Visual Studio paliek bremzīgs.

 

Lai nu kā, projekta kods apskatāms te, ja kādam ir interese: https://github.com/Camel-RD/Zole. Tur arī gatava programma.

 

Testējot programmas ātrdarbību (izspēlētās partijas sekundē), pamaniju interesantu defektu - pēc kāršu izdales secības trešais spēlētājs uzvar biežāk kā pārējie. Piemēram, izspēlējot 1000 * 50 partijas spēlētāju punkti -3891 -1071 4962 (skat. projektu Test). Ja pamaina kāršu izdales secību failā Game.fs rinda 451, partiju rezultāts izlīdzinās. Bet īsti nav saprotams kapēc rezultāts tā mainās. Viens variants - kārtis tiek slikti sajauktas, bet nevaru pamanīt, kur problēma, te koda fragments:

type FullCardDeckShuffled() =
    static let rnd = Random()
    let _Cards =
        let ind : int array = Array.create 26 -1
        for i = 0 to 25 do
            let k = rnd.Next(26 - i)
            let rec fpos ci ct =
                match ind.[ci], ct with
                | -1, x when x = k -> ci
                | -1, _ -> fpos (ci + 1) (ct + 1)
                | _, _ -> fpos (ci + 1) ct
            let pos = fpos 0 0
            ind.[pos] <- i
        ind |> Seq.map (fun k -> FullCardDeck.Cards.[ind.[k]])
        |> ImmutableList.CreateRange
    member x.Cards = _Cards

 

 

Labots - camel
  • Patīk 2
Link to comment
Share on other sites

Grūti jau kautko saprast no tā koda ja nav rakstits FSharp.

Bet klasiskais algoritms jau ir:

-- To shuffle an array a of n elements (indices 0..n-1):
for i from n−1 downto 1 do
     j ← random integer such that 0 ≤ ji
     exchange a[j] and a[i]

Izskatas ka tu dari to pašu, bet nevar būt drošs. Varbūt iedod tam random kautkādu seedu (laiku vai tml), lai pamainās sequence un skaitļi neatkarototos.

 

 

Link to comment
Share on other sites

Tāds vienkāršs shuffle kods man sākumā kautkā nepatika, jo - kā lai aprēķina varbūtību ka n-tais elements rezultātā būs, piemēram, pozīcijā 0. Bet tagad, kad skatos, mans kods nav labāks un principā rezultāts ir tāds pats.

Link to comment
Share on other sites

Pārrakstiju kodu šādi, jo google arī saka ka tā vajag, bet rezultāts tas pats.

type FullCardDeckShuffled() =
    static let rnd = Random()
    let _Cards =
        let ind : int array = Array.init 26 (fun i -> i)
        for i = 25 downto 1 do
            let j = rnd.Next(i + 1)
            let v = ind.[j]
            ind.[j] <- ind.[i]
            ind.[i] <- v
        ind 
        |> Seq.map (fun k -> FullCardDeck.Cards.[ind.[k]])
        |> ImmutableList.CreateRange


 

Link to comment
Share on other sites

Pamēģini iedot tai random funkcijai seedu, varbut tas ko maina. Ja tu milisecunde izspele vairakas partijas, tad rezultats bus viens un tas pats. Kartis tiks sajauktas identiski.

Cik partijas tu sekunde izspele?

 

 

The default seed value is derived from the system clock, which has finite resolution. As a result, on the .NET Framework only, different Randomobjects that are created in close succession by a call to the parameterless constructor will have identical default seed values and, therefore, will produce identical sets of random numbers. This problem can be avoided by using a single Random object to generate all random numbers. You can also work around it by generating your own random seed value and passing it to the Random(Int32) constructor. For more information, see the Random(Int32)constructor. Note that this limitation does not apply to .NET Core.

 

 

 

https://docs.microsoft.com/en-us/dotnet/api/system.random.-ctor?view=netframework-4.8

 

Labots - AndrisBB
Link to comment
Share on other sites

pirms 11 stundām , AndrisBB teica:

Ja tu milisecunde izspele vairakas partijas, tad rezultats bus viens un tas pats. Kartis tiks sajauktas identiski.

Tur tiek izveidots viens static Random ģenerators - rezultāts nebūs viens un tas pats

Link to comment
Share on other sites

Saglab'a visus tos random skaitlus kautkada vectoru vectoraa un beigas nodumpo uz failu, varbut tur kautkas interesants ir redzams.

Link to comment
Share on other sites

2019.10.11. , 22:04, alusbundza teica:

lai varētu vietējos mačus uzlaist

zoles spēlēšana man tik stipri nemaz neinteresē

vienkārši reizēm niez nagi kautko taisot iemācīties ko papildus, bet oriģionālas idejas par to ko labu uztaisīt - tā īsti nav

  • Patīk 2
Link to comment
Share on other sites

static let rnd = Random()

Randomiem parasti ir sīdi no taimstampa vai kā līdzīga. Sagaidāms, ka ar defaulto būs auzas.
Biedri jau ieteica - nodumpo, teiksim, 1000 random vērtības no katra  rnd.Next(i + 1); un interesei paskaties, cik ļoti randomi viņi būs.

for i = 25 downto 1 do
            let j = rnd.Next(i + 1)

F# savu mūžu neesmu taustījis, bet es vairāk uzticētos tam, ka uzģenerēt randomu UN tad  "% i" (dalīšana ar atlikumu).

Kādu nejaušību tu gribi, ja ģenerē randomu no 2 vai no 3?

 

Autoram žetons par centību, ne pirmo gadu attīstībai taisot līdzīgas lietas! :good:

Labots - usver
Link to comment
Share on other sites

Uztaisiju pielabotu versiju, jāiet arī uz inteļiem.

Un rnd problēma atrisinājās, pavisam muļķīga kļūda pašā deguna galā

Link to comment
Share on other sites

Pameklējot, atradu internetā interesantus skaitļus par zolītes popularitāti.

 

Šeit ir skaitļi par 2 draugiem.lv applikācijām:

http://elviss.lv/appstats/applications/view/3 ap 5200 spēlētāju dienā

http://elviss.lv/appstats/applications/view/178 ap 2400 spēlētāju dienā

 

Šeit ir redzami daži cipari par to cik zolītes bizness ir ienesīgs:

http://pardodbiznesu.lv/lv/spele-zole-aplikacija-un-web-versija

gadā ap 11000 eur, turklāt biznesa vērtība īpašnieka skatijumā 49 000 eur

 

Man personīgi šie cipari liekas neticami, mūsdienās taču ir daudz interesantāki veidi kā notriekt brīvo laiku - kapāt minecraft, fortnite, far cry, .... - bet rauties uz tupās zolites spēlēšanu, turklāt online un vēl par to maksāt - pīpļu dīvainībai nav gala. Turklāt, cik dīvainam un bezkaunīgam jābut tam piznesmenim, lai par tupās zoles spēlēšanu online iekasētu naudiņu.

 

Labots - camel
Link to comment
Share on other sites

Zolīte aizgāja, bet es kā lielais Zolēju, dabūju nezkāpēc galdu, norakos, vinnēju un man ieskaitīja +10 kā par vinnētu zoli. :D Gļuks? 

Link to comment
Share on other sites

jjjāāā - galdu dot nevajadzēja

jāpaskatās noteikumos, ko tad ar galdu dara - pieskaita lielajiam vai mazajiem vai nevienam

Link to comment
Share on other sites

Quisoft Dev

Camel - paskatījos kodu, daudz darba esi ieguldījis!

 

Vari, lūdzu, pastāstīt savas sajūtas kā tagad skaties uz programmēšanu C# vai OO vispārīgi?

Spēcīgāka F# tipu sistēma taču lika daudzām kļūdām, kuras būtu bijušas C#, pazust?

 

Ko domā darīt/mācīties tālāk - līdīsi dziļāk F# vai varbūt tālāk sekos Haskell? :)

 

Link to comment
Share on other sites

90-to beigās un 2000 pašā sākumā ar kolēģiem netā uzrāvām zolīti, toreiz vēl bija pa velti. Un neslikti mums veicās. Personīgi es, tieši pateicoties šai vietējai latviešu internetzolītei, arī iemācījos spēlēt zoli. Bet tad kautkāda komercija panesās un pametu zoli.

Link to comment
Share on other sites

Un kāda jēga no tām ntajām implementācijām? MarisO tak kautkad senāk bij jau zoles serveri uztaisijis.

Link to comment
Share on other sites

Man tiešām to nevajag :D Pietieksoši jau pa dienu esu atskatijies uz C koda rindām, pa vakariem, tad labāk aizeju uz sportazāli smagumus pacilāt vai palēkāt kādā fitnesa klasē.

 

Maz ticams ka viens cilvēks var uztaisit kautko nopietnu, januvienigi ja citu nav ko darīt vai arī programēšana ir kā hobijs, tad cits iedvesmas līmenis.

Ja uztaisa kā open source projektu, tad ir kautkādas cerības nonākt līdz kautkam lietojamam, bet tad nevar būt kautkādas eksotiskās valodas kā FSharp, Erlang utt. CSharpi arī atkrīt, tas pa lielam priekš Windowistiem.

Parasts Pytons visu izdarītu lieliski.

 

Labots - AndrisBB
Link to comment
Share on other sites

Salaboju, lai pareizi zolējas

 

pirms 1 stundas , AndrisBB teica:

Maz ticams ka viens cilvēks var uztaisit kautko nopietnu

Paskaties kādas man tur krutas grāmatvedības programmas

 

pirms 1 stundas , AndrisBB teica:

Ja uztaisa kā open source projektu, tad ir kautkādas cerības

Cerība = 0, it īpaši tādā daudznesološā projektā

 

pirms 1 stundas , AndrisBB teica:

CSharpi arī atkrīt, tas pa lielam priekš Windowistiem.

Linuxā darbojas uz mono, un tagad ir net.core (un net.standard)

 

Link to comment
Share on other sites

1 stundu atpakaļ, camel teica:

Linuxā darbojas uz mono, un tagad ir net.core (un net.standard)

 

Ai, nu tu taču zini ka tas ir risinājums caur pakaļu un neviens Linux developers neņemsies ar CSharpu kautvai tapec ka vienkarshi vinju nezin, jainstelē kautkadus nezināmus tūļus utt.. Saprastu, ja vel trūktu valodas, kuras darbojas normāli uz faktiski visām platformām, tas pats Pythons ko jau pieminēju, visādi NodeJS, pat Java izklausās labāks risinājums.

Ja vēl runa iet par kautkādu serveri, tad tas visdrīzāk darbosies uz Linux.

Pats saki ka tas ir nedaudzsološs projekts, Pitons izklausās vienīgā valoda, kas varētu piesaistīt vairāk par vienu dalībnieku. Mazs sakars ar to kura valoda, labāka vai sliktāka, tas tāds tīri politiski vissaprātīgākais lēmums.  

Labots - AndrisBB
Link to comment
Share on other sites

pirms 3 stundām , ieleja teica:

un ja links būtu

 

https://zole.boot.lv/

 

tad tas kalpotu kā foruma reklāma tautai

Opijs tautai? :D 

 

Bet nu vispār ideja patīk, jo šad tad iebrienu draugos un kādu partiju izspēlēju. Nebūtu slikti, ja te tāda iespēja būtu.

Link to comment
Share on other sites

Kautko pielaboju

 

Šeit bildītes kā tas izskatās uz datora un androide:

zolewpf.thumb.png.c8431f7f9814df04bc43d6fab7128434.png

 

zoleandr.thumb.png.dd95bd5a513f14500fd64ae25b56eeb0.png

 

Ja liekas, ka dators spēlē nepareizi, var paskatīties failu GameSolver.fs - nav nekas tur extra sarežģīts

 

Link to comment
Share on other sites

Pašas spēles failu neatradu, bet ņemties ar kompilēšanu - slinkums. Taču par pašu ideju žetons, pievienojos te jau minētajai idejai par online spēles noderīgumu zem boot.lv domaina.

Taču drošvien taisnība ir tiem kuri saka, ka labāk šādus projektus rakstīt čūskā, vai Java. Starp citu, arhaiskās vardes arī ir uz Java's (vismaz bija kādreiz). Ir kādi iemesli kapēc nevēlies projektu veidot kādā no šim valodām?

Pa cik bieži serveris būs patukš, būtu ideāli ja serveris varētu emulēt trūkstošos spēlētājus partijai (cik sapratu, šobrīd tāda lieta nav).

 

Link to comment
Share on other sites

sataisīt var, bet tad kāds atkal nevarēs izsekot līdz

... jāuztaisa sākumā iespēja izvēlēties, vai rādīt būltiņu, vai nē

Link to comment
Share on other sites

Nav riktīgi ar pirmo roku - palaidu garām, Askolds pacēla kā lielais un sāka spēli, bet viņam otrā roka...

Link to comment
Share on other sites

Nē, pirmais iet tas, kam pirmā roka - pa pulksteni nākamais aiz kāršu dalītāja.

Link to comment
Share on other sites

Te ir tā zole, ko es kādreiz uzkodēju iekš Erlang / Clojurescript:

http://maruks.homelinuxserver.org:9090/

 

Tur tikai nav jēdzīgi implementēta tā daļa, kur dators spēlē zoli.   Jūs varat to izdarīt un atsūtīt man pull request.

 

 

 

Labots - MarisO
Link to comment
Share on other sites

  • 2 weeks later...

Ir uztaisīts arī mazs zoles serveris.

Programma te: https://github.com/Camel-RD/ZoleOnline/releases/latest

Servera adrese: klons.id.lv

Ports: 7777

 

2019.10.28. , 00:16, MarisO teica:

Te ir tā zole, ko es kādreiz uzkodēju iekš Erlang / Clojurescript:

http://maruks.homelinuxserver.org:9090/

jep, tādas lietas jātaisa uz web, man no web programmēšanas maza saprašana

 

2019.10.28. , 00:16, MarisO teica:

Tur tikai nav jēdzīgi implementēta tā daļa, kur dators spēlē zoli.   Jūs varat to izdarīt un atsūtīt man pull request.

Erlangā toč neviens tev netaisīt, paņem kaut manu f# kodu un uztaisi pats

Link to comment
Share on other sites

Paldies, super! Viss strādā, vienīgi spēlmaņu nav. :( 

 

P.S. Kad visi palaiž garām, automātā aiziet Mazā Zole, kas nav īsti pareizi, jo pastāv vēl varianti Galds, vai Pule. Korektākais pēc noklusējuma būtu Pule, jo Galds un Mazā Zole ir tādi sētas varianti. ;) 

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...