# 模拟爆炸的最紧凑代码

13

2
“代码行数”是一个引起很多歧义的度量，当然不是[code-golf]，它是“字符数”或有时是“字节数”。关于meta的相关讨论。
dmckee ---前主持人小猫，

4

dmckee ---前主持人小猫，

1

Nate Koppenhaver

13

## Python，245个字符

``````import random,time
R=lambda:random.randrange(-999,999)/1e3
P=[(40+20j,R()+1j*R())for i in' '*20]
for i in' '*20:
C=([' ']*80+['\n'])*40
for p,v in P:C[int(p.real)+81*int(p.imag)]='*'
print''.join(C);P=[(p+v,v*.95)for p,v in P];time.sleep(.1)
``````

10

## C＃，WPF – 1523

• 重力，使颗粒均匀地向所有侧面膨胀；
• 初始向量的正态分布，导致粒子在稀疏的“盒子”中扩展；
• 亮度变化，使颗粒变黑。

``````<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" StartupUri="W.xaml"/>
``````

``````<Window x:Class="W" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DataTemplate>
<Ellipse Width="2" Height="2" Fill="#000" Opacity="{Binding O}">
<Ellipse.RenderTransform>
<TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
</Ellipse.RenderTransform>
</Ellipse>
</DataTemplate>
<ControlTemplate>
<ItemsPresenter/>
</ControlTemplate>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</Window>
``````

xaml.cs

``````using M = System.Math;
using T = System.Timers.Timer;
using System;
using System.ComponentModel;

partial class W
{
int a;
T t = new T(99);

public W()
{
InitializeComponent();
Height = Width = 500;
var r = new Random();
Func<double> n = () => 2 * (M.Sqrt(-2 * M.Log(r.NextDouble())) * M.Sin(6 * r.NextDouble()));
var l = new System.Collections.Generic.List<P>();
for (; a++ < 300; )
l.Add(new P { X = 250, Y = 250, f = n(), g = n() });
i.ItemsSource = l;
t.Elapsed += delegate
{
foreach (P x in l)
{
x.X += x.f;
x.Y += x.g += .2;
x.O = M.Max(1 - M.Sqrt(M.Pow(250 - x.X, 2) + M.Pow(250 - x.Y, 2)) / 250, 0);
}
};
t.Start();
}
}

class P : System.Windows.ContentElement, INotifyPropertyChanged
{
public double y, f, g;
public double X { get; set; }
public double O { get; set; }
public double Y
{
get { return y; }
set
{
y = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(""));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
``````

1
+1好看的例子！就像过去的那些经典爆炸式旅鼠一样。而且我认为这胜过最初的Question中的Processing代码。

7

# 后记-287244个字符

``````currentpagedevice/q{exch def}def/PageSize get/z{dup 3 1 roll add exch 4 2 roll}def{2
div}forall/y/r{rand 2 27 exp div 8 sub}def q/x q[99{[x r y r]}repeat]50{dup{aload/t q
3 index 2 index 4 4 rectfill 1 sub z z t astore pop}forall showpage}repeat
``````

`gs -dNOPAUSE asplode.ps`

5

# Javascript-268个字符

``````javascript:d=document;c=d.createElement('canvas');d.body.appendChild(c);g=c.getContext("2d");function e(x,y,m){g.arc(x,y,m,0,2*Math.PI,false);g.fill()}function s(a,b,v,t){c.width=c.width;e(50+t*v,50,b);e(50+t*b*v/(b-a),50,a-b);setTimeout(function(){s(a,b,v,t+1)},100)};s(9,5,1,0)
``````

1

marinus

1
@marinus Chrome中正在发生的事情应该是正在发生的事情。
david4dev 2011年

st0le 2011年

david4dev 2011年

@ st0le IE8不支持画布标记，除非你执行一些肮脏的把戏：stackoverflow.com/questions/1332501/...

4

## APL（120 118）

``````⍎⊃,⌿(9⍴⊂'(⎕DL.1)⊢{{(A+2↑⍵),0.95×A←2↓⍵}¨⍵⊣⎕←'' ⍟''[1+(⍳15 30)∊2↑¨⌊⍵]}'),⊂',⌿⍉10 4⍴⍎''⍬'',420⍴'',(7 15,.01×99-?2⍴199)'''
``````

2

### JavaScript的502 500 496

``````W=500;H=250;function r(){return 2*m.sqrt(-2*m.log(m.random()))*m.sin(6*m.random())}function n(){z=[];for(i=W;i;i--){s={};s.x=s.y=H;s.f=r();s.g=r();z.push(s)}}function w(){x.clearRect(0,0,W,W);z.forEach(function(a){a.x+=a.f;a.y+=a.g+=.2;x.fillStyle="rgba(0,0,0,"+m.max(1-m.sqrt(m.pow(H-a.x,2)+m.pow(H-a.y,2))/H,0)+")";x.fillRect(a.x,a.y,2,2)})}z=[];m=Math;d=document;c=d.createElement("canvas");c.width=c.height=W;d.body.appendChild(c);x=c.getContext("2d");n();setInterval(n,2e3);setInterval(w,10)
``````

JSFiddle预览：http : //jsfiddle.net/GVqFr/60/（您可以按TidyUp按钮以很好地格式化代码）

@Qqwy感谢您的编辑！

@GigaWatt你是对的；该工作了`250`为好。

1

### 重击380

``````C="4443311177"
t=".-xxXMXxx-."
alias c='echo -e "\e[2J"'
g(){
echo -e "\e[1;\$4\e[\$2;\$1H\$3"
}
f(){
x=\$1
y=\$2
p=\$((2-RANDOM%5))
q=\$((2-RANDOM%5))
for i in {-5..5}
do
x=\$((x+p))
y=\$((y+q))
n=\$((5+i))
c=\$((5+i))
g \$x \$y \${t:n:1} 3\${C:c:1}m
w=\$(printf "%04i\n" \$((5*i*i)))
sleep \${w/0/0.}
g \$x \$y " " 3\${C:c:1}m
done
}
e(){
c
for i in {1..10}
do
f \$((COLUMNS/2)) \$((LINES/2)) &
done
}
``````

### 更新：彩色

t =文字，c = cls，g =果胶，f =果蝇，C =颜色

1

## 带SDL的C，423个字符

``````#include<math.h>
#include"SDL.h"
SDL_Surface*s;SDL_Event e;SDL_Rect p;int i,n;double q[256];main(){
SDL_Init(SDL_INIT_VIDEO);s=SDL_SetVideoMode(320,320,32,0);
for(srand(time(0));e.type-SDL_QUIT;n=-~n%64){
for(i=256*!n;i;q[--i]=rand()%65536*9.5874e-5);
for(SDL_FillRect(s,0,i=0);++i<256;SDL_FillRect(s,&p,-n*67372036))
p.x=160+cos(q[i])*q[i-1]*n,p.y=160+sin(q[i])*q[i-1]*n,p.w=p.h=1;
SDL_Flip(s);SDL_Delay(50);SDL_PollEvent(&e);}}
``````

（由于代码已经非常庞大，因此我留下了一些额外的位，以便可以在没有警告的情况下进行编译。有时会错过没有警告的编译。删除它们会节省大约30个字符。）

1

# Javascript，282个字符

138个字符的粒子功能和150个基本的画布绘图样板）

``````p=function(a,t,x,y,n,g,s,i,d){with(Math)for(i=n;i--;d=cos(i*sin(i*s)),a.globalAlpha=n/t/i,a.fillRect(x+t*sin(i)*d, y+t*cos(i)*d+t*g,2,2));};d=document;a=d.body.appendChild(d.createElement('canvas')).getContext('2d');t=setInterval("a.clearRect(0,0,300,150);p(a,t++, 50,50,1e3,.2,1)")
``````

Live JSFiddle示例在这里

# 特征

• 可配置的X，Y爆炸中心。
• 可配置的粒子数
• 垂直方向的重力：让您的粒子掉落或飞起来！
• 可播种的每种种子都有自己的爆炸，每次在计算机上都会准确显示该爆炸。
• 由于创建效果的程序方式，慢动作，快进和向后播放爆炸都是可能的。
• 大小：138字节

0

# 带有PyGame的Python，240个字符

``````import math
import random
import pygame
pygame.init()

screen = pygame.display.set_mode((800, 800))
particles = [(random.gauss(0,.5), random.uniform(0,6.28318)) for i in range(2000)]

for i in range(399):
screen.fill((255,255,255))
for speed, angle in particles:
distance = i * speed
x = 400 + distance * math.cos(angle)
y = 400 + distance * math.sin(angle)
screen.set_at((int(x), int(y)), (0,0,0))
pygame.display.flip()
``````

``````import math as m,random,pygame
d,x,g=pygame.display,range(999),random.gauss
s,e=d.set_mode(),[(g(0,.2),g(0,9))for i in x]
for i in x:
d.flip(),s.fill([255]*3)
for v,a in e:
y=400+i*v*m.cos(a),400+i*v*m.sin(a)
s.set_at(map(int,y),[0]*3)
``````

0

# Python-327个字符

• 使用复数作为2D向量
• `(v * cos(a), v * sin(a))` 实施为 `v*e**(1j*a)`
• 看起来像是3D爆炸。
• 重力。

``````import pygame as P,random as R,math
R=R.random
D=P.display
D.init()
W=800
S=D.set_mode((W,W))
T=P.time.Clock()
C=lambda v:map(int,(v.real,v.imag))
X=[(8+R())*math.cos(R()*1.57)*2.7**(1j*R()*6.28) for i in range(999)]
for t in range(250):
D.flip();T.tick(30);S.fill(2**24-1)
for v in X:S.set_at(C(v*t+.005j*t*t+W/2*(1+1j)),0)
``````

0

# 糖水112

``````c.width^=0
t?o.push({X:1e3,Y:500,U:S(99*t),V:C(9*t)}):o=[]
o.map(a=>{a.X+=a.U,a.Y+=a.V,x.fillRect(a.X,a.Y,9,9)})
``````

fəˈnɛtɪk