ทำสัตว์เลี้ยง Tamagotchi / Giga ที่เรียบง่าย!


9

Tamagotchi และ Giga Pets เป็นอุปกรณ์อิเล็กทรอนิกส์ขนาดเล็กซึ่งจำลองสัตว์เลี้ยงเสมือนจริงเล็กน้อย สัตว์เลี้ยงนี้มีหลายสถิติเช่นสุขภาพความหิว ฯลฯ
ฉันเพิ่งเขียนตัวอย่างนี้:

import msvcrt,os,sys;d=m=100;h=s=t=p=0;f=10
while 1:
 os.system('cls'if os.name=='nt'else'clear');print("health:",d,"\nhunger:",h,"\nsleep:",s,"\nfood:",f,"\npotions:",p,"\nmoney:",m);t+=1
 if msvcrt.kbhit():
  k=ord(msvcrt.getch())
  if k==102 and h>8 and f:f-=1;h-=9
  if k==115:s=0
  if k==112 and p:p-=1;d+=9
  if k==98 and m>8:m-=9;p+=1
  if k==116 and m>8:m-=9;f+=1
 if t>99:
  t=0;h+=1;s+=1
  if s>80:s=0;h+=9
  if h>80:d-=1
  if d<1:sys.exit(0)
  if d>79:m+=1

นี่เป็นสัตว์เลี้ยงเสมือนกระดูกเปล่าใน 467 ไบต์! จากนั้นฉันก็สงสัยว่าผู้เชี่ยวชาญด้านรหัสกอล์ฟทำได้ดีแค่ไหนตอนนี้ความท้าทาย

ความท้าทาย

สร้างโปรแกรมที่ติดตาม 6 สถานะของสัตว์เลี้ยงเสมือนจริงและอัปเดตเมื่อเวลาผ่านไปและตอบสนองต่อการป้อนข้อมูลของผู้ใช้ สถิติคือสุขภาพและเงิน (เริ่มต้นที่ 100) อาหาร (เริ่มต้นที่ 10) และความหิวอดนอนและยา (เริ่มต้นที่ 0)

โปรแกรมควรอัพเดตค่าเพื่อตอบสนองต่อเหตุการณ์ต่อไปนี้:

  • ในขณะที่โปรแกรมไม่ได้รับอินพุตมันควรทำการอัพเดตตามช่วงเวลาปกติ (ช่วงเวลาระหว่างการอัพเดตไม่ควรสั้นกว่าครึ่งวินาทีหรือนานกว่าหนึ่งวินาที) การปรับปรุงแต่ละครั้งทำสิ่งต่อไปนี้:

    • ความหิวและการนอนหลับเพิ่มขึ้นทีละ 1
    • ถ้า Hunger 80 หรือสูงกว่าสุขภาพจะลดลง 1
    • หาก Sleep เป็น 80 หรือสูงกว่าจะถูกรีเซ็ตเป็น 0 และ Hunger จะเพิ่มขึ้นอีก 9
    • ถ้า Health 80 หรือสูงกว่าเงินจะเพิ่มขึ้น 1
    • ถ้า Health เป็น 0 โปรแกรมจะออก
  • โปรแกรมจะต้องตอบสนองทันทีเมื่อกดปุ่มต่อไปนี้โดยผู้ใช้ (ซึ่งหมายความว่าคุณจะต้องใช้คุณสมบัติภาษาหรือไลบรารีที่สามารถตรวจจับคีย์ที่ถูกกดและตอบสนองทันทีโดยไม่ต้องอ่านจากอินพุตมาตรฐาน) การกระทำดังต่อไปนี้:

    • f: หาก Hunger มากกว่า 8 และ Food ไม่ใช่ศูนย์อาหารจะลดลง 1 และ Hunger จะลดลง 9
    • s: Sleep ถูกรีเซ็ตเป็น 0
    • p: หาก Potion มากกว่าศูนย์ Potions จะลดลง 1 และพลังชีวิตจะเพิ่มขึ้น 9
    • b: หากเงินมากกว่า 8 เงินจะลดลง 9 และ Potions จะเพิ่มขึ้น 1
    • t: หากเงินมากกว่า 8 เงินจะลดลง 9 และอาหารเพิ่มขึ้น 1

เมื่อใดก็ตามที่ค่าสถิติที่เปลี่ยนพวกเขาจะต้องแสดงบนหน้าจอในรูปแบบ ต้องแสดงสถิติทั้งหกเมื่อใดก็ตามที่มีการเปลี่ยนแปลง และสถิติภายในจอแสดงผลจะต้องคั่นด้วยเครื่องหมายจุลภาคหรือขึ้นบรรทัดใหม่Stat: value

ความท้าทายนี้ตามปกติ กฎ: โปรแกรมสั้นที่สุดที่ปฏิบัติตามข้อกำหนดข้างต้นชนะ (โปรดทราบว่าตามปกติถ้าภาษาใหม่กว่าการแข่งขันการส่งจะต้องทำเครื่องหมายว่าไม่แข่งขัน)


คุณไม่ได้พูดว่าสถิติการเริ่มต้นคืออะไร
บลู

1
ผลลัพธ์จะต้องอยู่ใน "รูปแบบที่อ่านง่าย" นั้นคลุมเครือและดังนั้นจึงเป็น "หนึ่งครั้งต่อวินาที" คุณควรส่งความท้าทายไปที่กล่องทรายเพื่อรับข้อเสนอแนะและปรับปรุงพวกเขาก่อนที่คุณจะโพสต์ไปยังหน้าหลัก ...
FlipTack

1
มันไม่ชัดเจนอย่างไร? ฉันหวังว่าไม่ชัดเจนมีรายละเอียดเพิ่มเติมเพราะตัวเองไม่ชัดเจน
ender_scythe

2
Sandbox ไม่ช่วยอีกต่อไปเนื่องจากมีคำตอบอยู่แล้ว คนที่ทำเครื่องหมายว่าไม่ชัดเจนควรบอกว่าทำไมจึงไม่ชัดเจนแทนที่จะเป็นตัวเองที่ไม่ชัดเจน
ender_scythe

1
@BlueEyedBeast (และผู้มีสิทธิเลือกตั้งใกล้ชิดอื่น ๆ ) ฉันยังอยากรู้ว่าสิ่งที่ไม่ชัดเจน รุ่นดั้งเดิมมีปัญหาที่สำคัญบางอย่าง แต่ดูเหมือนว่าการแก้ไขได้รับการแก้ไขแล้ว อย่างน้อยที่สุดก็ชัดเจนเพียงพอสำหรับ Carcigenicate และฉันที่จะให้การส่ง แบ่งปันรายละเอียดบางอย่างเกี่ยวกับสิ่งที่คุณไม่ชัดเจนเพื่อ ender_scythe สามารถปรับปรุงได้
เรย์

คำตอบ:


6

C, 424 406 386 357 ไบต์

#define x(a,b,c)if(*#a==C){if(b>8){c-=9;}Z=0;}
L,M=100,H,S=-1,F=10,P,Z,C;t(){H++;S++;L-=H>79;if(S>79)S=0,H+=9;Z=1/L/2;alarm(1);}main(){nodelay(initscr(),L=M);signal(14,t);for(t(H=S);C=getch();Z=Z||printf("\rhealth: %d,hunger: %d,sleep: %d,food: %d,potions: %d,money: %d\n",L,H,S,F,P,M)){x(s,9,S=9;S)x(p,P+8,P--;L+=18;L)x(f,H,F--;H)x(b,M,P++;M)x(t,M,F++;M)}}

ฉันขอขอบคุณความต้องการอินพุตดิบและการอัพเดตแบบอะซิงโครนัสในข้อมูลจำเพาะของปัญหา แม้ว่าต้องใช้ค่าใช้จ่ายจากการตั้งค่า ncurses และตัวจัดการสัญญาณมันก็ดีที่มีความท้าทายเป็นครั้งคราวที่ (หวังว่า) จะไม่ได้รับรางวัลโดยอัตโนมัติโดยหนึ่งในภาษากอล์ฟเฉพาะ

คุณไม่ได้ระบุอย่างชัดเจนว่าเกมจบลงอย่างไรดังนั้นเกมนี้ถึงตายด้วยเสียงร้องไห้ของ Tamagotchi ดั้งเดิมของ "ข้อยกเว้นจุดลอยตัว (หลักทิ้งแล้ว)"

Ungolfed

/* Playing a bit fast and loose with the prototyping rules by omitting these;
 * none of the functions I'm using from them *exactly* match the default
 * prototype of `int f();`
 */
//#include <curses.h>
//#include <stdio.h>
//#include <signal.h>
//#include <unistd.h>

#define x(a,b,c)if(*#a==C){if(b>8){c-=9;}Z=0;}
L,M=100,H,S=-1,F=10,P,Z,C;

t() {
    H++;
    S++;
    L-=H>79;
    if(S>79)S=0,H+=9;
    Z=1/L/2;//0 if L>0. otherwise the pet dies of a floating point error
    alarm(1);
}

main(){
    nodelay(initscr(),L=M);
    signal(14,t);
    for(t(H=S); C=getch(); Z=Z||printf("\rhealth: %d,hunger: %d,sleep: %d,food: %d,potions: %d,money: %d\n",L,H,S,F,P,M)){
        x(s,9,S=9;S)
        x(p,P+8,P--;L+=18;L)
        x(f,H,F--;H)
        x(b,M,P++;M)
        x(t,M,F++;M)
    }
}

2

PHP, 396 413 ไบต์

(แดงรายการรหัสกอล์ฟครั้งแรกของฉันที่ฉันต้องแก้ไขเป็นจำนวนไบต์แก้ไขเพื่อลบการเรียก sleep () เนื่องจากไม่ปฏิบัติตามกฎตามที่ตั้งใจไว้จริงๆ)

ต้องใช้ระบบปฏิบัติการ unix-ish สำหรับ STDIN ที่ไม่บล็อก น่าแปลกที่การใช้ switch / case กับ cascading ถ้า / else สร้างซอร์สโค้ดที่สั้นกว่า แต่เวอร์ชั่นบีบอัดที่ตามมามีความยาวมากกว่า

<?eval(gzinflate(base64_decode('bY5BT8MwDIXv/Ao0WWujtVJ7YmtITwiNAwhp3KutOE20pImWVGxa999J1IEAcbH87O892wlUqsEjtmnivD/d5rLd9qZPCHX+gFvdOPTNTpl2L/su3bw9PL1kBaEwMHAMLCsocFaGKhjo0BT0Q0iFaUnO4JmXGlPyPZI8TWHPeIe+nbIIGccJqsGTXbi4p4EKEEt4Qs6xH+rlfA6c5DnwEYacregFlcMvziUk/FLQnzN79drosiOIxV/X7kroeklAh9BxsQD7m/H/MXxi4iKoob5bxRuCTtpFHd8Jn8ab0S7iLOz0pO5LgkfpQ0wrzGyNW+VFBSJ7Nj2eKtDZozHvFfBsPfQdHioYso1CtBW47NV4aXpXgb2Z0csn')));

Ungolfed:

<?
shell_exec('stty -icanon');
stream_set_blocking(STDIN, 0);
$u = $s = $p =0;
$f = 10;
$h = $m = 100;
while(1) {
    $t=time();
    while(1)
        if (($k = fgetc(STDIN)) || time() > $t)
            break;
    if ($k == 'f'){
        if ($u > 8 && $f) --$f | $u -= 9;
    } elseif ($k == 's')
        $s = 0;
    elseif ($k == 'p') {
        if ($p) --$p | $h += 9;
    } elseif ($k == 'b') {
        if ($m > 8) $m -= 9 | ++$p;
    } elseif ($k == 't') {
        if ($m > 8) $m -= 9 | ++$f;
    } else {
        if (++$u > 79) --$h;
        if (++$s > 79) $s = 0 | $u += 9;
        if ($h > 79) ++$m;
        if ($h < 1) exit;
    }
    echo"Health:$h,Money:$m,Food:$f,Hunger:$u,Sleep:$s,Potions:$p\n";
}

สิ่งนี้ไม่ "ตอบสนองทันทีเมื่อกดปุ่มต่อไปนี้โดยผู้ใช้" มันจะรอจนกว่าการโทรจะsleep(1)ส่งคืนก่อนทำการประมวลผลอินพุต แม้ว่ามันจะประมวลผลคำสั่งที่ถูกจัดคิวก่อนที่จะทำการอัพเดตครั้งต่อไปดังนั้นมันอาจจะใช้ได้
เรย์

ใช่สังเกต ถ้อยคำมีความคลุมเครือขนาดใหญ่ดังนั้นฉันจึงใช้เสรีภาพในการตีความเพราะวิธีนี้สั้นกว่า :) ถ้าฉันมีเวลาวันนี้ฉันจะเขียนโค้ดทางเลือกพร้อมลูปหมดเวลาและนำเสนอทั้งคู่เพื่อพิจารณา
อเล็กซ์ Howansky

2

Mathematica, 374 ไบต์

h=m=100;f=10;g=s=p=0;RunScheduledTask[g++;s++;If[g>79,h--];If[s>79,s=0;g+=9];If[h>79,m++];If[h<1,Quit[]]];Dynamic@Row[{EventHandler[InputField[],"KeyDown":>Switch[CurrentValue@"EventKey","f",If[g>8&&f>0,f--;g-=9],"s",s=0,"p",If[p>0,p--;h+=9],"b",If[m>8,m-=9;p++],"t",If[m>8,m-=9;f++]]],"
Health: ",h,"
Money: ",m,"
Food: ",f,"
Hunger: ",g,"
Sleep: ",s,"
Potions: ",p}]

การขึ้นบรรทัดใหม่นั้นสำคัญเพราะเป็นอักขระขึ้นบรรทัดใหม่ในสตริงดังนั้นฉันจึงสามารถใช้RowแทนColumnได้ หากคุณประเมินสิ่งนี้ในสมุดบันทึก Mathematica คุณควรเห็นดังนี้:

Tamagotchi จำลอง

คุณต้องคลิกในฟิลด์อินพุตและพิมพ์อักขระของคุณอย่างรวดเร็ว (น้อยกว่าหนึ่งวินาที) ก่อนที่จะDynamicทำให้ฟิลด์อินพุตอัปเดต อาการปวดหัวนี้สามารถหลีกเลี่ยงได้โดยสิ้นเชิงหากEventHandlerอยู่ในเซลล์ของตัวเองแทนที่จะเป็นองค์ประกอบRowแต่จะต้องบันทึกโปรแกรมเป็นไฟล์. nb ซึ่งจะเพิ่มจำนวนไบต์อย่างมาก


เยี่ยมมาก! ฉันจะใช้โครงสร้างเช่นCurrentValue[EvaluationNotebook[], NotebookEventActions] = {"KeyDown" :> Switch[CurrentValue@"EventKey", "f", If[g > 8 && f > 0, f--; g -= 9], "s", s = 0, "p", If[p > 0, p--; h += 9], "b", If[m > 8, m -= 9; p++], "t", If[m > 8, m -= 9; f++]]};นี้จะช่วยให้คุณหลีกเลี่ยงความต้องการคลิกในช่องใส่ เพิ่มตัวเลือก, PassEventsDown -> Trueที่ส่วนท้ายของรหัสที่จะช่วยให้คุณยังคงแก้ไขโน๊ตบุ๊ค แต่สามารถถอดออกที่ปลายมากสำหรับเงินฝากออมทรัพย์ไบต์ :)
เกร็กมาร์ติน

ขอบคุณนั่นคือฟังก์ชั่นที่ฉันกำลังมองหาในตอนแรก! น่าเสียดายที่ดูเหมือนว่ามันจะนานกว่าที่ฉันมีอยู่ในปัจจุบัน
ngenisis

2

C # 6, 567 563 ไบต์

using System;using System.Threading;class T{int L,M,F=10,H,S,P;static void Main(){T t=new T();}T(){M=L=100;var W=new Thread(new ThreadStart(Q));W.Start();while(1>0){var r=Console.Read();bool B=0>1,K=1>0;if(r=='f'&H>8&F>0){F--;H-=9;B=K;}if(r=='s'){S=0;B=K;}if(r=='p'&P>0){P--;L+=9;B=K;}if(r=='b'&M>8){M-=9;P++;B=K;}if(r=='t'&M>8){M-=9;F++;B=K;}if(B)p();}}void Q(){while(1>0){H++;S++;if(H>79)L--;if(S>79){S=0;H+=9;}if(L>79)M++;L*=L/L;p();Thread.Sleep(500);}}void p(){Console.Write($"\nhealth: {L}\nhunger: {H}\nsleep: {S}\nfood: {F}\nmoney: {M}\npotions: {P}\n");}}

Ungolfed:

using System;
using System.Threading;
class T
{
    int L,M,F=10,H,S,P;
    static void Main()
    {
        T t=new T();
    }
    T()
    {
        M=L=100;
        var W=new Thread(new ThreadStart(Q));
        W.Start();
        while(1>0)
        {
            var r=Console.Read();
            var B=0>1;
            if(r=='f'&H>8&F>0){F--;H-=9;B=1>0;}
            if(r=='s'){S=0;B=1>0;}
            if(r=='p'&P>0){P--;L+=9;B=1>0;}
            if(r=='b'&M>8){M-=9;P++;B=1>0;}
            if(r=='t'&M>8){M-=9;F++;B=1>0;}
            if(B)p();
        }
    }
    void Q()
    {
        while(1>0)
        {
            H++;S++;
            if(H>79)L--;
            if(S>79){S=0;H+=9;}
            if(L>79)M++;
            L*=L/L;
            p();
            Thread.Sleep(500);
        }
    }
    void p()
    {
        Console.Write($"\nhealth: {L}\nhunger: {H}\nsleep: {S}\nfood: {F}\nmoney: {M}\npotions: {P}\n");
    }
}

1

Clojure, 1224 702 ไบต์

V2

ทำให้อะตอมทั้งหมดหลวมตัวแปรแทนที่จะอยู่ภายในวัตถุสถานะ เพียงอย่างเดียวนั้นก็กำจัดรหัสจำนวนมาก ฉันยังสร้างฟังก์ชั่นทางลัดa!และs!เพื่อเพิ่มและลบออกจากที่atomsง่ายขึ้น (โดยทั่วไปทำหน้าที่เป็น+=และ-=เนื่องจาก Clojure ไม่มีตัวดำเนินการเหล่านั้น)

ฉันรู้ว่าฉันอาจจะทำไปด้วยatoms loopถ้าฉันจัดการเพื่อบูรณาการการป้อนข้อมูลที่สำคัญเป็น ฉันจะต้องดู

(ns bits.golf.pet.v2.petms)(def h(atom 100))(def j(atom 0))(def s(atom 0))(def f(atom 10))(def p(atom 0))(def m(atom 100))(defn a[sa n](swap! sa #(+ % n)))(defn v[sa n](swap! sa #(- % n)))(defn c[](a j 1)(a s 1)(if(>=@j 80)(v h 1))(if (>=@s 80)(do(reset! s 0)(a j 9)))(if(>= @h 80)(a m 1)))(defn l[k](case k\f(if(> @j 8)(do(v f 1)(v j 9)))\s(reset! s 0) \p(if(>@p 0)(do(v p 1)(a h 9)))\b(if(> @m 8)(do(v m 9)(a p 1)))\t(if(>@m 8)(do(v m 9)(a f 1)))nil))(defn b[](.start(Thread.^Runnable(fn[](while(>@h 0)(l(first (read-line))))))))(defn -main[](b)(while(>@h 0)(Thread/sleep 500)(c)(println(str"Health: "@h"\nHunger: " @j"\nSleep: "@s"\nFood: "@f"\nPotions: "@p"\nMoney:"@m"\n")))(println"You died!\n"))

Ungolfed:

(ns bits.golf.pet.v2.pet)

; 100 0 0 10 0 100
(def he (atom 100))
(def hu (atom 0))
(def sl (atom 0))
(def fo (atom 10))
(def po (atom 0))
(def mo (atom 100))

(defn a! [sa n]
  (swap! sa #(+ % n)))

(defn s! [sa n]
  (swap! sa #(- % n)))

(defn apply-rules []
    (a! hu 1)
    (a! sl 1)
    (if (>= @hu 80)
      (s! he 1))
    (if (>= @sl 80)
      (do
        (reset! sl 0)
        (a! hu 9)))
    (if (>= @he 80)
      (a! mo 1)))

(defn handle-keypress [k]
    (case k
      \f (if (> @hu 8)
           (do
             (s! fo 1)
             (s! hu 9)))
      \s (reset! sl 0)
      \p (if (> @po 0)
           (do
             (s! po 1)
             (a! he 9)))
      \b (if (> @mo 8)
           (do
             (s! mo 9)
             (a! po 1)))
      \t (if (> @mo 8)
           (do
             (s! mo  9)
             (a! fo 1)))
      nil))


(defn start-listener []
  (.start
    (Thread. ^Runnable
      (fn []
        (while (> @he 0)
            (handle-keypress (first (read-line))))))))

(defn -main []
  (start-listener)
  (while (> @he 0)
    (Thread/sleep 500)

    (apply-rules)

    (println (str
               "Health: " @he "\n"
               "Hunger: " @hu "\n"
               "Sleep: " @sl "\n"
               "Food: " @fo "\n"
               "Potions: " @po "\n"
               "Money:" @mo "\n")))

  (println "You died!\n"))

V1

Ohdeargod ห้องพักแน่นอนสำหรับการปรับปรุงที่นี่ ปัญหาแบบนี้ทำได้ง่ายที่สุดเมื่อใช้กับผลข้างเคียงและ Clojure นั้นใช้งานได้ดังนั้นฉันจึงพยายามละเมิดatom s ในเพื่อลดจำนวนรหัสที่ต้องการ น่าเสียดายที่ฉันไม่ได้ทำตามแผนดังนั้นตอนนี้มันเป็นแบบจับจดอยู่แล้ว ฉันได้รับความคิดบางอย่างแล้วเพื่อหดฉันแม้ว่า

มันเป็นโปรแกรมเต็มรูปแบบ -mainก็สามารถที่จะดำเนินการโดยการทำงาน

(ns bits.golf.pet)(defrecord S[he hu sl fo po mo])(def new-state(->S 100 0 0 10 0 100))(def state(atom new-state))(defn update![sa k f](swap! sa #(update % k f)))(defn apply-rules[s](let [s' (atom s)u! #(update! s' %1 %2)g #(get @s' %)](u! :hu inc)(u! :sl inc)(if(>=(g :hu)80)(u! :he dec))(if(>= (g :sl)80)(do(u! :sl (fn[_]0))(u! :hu #(+ % 9))))(if(>=(g :he)80)(u! :mo inc))@s'))(defn get-input [](let [raw (read-line)](first raw)))(defn handle-keypress[s k](let [s'(atom s)u! #(update! s' %1 %2)g #(get @s' %)](case k\f(if (> (g :hu)8)(do(u! :fo dec)(u! :hu #(- % 9))))\s(u! :sl (fn [_] 0))\p(if(> (g :po)0)(do(u! :po dec)(u! :he #(+ % 9))))\b(if(>(g :mo))(do(u! :mo #(- % 9))(u! :po inc)))\t(if(>(g :mo)8)(do(u! :mo #(- % 9))(u! :fo inc)))nil@s')))(defn start-listener[](.start(Thread.^Runnable(fn[](while true(let[k(get-input)](swap! state #(handle-keypress % k))))))))(defn -main[](start-listener)(let[g #(get @%1 %2)](while true(Thread/sleep 500)(swap! state #(apply-rules %))(println(str"Health: "(g state :he)"\nHunger: "(g state :hu)"\n""Sleep: " (g state :sl)"\nFood: "(g state :fo)"\nPotions: "(g state :po)"\n""Money:"(g state :mo)"\n"))(if(<=(g state :he)0)(do(println"You died!\n")(reset! state new-state))))))

Ungolfed:

(ns bits.golf.pet)

(defrecord State [he hu sl fo po mo])

(def new-state (->State 100 0 0 10 0 100))

(def state (atom new-state))

(defn update! [sa k f]
  (swap! sa #(update % k f)))

(defn apply-rules [s]
  (let [s' (atom s)
        u! #(update! s' %1 %2)
        g #(get @s' %)]
    (u! :hu inc)
    (u! :sl inc)
    (if (>= (g :hu) 80)
      (u! :he dec))
    (if (>= (g :sl) 80)
      (do
        (u! :sl (fn [_] 0))
        (u! :hu #(+ % 9))))
    (if (>= (g :he) 80)
      (u! :mo inc))
    @s'))

(defn get-input []
  (let [raw (read-line)]
    (first raw)))

(defn handle-keypress [s k]
  (let [s' (atom s)
        u! #(update! s' %1 %2)
        g #(get @s' %)]
    (case k
      \f (if (> (g :hu) 8)
           (do
             (u! :fo dec)
             (u! :hu #(- % 9))))
      \s (u! :sl (fn [_] 0))
      \p (if (> (g :po) 0)
           (do
             (u! :po dec)
             (u! :he #(+ % 9))))
      \b (if (> (g :mo))
           (do
             (u! :mo #(- % 9))
             (u! :po inc)))
      \t (if (> (g :mo) 8)
           (do
             (u! :mo #(- % 9))
             (u! :fo inc)))
      nil
      @s')))

(defn start-listener []
  (.start
    (Thread. ^Runnable
      (fn []
        (while true
          (let [k (get-input)]
            (swap! state #(handle-keypress % k))))))))

(defn -main []
  (start-listener)
  (let [g #(get @%1 %2)]
    (while true
      (Thread/sleep 500)

      (swap! state #(apply-rules %))

      (println (str
                 "Health: " (g state :he) "\n"
                 "Hunger: " (g state :hu) "\n"
                 "Sleep: " (g state :sl) "\n"
                 "Food: " (g state :fo) "\n"
                 "Potions: " (g state :po) "\n"
                 "Money:" (g state :mo) "\n"))

      (if (<= (g state :he) 0)
        (do
          (println "You died!\n\n\n\n\n")
          (reset! state new-state))))))

นั่นเป็นรหัสที่ดี
ender_scythe

@ender_scythe Ya ฉันพยายามปฏิบัติตามวิธีการเข้ารหัสที่เหมาะสมครึ่งหนึ่งในบางแห่งเช่นการทำapplying-rulesและhandle-keypressบริสุทธิ์ ฉันกำลังเขียนเวอร์ชัน "สกรูมัน" ในขณะนี้
Carcigenicate
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.