Pông trong mã ngắn nhất


28

Thử thách rất đơn giản. Cung cấp mã ngắn nhất có thể để tái tạo trò chơi 2 người cổ điển của pong http://en.wikipedia.org/wiki/Pong . Mức độ đồ họa và chức năng phải càng gần với trình diễn javascript này http://codeincomplete.com/posts/2011/5/14/javascript_pong/demo.html (nhưng không có tùy chọn bổ sung, bạn có thể nhấp vào bên trái hoặc khung, khung hình / giây, vv thông tin ở phía dưới bên phải).

Như mọi khi mã phải được viết bằng ngôn ngữ tự do (theo cả hai nghĩa) và phải được chạy trên linux. Bất kỳ thư viện nào được sử dụng cũng phải miễn phí, dễ dàng có sẵn và không được viết cho mục đích của cuộc thi này (và cũng chưa có phiên bản hoạt động của Pông!).


Thành thật mà nói, câu hỏi này hơi khó đối với môn đánh gôn. Vật lý bóng cho Pông khá phức tạp.
beary605

@ beary605, tôi không nghĩ rằng vật lý bóng quá phức tạp. Giải pháp của tôi là "càng gần càng tốt" với trình diễn javascript và vật lý này khá đơn giản.
gian hàng

Chỉ để tham khảo, có một số [code-golf] khác chạy khá lâu. Xây dựng một công cụ cho một trò chơi mê cung , Noughts và Crosses (còn gọi là Tic-Tac-Toe) (cả hai có thể sử dụng các mục nhập bổ sung, những người thích "chiến thắng" theo mặc định?), Viết một máy chủ HTTP nhỏ , Phiên dịch tự phiên dịch , Tự phiên dịch , Tự giải thích biên dịch trình biên dịch , biên dịch biên dịch ...
dmckee

@felipa, bạn có thể chính thức hóa 'càng gần càng tốt' không? Tôi không biết tại sao giải pháp sed của tôi không dẫn đầu.
gian hàng

1
@ beary605 quá khó?
FantaC

Câu trả lời:


24

Javascript, 883 (+ 70 HTML)

c=document.getElementById('c').getContext('2d')
c.fillStyle="#FFF"
c.font="60px monospace"
w=s=1
p=q=a=b=0
m=n=190
x=300;y=235
u=-5;v=3
setInterval(function(){if(w&&!s)return;s=0
c.clearRect(0,0,640,480)
for(i=5;i<480;i+=20)c.fillRect(318,i,4,10)
m+=p;n+=q
m=m<0?0:m;m=m>380?380:m
n=n<0?0:n;n=n>380?380:n
x+=u;y+=v
if(y<=0){y=0;v=-v}
if(y>=470){y=470;v=-v}
if(x<=40&&x>=20&&y<m+110&&y>m-10){u=-u+0.2;v+=(y-m-45)/20}
if(x<=610&&x>=590&&y<n+110&&y>n-10){u=-u-0.2;v+=(y-n-45)/20}
if(x<-10){b++;x=360;y=235;u=5;w=1}
if(x>640){a++;x=280;y=235;u=-5;w=1}
c.fillText(a+" "+b,266,60)
c.fillRect(20,m,20,100)
c.fillRect(600,n,20,100)
c.fillRect(x,y,10,10)},30)
document.onkeydown=function(e){k=(e||window.event).keyCode;w=w?0:k=='27'?1:0;p=k=='65'?5:k=='81'?-5:p;q=k=='40'?5:k=='38'?-5:q;}
document.onkeyup=function(e){k=(e||window.event).keyCode;p=k=='65'||k=='81'?0:p;q=k=='38'||k=='40'?0:q}


/* Variable index:
a -> left player score
b -> right player score
c -> context
e -> event
i -> counter for dashed line
k -> keycode
m -> left paddle y
n -> right paddle y
p -> left paddle y velocity
q -> right paddle y velocity
s -> is start of game
u -> ball x velocity
v -> ball y velocity
w -> game is waiting (paused)
x -> ball x
y -> ball y
*/

Kịch bản có thể được đặt ở cuối <body>hoặc được gọi onLoad. Nó cần phần tử canvas sau:

<canvas id="c"width="640"height="480"style="background:#000"></canvas>

Player 1 sử dụng qacác phím, và máy nghe nhạc 2 sử dụng các plcác phím. Nhấn escphím để tạm dừng và bất kỳ phím nào để bắt đầu / tiếp tục.

Bạn có thể chơi nó trong trình duyệt của bạn ở đây .

Tôi không chắc chắn về vật lý sẽ sử dụng, vì vậy tôi bắt đầu với một phương pháp phản xạ đơn giản và sau đó thêm một số loại và thử nghiệm với nó một chút. Vận tốc của quả bóng theo hướng y bị ảnh hưởng bởi nơi trên mái chèo bạn đánh bóng, do đó bạn có một số quyền kiểm soát nơi bóng đi. Vận tốc của quả bóng theo hướng x tăng chậm với mỗi lần đánh trong đường đua.

Tôi nghi ngờ rằng nó sẽ bị đánh bại khá dễ dàng bởi các giải pháp sử dụng các thư viện, nhưng tôi rất vui khi làm nó trong javascript đơn giản.


2
Đó là một thực hiện tốt đẹp.
felipa

1
Có thể chơi golf nhiều hơn một chút, tôi biết tôi đến muộn hai năm ở đây. nhưng bạn có thể gán 20cho một biến có tên gvà lưu một byte sởi.
Zacharý

Chết tiệt, thật khó để chơi trên một bàn phím azerty ...
mờ

38

sed, 35

Tăng thanh một chút với một thiền định tem tem bưu chính.

s/> / >/
s/ </< /
s/0</0>/
s/>1/<1/

Thiền được thưởng thức trên stdin / stdout trên hai máy tính, không nhất thiết phải được kết nối bởi một mạng. Thiền bắt đầu trong trạng thái

0         <       1

với guru zero ở bên trái và một bên phải. Khung góc di chuyển sang trái và phải, và nếu một bậc thầy điều khiển số của họ để liên lạc với con trỏ khi đến bên cạnh họ, điểm số của họ sẽ tăng lên một, và họ trở nên phấn khởi.

Thiền được bắt đầu bằng cách gõ trạng thái trên vào sed -f medi.sedvà máy tính phản hồi với trạng thái tiếp theo. Các đạo sư nghiêm túc gõ vào thiền định, đọc to phím tiếp theo họ sẽ nhấn, với cả hai pháp sư nhấn phím thánh cho entertương lai cùng một lúc. Máy tính đàng hoàng trả lời với trạng thái tiếp theo. Điều này, đến lượt nó, được đọc to trong khi gõ đồng loạt như cuối cùng. Tiếp tục tiến vào tương lai cho đến khi đạt được hạnh phúc vô hạn.

Gurus mong muốn một thử thách có thể chơi chế độ 'turbo', trong đó các bậc thầy cố gắng dự đoán hợp tác trạng thái tiếp theo của máy tính và gõ nó vào dấu nhắc thay vì trạng thái hiện tại. Gurus sẽ có sự khôn ngoan để xác minh thỏa thuận giữa các dự đoán của họ trước khi bước vào tương lai.


23
Anh bạn ... tôi vừa đọc cái gì?
MrZander

9
@MrZander Chỉ qua suy ngẫm sâu rộng, trí tuệ của thiền có thể được tiết lộ. Sự suy ngẫm này được hỗ trợ tốt nhất thông qua việc thực hiện chương trình.
gian hàng

15

Python (với pygame ) 650 byte

Tính năng, đặc điểm

  • Chế độ 1 và 2 người chơi - Khi trò chơi bắt đầu, hãy bấm 1cho 1 người chơi hoặc 2cho 2 người chơi. Trò chơi sẽ không bắt đầu cho đến khi một trong những phím này được nhấn.
  • Tăng tốc độ bóng - Mỗi cú vô lê, tốc độ bóng được tăng lên để sau 10 quả bóng chuyền, nó đã tăng khoảng 50%, sau 20 sẽ nhanh hơn 50%, v.v.
  • Độ lệch của bóng thay đổi - Độ lệch của bóng dựa trên hai yếu tố: phần nào của mái chèo mà nó tấn công, và liệu mái chèo có di chuyển khi va chạm hay không. Nếu quả bóng đập vào mái chèo gần một trong hai đầu, nó sẽ bị lệch mạnh hơn so với khi nó đánh gần giữa (gần như là một bề mặt cong). Ngoài ra, nếu mái chèo đang chuyển động, chuyển động của mái chèo được thêm vào độ võng. Để có được độ võng mạnh nhất, quả bóng phải tấn công ở gần cuối của mái chèo, và mái chèo phải chuyển động về cùng một đầu. Điều này rất giống với Pông ban đầu cho Atari 2600.
  • Tạm dừng - Trò chơi có thể bị tạm dừng bất cứ lúc nào bằng cách nhấn vào Spacethanh. Chơi sẽ tiếp tục khi nhấn phím cách lần thứ hai.
  • Controls - Như với ví dụ này, người chơi 1 di chuyển với QAcác phím, và máy nghe nhạc 2 di chuyển với PL.

Như một lưu ý cuối cùng, tôi muốn yêu cầu giải pháp này không được chọn làm câu trả lời được chấp nhận, vì nhiều lý do.

from pygame import*
init();d=display;s=d.set_mode((640,480))
g=p=16;j=q=80;x=y=200;o=t=h=v=1;z=m=n=0;w=[255]*3
while s.fill(time.wait(3)):
 event.get();k=key.get_pressed();t^=o*k[32];o=1-k[32];z=z or-k[49]-k[50]*2;e=k[113]-k[97];f=[k[112]-k[108],(h>0)*cmp(y,q-32)][z];a=p<g;b=q-[y,x][a]
 if p%608<g:m,n,p,h,v=[m+1-a,m,n+a,n,g+a*592,p,1-a*2,h/-.96,1,b/32.+~[f,e][a]][-g<b<j::2]
 for r in[(0,x,g,j),(624,y,g,j),(p,q,g,g)]+[(316,i*31,8,15)for i in range(g)]:draw.rect(s,w,r)
 if z*t:v*=(0<q<464)*2-1;x-=(0<x-e<400)*e/.6;y-=(0<y-f<400)*f/.6;p+=h;q+=v
 c=font.SysFont('monospace',j,1).render('%3d %%-3d'%m%n,1,w);s.blit(c,(320-c.get_width()/2,0));d.flip()

Chụp màn hình mẫu:

Lưu ý: phông chữ được sử dụng cho điểm có thể khác nhau tùy theo hệ thống.


Điểm số cho thấy ở nửa bên trái đối với tôi và tôi nghĩ rằng độ lệch quá mạnh, nhưng dù sao thì nó cũng khá tuyệt :)
aditsu

@aditsu bạn đang hoạt động dưới linux? Tôi sẽ xem liệu tôi có thể tìm một giải pháp thay thế hoạt động bất kể mặt phông chữ được chọn không. Ý tưởng đằng sau độ võng là có thể làm lệch hướng bóng ở tốc độ nhanh hơn (tối đa 2,5 trên thang đo của tôi) so với mái chèo có thể di chuyển ( 1.67 ). Điều này chỉ có thể nếu bạn cung cấp cho nó một số 'spin'. Nếu mái chèo không di chuyển khi bóng đập, tối đa là vận tốc sẽ là 1,5 .
Primo

Có, tôi đang sử dụng Linux. Tôi thấy lạ là quả bóng thực sự có thể "quay lại" (lên hoặc xuống) sau khi đánh vào mái chèo, thay vì tiếp tục theo cùng một hướng (có lẽ ở một góc khác). Nhưng có lẽ phiên bản Atari đã làm điều đó, tôi không biết.
aditsu

@aditsu Nó có giá vài byte, nhưng tôi tin rằng điểm số nên được tập trung bất kể phông chữ được chọn (miễn là nó là đơn cách). Hãy cho tôi biết nếu nó làm việc cho bạn. Và vâng, độ lệch rất giống (mặc dù bản phân phối mượt mà hơn) với phiên bản Atari mà tôi đã quen thuộc. Nếu bạn tưởng tượng mái chèo là một bề mặt cong (lồi) (giống như một mái chèo khúc côn cầu trên không), tôi nghĩ nó nên trực quan hơn.
Primo

Vâng, bây giờ nó tập trung
aditsu

8

HTML & JavaScript (mất 2) - 525

Vì OP dường như không quan tâm nhiều đến phần "càng gần càng tốt", đây là một giải pháp thay thế mà tôi đơn giản hóa, lột đồ và đánh golf không thương tiếc. Q / A và P / L để chơi, nhưng mọi phím khác cũng có tác dụng. Một lần nữa, mã này hoàn toàn khép kín và tôi đã thử nghiệm nó trong Chromium 25 trên Linux. Tôi có thể chơi gôn hơn nữa nếu bạn có thể chấp nhận các lỗi nhỏ hoặc suy giảm chất lượng đồ họa / lối chơi lớn hơn.

<canvas id=c><script>C=c.getContext('2d');f=C.fillRect.bind(C)
S=[-1,I=J=0];A=B=210;X=Y=1
function g(n){++S[n];N=Math.random(M=n*613+9)*471}D=document
D.onkeydown=D.onkeyup=function(e){d=!!e.type[5];k=e.keyCode
k&1?I=k&16?d:-d:J=k&4?-d:d}
g(0);setInterval(function(){A-=A<I|A>420+I?0:I
B-=B<J|B>420+J?0:J
M+=X;N+=Y
N<0|N>471?Y=-Y:0
M==622&N>B&N<B+51|M==9&N>A&N<A+51?X=-X:M>630?g(0):M||g(1)
f(0,0,c.width=640,c.height=480)
C.fillStyle='tan';C.font='4em x';C.fillText(S,280,60)
f(0,A,9,60);f(631,B,9,60);f(M,N,9,9)},6)</script>

Cảm ơn Shmiddty


Tôi không hiểu sự phản đối. Theo như tôi có thể nhớ, phiên bản 715 byte (được chỉnh sửa 3 giờ trước bài đăng này) gần giống với phiên bản gốc của Pông tôi đã có cho Atari 2600 của tôi
primo

@primo Tôi cho rằng bạn đang nói về yêu cầu ngụ ý của tôi rằng giải pháp của bạn không đáp ứng tiêu chí "càng gần càng tốt". Chà, OP không đề cập đến phiên bản Atari 2600, mà là một triển khai javascript cụ thể mà anh ta liên kết đến. Và ngay từ cái nhìn đầu tiên, có 2 điểm khác biệt rõ ràng trong mã của bạn: không có trình phát máy tính và không hiển thị điểm "7 đoạn". Có lẽ có nhiều sự khác biệt hơn trong "cơ học". Nếu những điều này không quan trọng, thì tôi nghĩ giải pháp này cũng hợp lệ.
aditsu

Đây là lỗi của tôi. Tôi thực sự có nghĩa là "càng gần càng tốt" vì vậy giải pháp đầu tiên của bạn là tốt nhất cho đến nay.
felipa

bạn có thể loại bỏ c=window.c. Bạn đang gán một biến toàn cục cho chính nó.
Shmiddty

Bạn có thể lưu thêm 1 nhân vật bằng cách di chuyển ++S[n]vào bên trong.random(++S[n])
Shmiddty

5

HTML & JavaScript - 1663

Chống lại sự phán xét tốt hơn của tôi, tôi đã sử dụng cách tiếp cận điên rồ của việc đánh golf mã thực tế từ bản demo. Tôi đã loại bỏ một số tính năng và thành phần giao diện, nhưng nhìn chung nó hoạt động giống hệt nhau - 0, 1 hoặc 2 để chọn số lượng người chơi, Q / A và P / L để di chuyển.

Trừ khi tôi mắc một số lỗi, trò chơi phải giống hệt nhau, pixel cho pixel và mili giây trong mili giây, với bản gốc ở 640 * 480 (gợi ý: thay đổi kích thước cửa sổ trình duyệt sẽ thay đổi kích thước trò chơi trong bản demo). Nó chỉ không đưa ra hướng dẫn, không thông báo người chiến thắng và không xử lý esc.

Mã này hoàn toàn khép kín và tôi đã thử nghiệm nó trong Chromium 25 trên Linux. Firefox không thích nó lắm.

<body bgcolor=0><canvas id=c height=480><script>R=Math.random
C=c.getContext('2d');f=C.fillRect.bind(C)
S=[l=G=I=J=K=L=0,0];r=17;u=463;o=24;q=12;z=10;s=640;v=36
function T(z,t,u,v){P=0;if(e=v*E-u*F){a=(u*t-v*z)/e;b=(E*t-F*z)/e
a<0|a>1|b<0|b>1?0:P={x:M+a*E,y:N+a*F,d:u,s:0,X:X,Y:Y}}}function
i(p,q,h){T(p-22*(E<0),q,0,h)
P?0:T(p,q-h*(F<0),22,0)}function
U(p){if(p.a)if(M<p.x&X<0|M>p.x+q&X>0)p.u=0
else{P=p.P;if(P&&P.X*X>0&P.Y*Y>0&P.s<p.l/z)P.s+=t
else{E=X*z;F=Y*z;i(M-p.x+5,s*q,s*o)
if(p.P=P){y=P.y;while(y<r|y>u)y=y<r?34-y:y>u?u+u-y:y
P.y=y+R(e=(p.l+2)*(X<0?M-p.x-q:p.x-M)/64)*2*e-e}}P?p.u=P.y<p.y+25?1:P.y>p.y+35?-1:0:0}y=p.y-p.u*t*198
p.y=y<q?q:y>408?408:y}function
W(n,x){a=9.6;b=[~8,3,62,31,75,93,~2,7,-1,u][n]
b&4&&f(x,o,v,a);b&64&&f(x,o,a,o)
b&2&&f(x+v,o,-a,o);b&8&&f(x,43.2,v,a)
b&32&&f(x,48,a,o);b&1&&f(x+v,48,-a,o)
b&16&&f(x,72,v,-a)}A={u:0,x:0,y:210};B={u:0,x:628,y:210}
function g(n){if(++S[n]>8)G=A.a=B.a=0
else{N=R(M=n?635:5)*446+r;Y=157.5;X=n?-Y:Y
A.l=z+S[0]-S[1];B.l=20-A.l}}D=document
D.onkeydown=D.onkeyup=function(e){d=!!e.type[5]
k=e.keyCode-45;if(k>2&k<6&d&!G){G=S=[-1,0];A.a=k<4;B.a=k<5
g(0)}k^31?k^35?k^20?k^v?0:I=d:J=d:K=d:L=d
A.a?0:A.u=I-J;B.a?0:B.u=K-L}
setInterval(function(){t=new Date()/1000-l;l+=t;U(A);U(B)
if(G){E=t*X+4*t*t;F=t*Y+4*t*t
x=M+E;y=N+F;m=X+t*(X>0?8:-8);n=Y+t*(Y>0?8:-8)
if(n>0&y>u){y=u;n=-n}if(n<0&y<r){y=r;n=-n}p=m<0?A:B
i(M-p.x+5,N-p.y+5,70)
if(P){if(P.d){y=P.y;n=-n}else{x=P.x;m=-m}n*=n*p.u<0?.5:p.u?1.5:1}M=x;N=y
X=m;Y=n;M>645?g(0):M<-5&&g(1)}c.width=s;C.fillStyle='#fff'
f(0,0,s,q);f(0,468,s,q);for(j=o;j--;)f(314,6+o*j,q,q)
W(S[0],266.5);W(S[1],338.5)
f(0,A.y,q,60);f(s,B.y,-q,60);G&&f(M-5,N-5,z,z)},50/3)</script>

Một số tín dụng cho Shmiddty để cải thiện


4

Đang xử lý, 487 ký tự

int a=320,b=240,c=2,d=2,e=0,f=0,g=0,h=0,i=15,j=80,k=640,
l=160,m;void setup(){size(k,b*2);}void draw(){background
(0);if(keyPressed){if(key=='q'&&g>0)g-=i;if(key=='a'&&g<
j*5)g+=i;if(key=='o'&&h>0)h-=i;if(key=='l'&&h<j*5)h+=i;}
rect(0,g,i,j);for(m=0;m<k;m+=30)rect(312,m,i,i);rect(a,b
,i,i);rect(625,h,i,j);a+=c;b+=d;c*=a<i&&(b>g&&b+i<g+j)||
a>610&&(b>h&&b+i<h+j)?-1:1;d*=b<0||b>=465?-1:1;if(a<0){f
++;a=0;b=240;c=2;}if(a>k){e++;a=625;b=240;c=-2;}textSize
(j);text(e,l,j);text(f,3*l,j);}

Ảnh chụp màn hình mẫu:

nhập mô tả hình ảnh ở đây

Mã này được thực hiện với sự ngắn gọn trong tâm trí, vì vậy nó khá lỗi (bóng đôi khi đi qua mái chèo, hoặc quấn quanh nó). Điều khiển là Q / A cho Người chơi 1 và O / L cho Người chơi 2.


1
Là một trò chơi, phiên bản Pong của bạn cũng có vẻ không công bằng, vì chỉ có một phím của người chơi được đăng ký trên mỗi khung: P
Jonathan Frech

2

C # - 1283 ký tự

Điều này có thể được chơi golf nhiều hơn một chút nhưng đây là.

using System;using System.Drawing;using System.Runtime.InteropServices;using System.Windows.Forms;using r=System.Drawing.RectangleF;namespace f{public partial class f:Form{public f(){InitializeComponent();}private void f_Load(object sender,EventArgs e){var t=this;var s=new r(0,0,300,300);var q=new r(0,0,15,50);var o=new r(0,0,15,50);var x=new PointF(150,150);var v=.06F;var h=v;var b=new r(x.X,x.Y,15,15);var p1=0;var p2=0;var p=new PictureBox{Size=t.Size,Location=new Point(0,0)};t.Controls.Add(p);p.Paint+=(wh,n)=>{var g=n.Graphics;Action<Brush,r>f=g.FillRectangle;var k=new SolidBrush(Color.Black);var w=new SolidBrush(Color.White);var d=new byte[256];GetKeyboardState(d);var l=q.Location;var _1=.1F;q.Location=new PointF(0,d[90]>1?l.Y+_1:d[81]>1?l.Y-_1:l.Y);l=o.Location;o.Location=new PointF(269,d[77]>1?l.Y+_1:d[79]>1?l.Y-_1:l.Y);f(k,s);f(w,q);f(w,o);Func<r,bool>i=b.IntersectsWith;h=i(q)||i(o)?-h:h;v=b.Top<1||b.Bottom>t.Height-30?-v:v;b.Offset(h,v);if(b.Left<0){p2++;b.Location=x;}if(b.Right>290){p1++;b.Location=x;}f(w,b);for(int j=0;j<19;)f(w,new r(140,(j+(j++%2))*15,10,10));var a=new Font("Arial",20);g.DrawString(p1.ToString(),a,w,100,12);g.DrawString(p2.ToString(),a,w,170,12);p.Invalidate();};}[DllImport("user32.dll")]static extern bool GetKeyboardState(byte[]s);}}

Chỉnh sửa: Không thấy yêu cầu về ngôn ngữ miễn phí, có thể chạy được trên linux ...


2

Tcl / Tk , 932 byte

Phải được chạy trong vỏ tương tác

gri [can .c -w 1024 -he 768 -bg #000]
proc A {} {set ::v [expr (int(rand()*36)+1)*20]}
proc R {C t\ X} {.c cr r $C -f #aaa -t $t}
proc I {} {incr ::v 20}
time {R "504 [I] 520 [I]"} 18
R "0 0 1024 20"
R "0 748 1024 768"
R "0 340 20 440" b
R "1004 340 1024 440" B
R "40 [A] 60 [I]" P
lmap n 4\ 5 T F\ S {.c cr t ${n}62 60 -ta $T -te 0 -fi #aaa -font {"" 56}}
proc C t\ n {lindex [.c coo $t] $n}
lmap {a b c d e} {q b 1 >20 -20 a b 3 <740 20 p B 1 >20 -20 l B 3 <740 20} {bind . $a "if \[C $b $c]$d {.c move $b 0 $e}"}
lassign {0 0 20 20} F S y x
proc M {} {lmap {_ a b c d e f} {0 <40 b 20 S 960 980 2 >984 B -20 F 80 100} {if [C P $_]$a {if [C P 1]>=[C $b 1]&&[C P 3]<=[C $b 3] {bell
set ::x $c} {.c itemco $d -te [incr ::$d]
if \$::$d>8 {tk_messageBox -message WINNER!
lmap T F\ S {.c itemco $T -te [set ::$T 0]}}
.c coo P $e [A] $f [I]}}}
.c move P $::x [set ::y [expr [C P 1]<40?20:[C P 3]>727?-20:$::y]]
after 99 M}
M
focus -f .

Chú thích:

 #There is an Enter at the end

Chỉ là một phiên bản rất nhỏ của Pông, trong đó quả bóng chỉ chạy theo các góc chéo và luôn có cùng vận tốc.

nhập mô tả hình ảnh ở đây


Không outgolf: bit.ly/2VSIGz8
sergiol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.