แสดงการระเบิดของดาวใน ASCII-art


12

เป้าหมายคือการทำให้ดาวระเบิดในศิลปะ ASCII เริ่มต้นจากตัวละครดาวเดียว*ไปจนถึงซุปเปอร์โนวาและในที่สุดก็ถึงช่องว่าง

กฎ:

  • คุณต้องแสดงเพียง 80 ตัวอักษรต่อบรรทัดใน 24 บรรทัด (นี่เป็นขนาดเทอร์มินัลเริ่มต้นบน Linux)
  • เหล่านี้เท่านั้น95 ตัวอักษรพิมพ์จาก ASCIIได้รับอนุญาต
  • ขั้นตอน:
    1. ดาวเริ่มต้นจะต้อง*อยู่กึ่งกลางในแนวนอนและแนวตั้ง
    2. ดาวต้องเติบโตขึ้นเพื่อแสดงว่ามันระเบิด
    3. ในตอนท้ายหน้าจอจะต้องว่างเปล่า (ดาวหายไป)
  • ความยาวของรหัสหรือภาษาไม่เกี่ยวข้อง
  • คะแนนโหวตจะตัดสินผลงานที่สร้างสรรค์และสวยงามที่สุด คุณเคยเห็นดาวระเบิดหรือไม่? เรามาดูกันว่าคุณจินตนาการถึงสิ่งนี้อย่างไร

ฉันได้เพิ่มคำตอบโดยใช้ Python เป็นตัวอย่าง แต่คุณได้รับการสนับสนุนให้สร้างสิ่งที่แตกต่างหรือดีกว่า

คุณมีเวลาหนึ่งสัปดาห์ในการเข้าร่วมผู้ชนะจะถูกเลือกใน 2014-04-01

ตัวอย่างผลลัพธ์ (บางเฟรมเท่านั้น):

# start





                                        *





# during explosion

                                    ****#****
                                 ***#@##*#@#****
                               *@**@@@*##**#*#**#*
                              **@@*#**#@*#@****#***
                              ****@*@***#****@**@@*
                             *******@***@@***#****#*
                              *#***#*##@****##@@@**
                              **#@###****@*********
                               *****@**@*@*****@**
                                 ************@**
                                    ****#****


# star is expanding

                                        *                                       
                               ********* **@******
                           ****   **#**@ #**#*#   ****
                         ***  **  **##** *@@*@*  **  ***
                       **  *  @@   *@*#* ***@*   *#  *  **
                     *** #  *  *#  *@#** ***@*  **  @  * *@*
                    ** *  * ** *@  ****@ @****  ** #* *  * **
                   ** * @* * ** *@  #### *#**  ** ** * @* * **
                  *# * # ** * #* *  **** ****  @ ** * ** * * #*
                 ** * *# * @ * #  @  @*@ *#*  *  @ # # * @* * **
                 *# * * * * # * @* * **# *#* * ** * * * * * # **
                 ** # * * @ * * # * # ** @* * * * * * # @ @ * **
                *# * * * * * * * * # * * * * * * @ @ * * * * * **
                 *# * @ * @ * @ * * * ** *@ * * # * * * * * @ @*
                 *# # @ * * # * *@ * *** @#@ @ ** * @ @ * * # **
                 *# * ** * * * @  @  **@ ***  *  @ * * * @* * #*
                  ** * * ** * #@ *  #*** **##  * #* * #@ * * @*
                   *# * *@ * @@ *#  **** @***  ** ** * #* * #*
                    *# *  * *@ **  @**@* *@#**  ** ** *  * @*
                     *#* @  *  @@  **##* ****@  **  #  * @**
                       **  @  #*   @*@#* @*@*#   @#  *  **
                         *#*  @*  @#*@*# **#*@#  **  ***
                           ****   *##**# #***@*   @***
                               ****@**@* *****@***

# star is disappearing

               *  -  -  --  --   ------- -------   --  --  -  -  *
             ** -  -  -  --  --   ------ ------   --  --  -  -  - **
            * -- - -- -- --  --   ------ ------   --  -- -- -- - -- *
          ** - -  - -- -- --  --  ------ ------  --  -- -- -- -  - - **
         *  - - -- - -- -  -  --   ----- -----   --  -  - -- - -- - -  *
        ** - - - -- - -- -  -  --  ----- -----  --  -  - -- - -- - - - **
        * - - - -  - - -  - -- --  ----- -----  -- -- -  - - -  - - - - *
       * - - - -  - - - -- - -- --  ---- ----  -- -- - -- - - -  - - - - *
      * -- - - - - - - - -- - -- -  ---- ----  - -- - -- - - - - - - - -- *
      * - - - - - - - -- - - - -  -  --- ---  -  - - - - -- - - - - - - - *
      * - - - - - - - - - - - - -- - --- --- - -- - - - - - - - - - - - - *
      * - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - - - - - *
     * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
      * - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - - - - - *
      * - - - - - - - - - - - - -- - --- --- - -- - - - - - - - - - - - - *
      * - - - - - - - -- - - - -  -  --- ---  -  - - - - -- - - - - - - - *
      * -- - - - - - - - -- - -- -  ---- ----  - -- - -- - - - - - - - -- *
       * - - - -  - - - -- - -- --  ---- ----  -- -- - -- - - -  - - - - *
        * - - - -  - - -  - -- --  ----- -----  -- -- -  - - -  - - - - *
        ** - - - -- - -- -  -  --  ----- -----  --  -  - -- - -- - - - **
         *  - - -- - -- -  -  --   ----- -----   --  -  - -- - -- - -  *
          ** - -  - -- -- --  --  ------ ------  --  -- -- -- -  - - **
            * -- - -- -- --  --   ------ ------   --  -- -- -- - -- *
             ** -  -  -  --  --   ------ ------   --  --  -  -  - **

# the star is gone
















(there is nothing)

ตัวอย่างภาพเคลื่อนไหวของเอาต์พุต:

ดาวระเบิด

หากคุณต้องการแรงบันดาลใจคุณสามารถดูการระเบิดจาก Captain Bloodเกมจากปี 1988


1
ไม่มีข้อมูลจำเพาะที่นี่จริงๆเพื่อตรวจสอบว่าคำตอบนั้น " ถูกต้อง " หรือไม่
Peter Taylor

ฉันลบคำที่ถูกต้องออกจากคำถาม คำตอบที่ได้รับความนิยมมากที่สุดจะถูกประกาศให้เป็นผู้ชนะ
อัล

1
ไม่ว่าคำนั้นจะอยู่ในคำถามหรือไม่ก็ตามคำถามทุกข้อควรมีข้อมูลจำเพาะที่ชัดเจนซึ่งสามารถวัดคำตอบได้
Peter Taylor

1
"แสดงบางสิ่งที่ดูเหมือนตัวอย่างผลลัพธ์ แต่รู้สึกอิสระที่จะสร้างสรรค์และศิลปะ" เพียงพอหรือไม่ ฉันสามารถเพิ่มกฎเพิ่มเติม (เวลาจำนวนเฟรมขนาด ฯลฯ ) แต่ฉันค่อนข้างแน่ใจว่ามันจะทำให้น่าสนใจน้อยลง
อัล

โปรดอธิบายหากกฎไม่ชัดเจนเพียงพอและฉันจะปรับปรุงได้อย่างไร
อัล

คำตอบ:


27

C + curses

การระเบิดของ ASCII

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

อนุภาคสุ่มซ้อนทับอยู่เหนือสิ่งนี้โดยมีตำแหน่งที่กำหนดตามการคำนวณมุมมองพื้นฐานเพื่อให้ความรู้สึก 3D เล็กน้อย (นั่นเป็นความคิดอยู่ดี)

#include <curses.h>
#include <stdlib.h>
#include <math.h>

#define NUM_FRAMES 150
#define NUM_BLOBS 800
#define PERSPECTIVE 50.0

typedef struct {
  double x,y,z;
} spaceblob;

double prng() {
  static long long s=1;
  s = s * 1488248101 + 981577151;
  return ((s % 65536) - 32768) / 32768.0;
}

int main() {
  char *frames[NUM_FRAMES], *p;
  int i,j,x,y,z,v,rows,cols,ith,i0;
  int maxx,minx,maxy,miny,delay=1E6;
  double bx,by,bz,br,r,th,t;
  spaceblob *blobs;

  /* Initialize ncurses and get window dimensions */
  initscr();
  getmaxyx(stdscr,rows,cols);
  minx = -cols / 2;
  maxx = cols+minx-1;
  miny = -rows / 2;
  maxy = rows+miny-1;

  /* Generate random blob coordinates */
  blobs = malloc(NUM_BLOBS * sizeof(spaceblob));
  for (i=0; i<NUM_BLOBS; i++) {
    bx = prng();
    by = prng();
    bz = prng();
    br = sqrt(bx*bx + by*by + bz*bz);
    blobs[i].x = (bx / br) * (1.3 + 0.2 * prng());
    blobs[i].y = (0.5 * by / br) * (1.3 + 0.2 * prng());;
    blobs[i].z = (bz / br) * (1.3 + 0.2 * prng());;
  }

  /* Generate animation frames */
  for (i=0; i<NUM_FRAMES; i++) {
    t = (1. * i) / NUM_FRAMES;
    p = frames[i] = malloc(cols * rows + 1);
    for (y=miny; y<=maxy; y++) {
      for (x=minx; x<=maxx; x++) {

        /* Show a single '*' in first frame */
        if (i==0) {
          *p++ = (x==0 && y==0) ? '*' : ' ';
          continue;
        }

        /* Show expanding star in next 7 frames */
        if (i<8) {
          r = sqrt(x*x + 4*y*y);
          *p++ = (r < i*2) ? '@' : ' ';
          continue;
        }

        /* Otherwise show blast wave */
        r = sqrt(x*x + 4*y*y) * (0.5 + (prng()/3.0)*cos(16.*atan2(y*2.+0.01,x+0.01))*.3);
        ith = 32 + th * 32. * M_1_PI;
        v = i - r - 7;
        if (v<0) *p++ = (i<19)?"%@W#H=+~-:."[i-8]:' '; /* initial flash */
        else if (v<20) *p++ = " .:!HIOMW#%$&@08O=+-"[v];
        else *p++=' ';
      }
    }

    /* Add blobs with perspective effect */
    if (i>6) {
      i0 = i-6;
      for (j=0; j<NUM_BLOBS; j++) {
        bx = blobs[j].x * i0;
        by = blobs[j].y * i0;
        bz = blobs[j].z * i0;
        if (bz<5-PERSPECTIVE || bz>PERSPECTIVE) continue;
        x = cols / 2 + bx * PERSPECTIVE / (bz+PERSPECTIVE);
        y = rows / 2 + by * PERSPECTIVE / (bz+PERSPECTIVE);
        if (x>=0 && x<cols && y>=0 && y<rows)
          frames[i][x+y*cols] = (bz>40) ? '.' : (bz>-20) ? 'o' : '@';
      }
    }

    /* Terminate the text string for this frame */
    *p = '\0';
  }

  /* Now play back the frames in sequence */
  curs_set(0); /* hide text cursor (supposedly) */
  for (i=0; i<NUM_FRAMES; i++) {
    erase();
    mvaddstr(0,0,frames[i]);
    refresh();
    usleep(delay);
    delay=33333; /* Change to 30fps after first frame */
  }
  curs_set(1); /* unhide cursor */
  endwin(); /* Exit ncurses */
  return 0;
}

1
เยี่ยมมาก! คุณช่วยอธิบายวิธีจับภาพเทอร์มินัลได้ไหม ฉันคิดว่าคุณควรลดส่วนเมื่อคุณพิมพ์หากคุณยังไม่ได้เพิ่มเพื่อหยอกล้อผู้ชม
อัล

1
@ n.1 ถูกต้อง - มันถูกลากไปสักหน่อย ฉันใช้IShowUเพื่อจับภาพหน้าจอและส่งออกเฟรมจาก QuickTime ไปยัง ImageMagick เพื่อสร้าง GIF แบบเคลื่อนไหวจากนั้นใช้ Gifsicle เพื่อปรับแต่งแอนิเมชัน GIF มันเป็นเรื่องเล็กน้อย แจ้งให้เราทราบหากคุณพบวิธีที่ดีกว่า
r3mainer

7

จาวาสคริ

คิดว่ามันคุ้มค่ากับการถ่ายทำใน JS แนะนำการบันทึกและเรียกใช้ ช้ามากถ้าคุณวางในคอนโซล

var boomboom = (function() {
    //Clear any existing page
    document.getElementsByTagName("body")[0].innerHTML="";

    var space=document.createElement("div");
    var iterator=0;
    var stars = 50;
    var timer=100;

    //Set container
    space.setAttribute("id","space");
    space.setAttribute("style","width:1000px;height:600px;margin:auto;border:solid 1px #000;position:relative;overflow:hidden;background:#000;color:#fff");
    document.getElementsByTagName("body")[0].appendChild(space);

    //Set interval and draw...
    var interval = setInterval(function(){ drawStars(iterator,stars); }, timer);
    drawStars(iterator, stars);

    function drawStars(r,c) {
        clearInterval(interval);

        //a container for this set of stars
        var starContainer=document.createElement("div");

        //don't draw more if there are too many, it's got to go
        if(iterator < 1000) {
            for(var i = 0; i < c; i++) {
                var x,y;

                if(iterator < 100) {
                    x=500 + r * Math.cos(2 * Math.PI * i / c) * 0.7;
                    y=300 + r * Math.sin(2 * Math.PI * i / c) * 0.7;
                }

                //add some randomness for the boom boom
                if(iterator > 100) { 
                    x=500 + r * Math.cos(2 * Math.PI * i / c) * 0.7*Math.random();
                    y=300 + r * Math.sin(2 * Math.PI * i / c) * 0.7*Math.random();
                }

                //Make a star
                var star=document.createElement("div");
                star.setAttribute("class","star");

                //Exploding stars are red, I hope
                var color = iterator < 100 ? "color:#fff" : "color:rgb("+parseInt(255*Math.random())+",0,0)";
                star.setAttribute("style","position:absolute; left:"+ x +"px;top:"+ y +"px;"+color);

                //Change the star character as boom boom gets bigger
                if(iterator <= 200) {
                    star.innerText="*";
                }
                else if(iterator >=200 & iterator <= 400) {
                    star.innerText="O";
                }
                else  {
                    star.innerText="-";
                }
                //Add the star to its container
                starContainer.appendChild(star);
            }
        }
        //draw the container
        space.appendChild(starContainer);

        //increment the iterator.  It's an iterator because we're using intervals and it's late.
        iterator+=5;

        //remove stars when we get too many
        if(iterator > 200) {
            space.removeChild(space.firstChild);
        }
        if(iterator < 1500) { //do it all again
            timer = timer > 10 ? timer-10 : timer;
            interval=setInterval(function(){ drawStars(iterator,stars); }, timer);
        }

        //make sure it's actually empty
        else {
            space.innerHTML="";
        }
    }
}());

การแก้ไข ใน JSBin: http://jsbin.com/worofeqi/5/watch?js,output

ทำงานผิดปกติได้อย่างราบรื่นมากขึ้นเมื่อทำจากระบบไฟล์โลคัลมากกว่าใน JSBin สุจริตไม่แน่ใจว่าทำไม; อาจดูว่าเย็นนี้


คุณช่วยวางมันลงบน jsfiddle, jsbin หรือเว็บไซต์อื่นที่เราสามารถเห็นได้อย่างง่ายดายหรือไม่? เมื่อเพิ่มคำถามที่ฉันคิดเกี่ยวกับการแสดงผลลัพธ์ในเทอร์มินัล แต่ฉันจะไม่อัปเดตกฎตอนนี้ที่คุณเพิ่มคำตอบแล้วฉันควรเพิ่มกฎนี้ก่อน
อัล

ตอบปรับปรุง (หมายเหตุข้อสังเกตที่แปลกมาก)
Dave Forber

1

หลาม

#!/usr/bin/python

import sys, math, time, random

def distance(x, y):
    # ((y - y_center) * 2) -> correct ratio for a true circle
    return math.ceil(math.sqrt(((x - 40) ** 2) + (((y - 12) * 2) ** 2)))

def star(radiuses):
    for r in radiuses:
        #~ clear screen: http://stackoverflow.com/a/2084521/2257664
        print chr(27) + "[2J"

        # width
        for y in range(24):
            # height
            for x in range(80):
                d = distance(x, y)

                #~ border
                if (d == r):
                    sys.stdout.write('*')
                #~ inside the star
                elif (d < r):
                    if (r > 35):
                        sys.stdout.write(' ')
                    elif (r > 25) and ((d % 2) != 0):
                        sys.stdout.write('-')
                    elif (r > 15) and ((d % 2) == 0):
                        sys.stdout.write(' ')
                    else :
                        sys.stdout.write(random.choice('****#@'))
                #~ space outside the star
                else:
                    sys.stdout.write(' ')
            print
        time.sleep(0.1)

star(range(0, 12) + range(10, 0, -1) + range(0, 50))

ตัวอย่างเอาต์พุต (ใช้ขั้นตอนน้อยลงและไม่ต้องล้างหน้าจอ)

ข้อความที่ตัดตอนมาของการส่งออกจะปรากฏขึ้นในคำถาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.