Coding Challenge 165: Slide Puzzle

แชร์
ฝัง
  • เผยแพร่เมื่อ 27 ก.ย. 2024

ความคิดเห็น • 232

  • @JosephHorton95
    @JosephHorton95 2 ปีที่แล้ว +313

    Love how the whiteboard effect retains the not-quite-square squares!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +25

      Yes, I agree!

    • @viru380
      @viru380 2 ปีที่แล้ว +1

      th-cam.com/channels/zsoRWLVEoqbZHcizHxbTUA.html

  • @mazza420
    @mazza420 2 ปีที่แล้ว +131

    omg a coding challenge with a timer, what a throwback!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +20

      Yes, I'm trying to work in a new system for doing so!

    • @viru380
      @viru380 2 ปีที่แล้ว

      th-cam.com/channels/zsoRWLVEoqbZHcizHxbTUA.html

  • @lizardperson780
    @lizardperson780 2 ปีที่แล้ว +68

    So happy to see Coding Challenges back, and that new digitalized whiteboard explanation is very cool!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +13

      So glad to hear you liked it!

    • @viru380
      @viru380 2 ปีที่แล้ว

      th-cam.com/channels/zsoRWLVEoqbZHcizHxbTUA.html

  • @Bashx1
    @Bashx1 2 ปีที่แล้ว +8

    What I love about your videos is that you are not just copying the code from another screen like most tho. You are doing trial and error and that is really good for us to understand it better. Makes us think with you. Thank you so much! Great content

  • @gower1973
    @gower1973 2 ปีที่แล้ว +17

    A second video for this would be to right a solver that solves the puzzle after it’s been shuffled, maybe you could use the machine learning stuff for it.

  • @WilsonFerguson
    @WilsonFerguson 2 ปีที่แล้ว +7

    Love the whiteboard effects. Makes it so much easier to see!

  • @hesterclapp9717
    @hesterclapp9717 2 ปีที่แล้ว +233

    You know he's a programmer when he uses a function before defining it

  • @artistpw
    @artistpw 2 ปีที่แล้ว +1

    I love how you time yourself and show everything including the little bumps. People should really feel better about having the bumps, because people remember their failures better than their successes. Failing shouldn't be a stigma, but should be celebrated as a teaching aid.

  • @kadehowes8551
    @kadehowes8551 2 ปีที่แล้ว +8

    Literally have watched this channel for over a year now beginning with almost no programming experience and I have a Web Developer Intern job interview tomorrow!! Thanks @The Coding Train !

  • @refeals
    @refeals 2 ปีที่แล้ว +3

    sliding puzzle is my go-to project when i'm learning a new game dev lib or engine. its simple enough that you dont need to worry about physics and all that, but complex enough that there's a lot to worry when rendering, randomizing, moving pieces, etc. loved to see it here, i love the energy of this channel!

  • @ujjalkar3243
    @ujjalkar3243 2 ปีที่แล้ว +2

    You're my 1st programming teacher.
    Happy to be here after a long time.

  • @jonascaluwe6140
    @jonascaluwe6140 2 ปีที่แล้ว +9

    Absolutely love the editing on this one. Amazing video, keep it going!

  • @matthewrice7590
    @matthewrice7590 2 ปีที่แล้ว +1

    This is awesome, Dan. I realize this isn’t the most efficient or scalable way to solve this, but I work at a large enterprise as a Senior Software Engineer and your problem solving skills are leagues better than literally 90% of the people I work with.

  • @DenisovichDev
    @DenisovichDev 2 ปีที่แล้ว +3

    Hello Dan, I absolutely love this new type of video production. This seems like a new era for coding challenges! Although I do miss those days of "I'm sorry I'm just looking at the chat to see if I botched up something", but this is absolutely amazing. The white board, the timer and all the little helpful animations. Great job to the coding train team!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +2

      I hope to keep that vibe going with some live streams!

    • @DenisovichDev
      @DenisovichDev 2 ปีที่แล้ว

      @@TheCodingTrain enjoying your twitch streams!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +1

      @@DenisovichDev Glad to hear, do you have a platform preference for streaming?

    • @DenisovichDev
      @DenisovichDev 2 ปีที่แล้ว

      @@TheCodingTrain I would say no, however things seem a bit tighter in Twitch probably because it's solely based on livestreaming, that I guess makes it easier to do more casual streams on (like genuary, say). TH-cam could be the place for more formal ones like special ones like PCD fundraiser, team seas and others. However, I think whatever you do, your community will always support it so it sort of doesn't matter that much. Have a great day!

  • @zylascope
    @zylascope 2 ปีที่แล้ว +5

    You're a great programmer and a great teacher. Thank you.

  • @koordszz
    @koordszz 2 ปีที่แล้ว

    This man fucking loves solving complicated problems and you can clearly see it in his actions. That's so alpha in programming. I hope to give back to him for the things he''d taught me when I land my first programming job.

  • @mlutteral
    @mlutteral 8 หลายเดือนก่อน

    I made a version of this game in the 80s while studying computer science. I wrote it in Pascal on an old 80286 PC running DOS :)

  • @cassandradawn780
    @cassandradawn780 2 ปีที่แล้ว +1

    this channel is gold

  • @RobertBraf
    @RobertBraf 2 ปีที่แล้ว +2

    Great to see you're back with a challenge, looking forward to a new episode of your NoC series.❤

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +3

      I'm a little ways away from getting back to that but I really hope to!

  • @emapage8914
    @emapage8914 2 ปีที่แล้ว

    I find the editing here to be very tasteful and helpful and not distracting at all! Great job! And the content itself is top notch as always!

  • @BdR76
    @BdR76 2 ปีที่แล้ว +5

    14:40 actually the simpleShuffle() is better, you just need an extra function to check whether or not the tile layout is solvable. Shuffling it by "manually" by moving tiles is much less efficient. You can see the algorithm get stuck on the edges and corners at 20:03 because it tries many invalid moves and essentially doing nothing.
    To check if it's solvable you basically go from the top-left to the bottom-right and count how many combinations of a large index tile comes before a smaller index tile. If this number of times is odd then it's not solvable and you just need to swap any two tiles to turn it into a solvable layout. You can search stackoverflow for "difficult to solve sliding puzzle" for a more in-depth answer.

    • @agent-33
      @agent-33 2 ปีที่แล้ว +2

      Isn't checking the shuffled tiles if it's solvable takes more time?
      Swapping the empty cell to a random valid neighbor in N steps guarantees it is solvable.
      Shuffling and checking if it's solvable is not efficient.

  • @samthomas3255
    @samthomas3255 2 ปีที่แล้ว +1

    The quality of these videos has grown so much!!! Great content!

  • @characterhousetheatrecompa9290
    @characterhousetheatrecompa9290 2 ปีที่แล้ว +1

    The whiteboard and time stamps are a game changer!

  • @Quidoute
    @Quidoute 2 ปีที่แล้ว +1

    FINALLY MAN YOUR BACK :D I WAS WAITING FOR ANOTHER CODING CHALLENGE FOR A WHILE

  • @diamond7516
    @diamond7516 ปีที่แล้ว

    Everytime I watch your videos I go and try them myself. Your enthusiasm inspires me c:

  • @CoreDump07
    @CoreDump07 2 ปีที่แล้ว +1

    that whiteboard magic, awesome to watch. You could make a tutorial on how to edit something like this ♥

  • @simonpfletcher
    @simonpfletcher 2 ปีที่แล้ว +6

    Like the new whiteboard edits...

  • @AleksanderFimreite
    @AleksanderFimreite 2 ปีที่แล้ว +1

    Nice, I have been missing these.

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว

      Glad to be able to bring them back, I am hoping to do one per week but I'll settle for at least one more in February!

  • @ptrdblmeter
    @ptrdblmeter 2 ปีที่แล้ว +2

    Finally somebody else who uses JS classes! Pretty much everybody else uses a lineout function as a constructor and a .prototype function to add methods. But I really prefer classes because i like C++. So thank you for encouraging this practise!

    • @tylisirn
      @tylisirn 2 ปีที่แล้ว +1

      Sadly until quite recently all browsers didn't support classes (*cough*IE and Edge*cough*). But now that Edge has become a Chromium reskin classes are thankfully universally supported in all still officially supported browsers.

  • @vikramb183
    @vikramb183 2 ปีที่แล้ว +1

    Man I leave for a bit and now you’ve got this whole animated whiteboard (looks great by the way!)

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว

      Thank! It was fun to do but probably not realistic for every video!

  • @MrEdwardCollins
    @MrEdwardCollins ปีที่แล้ว

    If I remember correctly, with the 4x4 puzzle, from the starting arrangement if you swap any two tiles an EVEN number of times, the puzzle is solvable. However, if you swap any two tiles an ODD number of times, the puzzle is not solvable.
    Sam Loyd, the famous puzzle author and recreational mathematician, figured this out back in the late 1800s / early 1900s. As the story goes, he offered $1,000 (a lot of money back then) if anyone could solve his 14-15 puzzle, as it was called. However, with his arrangement, the 14 tile and the 15 tile were the only two tiles that were swapped.. One swap... an odd number. Thus, his money was safe... as there was no valid solution.

  • @ashley_engle
    @ashley_engle ปีที่แล้ว

    23:35 😄 All of those white tiles. Good fun! 💕

  • @portalsrule1239
    @portalsrule1239 2 ปีที่แล้ว

    oh hey, my friend challenged me to make this concept a few months ago. having an animation for moving pieces makes it look so much better. very nice video

  • @kathymcguiness3461
    @kathymcguiness3461 2 ปีที่แล้ว +13

    I am excited to try my own image with this code!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +3

      Yay, can't wait to see! Please share in Discord and on thecodingtrain.com/CodingChallenges/165-slide-puzzle.html

  • @szymoniak75
    @szymoniak75 7 หลายเดือนก่อน

    you're so happy you made my depressed evening less depressed

  • @commandblockgal7396
    @commandblockgal7396 2 ปีที่แล้ว +1

    I love this channel man, quality content

  • @rodakdev
    @rodakdev 2 ปีที่แล้ว +2

    I like the new timer design!

  • @fredflintstoner596
    @fredflintstoner596 2 ปีที่แล้ว

    Mrs Richards: "I paid for a room with a view !"
    Basil: (pointing to the lovely view) "That is Torquay, Madam ."
    Mrs Richards: "It's not good enough!"
    Basil: "May I ask what you were expecting to see out of a Torquay hotel bedroom window? Sydney Opera House, perhaps? the Hanging Gardens of Babylon? Herds of wildebeest sweeping majestically past?..."
    Mrs Richards: "Don't be silly! I expect to be able to see the sea!"
    Basil: "You can see the sea, it's over there between the land and the sky."
    Mrs Richards: "I'm not satisfied. But I shall stay. But I expect a reduction."
    Basil: "Why?! Because Krakatoa's not erupting at the moment ?"

  • @threezee6751
    @threezee6751 ปีที่แล้ว

    Gilfoyle from another timeline
    love your vids

  • @Thebasicmaker
    @Thebasicmaker ปีที่แล้ว

    I did that in DARK BASIC years ago! no objects just a good use of array and variables...I made a simulation of that board with 15 numbers made of plastic that we used to play with in the '80s but with an image to compose too, so I had to make the tiles able to slide in place in the 4 directions, and yes it was necessary for me too to make an empty sqare of course! I remeber that to ceck if the puzzle was right, I checked all the tiles number and if they were consequential (the st was follewed by the 2nd and then the 2nd was followed by the 3rd. and so on...up to 15) if not the game continued till that condition was satisfyed

  • @plskthxbai681
    @plskthxbai681 2 ปีที่แล้ว +2

    Yay! Coding challenges are back!?

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +3

      Yes! My 2022 resolution!

    • @mareletudor
      @mareletudor 2 ปีที่แล้ว

      @@TheCodingTrain lesgooooo

  • @nuskoprasovic2994
    @nuskoprasovic2994 2 ปีที่แล้ว +1

    Love it dan so much , I have veen watchijf your forva very long time and seen most of the challanges and i have learmed so much from it and i just hope you upload more coding challanges and I want to see what kind of plans do you have for this year on this channel

  • @clemensruis
    @clemensruis 2 ปีที่แล้ว

    function isNeighbor(i, j, x, y) {
    return ((abs(i-x) + abs(j-y)) == 1);
    }
    Since it needs to be the same row/col, the difference would be 0 for that. However, the difference needs to be 1 for the other direction. So 0+1 == 1, and 1+0 == 1.

    • @clemensruis
      @clemensruis 2 ปีที่แล้ว

      I'd also use a function "getNeighbors(x, y)" for the shuffling.

  • @ableite
    @ableite 2 ปีที่แล้ว

    the most important thing for beginners in this video is that even masters, when they write the code, it doesnt immediately works. such a myth.

  • @KellyMurphy
    @KellyMurphy 2 ปีที่แล้ว

    as an aside, need to make sure the source image doesn't have any duplicate tile images or the puzzle will be solved pixel wise but, but not necessarly tile wise.

  • @sanderbos4243
    @sanderbos4243 2 ปีที่แล้ว

    Woah, this was amazingly edited! :D

  • @unchayndspersonalaccount7690
    @unchayndspersonalaccount7690 2 ปีที่แล้ว

    Glad to see you back, Dan!

  • @fergusmgraham
    @fergusmgraham 2 ปีที่แล้ว

    Loving the whiteboard

  • @samthomas3255
    @samthomas3255 2 ปีที่แล้ว

    One thing to point out is that isNeighbor will include the diagonals, but otherwise really nicely done! Live coding is so tricky!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว

      I thought I wrote my algorithm to make sure not to include them! Did I make a mistake??

    • @samthomas3255
      @samthomas3255 2 ปีที่แล้ว

      Oh no, that’s my bad. The first conditional checks to make sure it’s in the same row/col. Totally my bad! Disregard!!!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว

      @@samthomas3255 No worries! Thanks for watching and commenting!

  • @dmmarks
    @dmmarks ปีที่แล้ว

    You must make sure that there are no multiple solid squares since there would be no way to know if one was in the correct place or swapped with another solid.

  • @kenhaley4
    @kenhaley4 2 ปีที่แล้ว

    A much easier move() function might be to just input up, down, left, and right. (use arrows, or a,w,s,d, or whatever). If up then exchange the blank with the tile under it, and so forth.

  • @dw1stz
    @dw1stz 2 ปีที่แล้ว

    great video! anyone attempting to improve on his work, think about the tiles with similar content, like the white tiles in his example, there is no visual way to distinguish them and put them in their right location.

  • @alexfast3214
    @alexfast3214 2 ปีที่แล้ว

    Just dropping by to say I am SO HAPPY TO SEE THAT ORIOLES HAT!!!!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว

      Alex!!!!!!!! How are things??? So great to hear from you!

  • @sauliustb
    @sauliustb ปีที่แล้ว

    there is an obvious caveat with 8*8 or 20*20 pieces, where there is no visual indication of white squares being in the right spot. pixel comparison might be needed here..

  • @sfnadim
    @sfnadim 2 ปีที่แล้ว +1

    The music during whiteboard session is distracting, lower the volume a bit 😁

  • @alphabetagamma4069
    @alphabetagamma4069 2 ปีที่แล้ว +1

    i am mad of your coding challenges big fan.

  • @gauravjain183
    @gauravjain183 3 หลายเดือนก่อน

    love this!! :)

  • @the-commits
    @the-commits 2 ปีที่แล้ว

    Aaawww yeah! Happy to see you back again with the challenges and all 😍

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว

      Thank you for your continued support!!

  • @ScientObject40
    @ScientObject40 2 ปีที่แล้ว

    I have a feeling you would absolutely love to participate in a game jam.

  • @CivilF11
    @CivilF11 2 ปีที่แล้ว +3

    Awesome video! Was wondering if you would tackle this one, I had made one a number of years ago, it was fun!
    For the isSolved() method, you could just say:
    if (board[i] === i)
    instead of the tiles i. This would remove the necessity to maintain the tiles index in the data. All that needs to be in order is the board array! Effectively you just need to match the indexes of the board array and the tile array.

  • @willm127
    @willm127 2 ปีที่แล้ว

    Love Hannah Fry!

  • @graforce
    @graforce 2 ปีที่แล้ว +1

    Can you please give a little more explanation about the code being implemented.
    I feel like there is lack of additional explanation, since I cannot follow through all steps..

  • @framegrace1
    @framegrace1 2 ปีที่แล้ว

    To shuffle, you just needed to take the blank tile for a random walk and is done. :)

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว

      I know! What a weird way I did it??!?!?!

  • @CielMC
    @CielMC 2 ปีที่แล้ว +1

    For a second I thought you had some advanced digital whiteboard, took me way too long to realised it's added in post.

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +1

      But my dream is to automate the process!

    • @CielMC
      @CielMC 2 ปีที่แล้ว

      @@TheCodingTrain So youre saying there is a chance we are gonna see some digital whiteboard actions?

  • @chaosdav
    @chaosdav 2 ปีที่แล้ว

    Bedankt

  • @Rozinaa
    @Rozinaa 2 ปีที่แล้ว

    You really need an IDE that shows you errors while you type 😄 And also input parameter names while you type out a function call.

  • @wisdomcube7789
    @wisdomcube7789 2 ปีที่แล้ว

    love yer content ... nice

  • @teryoshkin
    @teryoshkin 2 ปีที่แล้ว

    point is, half of all shuffled variations is unsolvable. I met it while coding 15 puzzle when you got 1 2 3 4 5 6 7 8 9 10 11 12 13 15 14

  • @Sqwince23
    @Sqwince23 2 ปีที่แล้ว

    when solved, the blank square should pop in the missing tile.

  • @maresstefan3391
    @maresstefan3391 2 ปีที่แล้ว

    Cool. A more challenging part would be to create an algorithm that tells you how to solve it :)

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +1

      Yes, I hope to tackle this next!

  • @nicktuckwell
    @nicktuckwell 2 ปีที่แล้ว

    Great stuff!

  • @vlla9483
    @vlla9483 2 ปีที่แล้ว

    This is fun

  • @osamamuhammad7962
    @osamamuhammad7962 7 หลายเดือนก่อน

    Hey there! I noticed that in your videos, you've been manually creating a grid in p5.js for years now. Have you considered turning it into a function or maybe even contributing to p5.js to make it a global function? It would be really awesome and helpful for your viewers if you could simplify the process. What do you think?

  • @cruzeirocrivellari
    @cruzeirocrivellari 2 ปีที่แล้ว

    You are beautiful in this video Dan!
    And thank you for teach us

  • @Random-ot1mk
    @Random-ot1mk 2 ปีที่แล้ว

    Good luck with an 16x16 board but the white tiles have an explicit place where they have to go :D

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว

      haha, yeah, will need a different image for that!

  • @anwerjivani1547
    @anwerjivani1547 2 ปีที่แล้ว

    Radu has done a similar in JavaScript

  • @ChiNguyen-ze8oq
    @ChiNguyen-ze8oq ปีที่แล้ว

    @TheCodingTrain Let's say I want to play celebratory music once the puzzle has been completed. What code should I write then?

  • @enriquenelson7184
    @enriquenelson7184 2 ปีที่แล้ว +1

    Hi I know I'm late but what about a jigsaw generation coding challenge?

  • @YoavZilka
    @YoavZilka 2 ปีที่แล้ว

    Really missed those timed ones!

  • @aeschynanthus_sp
    @aeschynanthus_sp 2 ปีที่แล้ว +1

    You don't need a move function to shuffle the board for it to be solvable. Because that is a standard "15-puzzle", when it is shuffled in the way you did it first an even number of times (and 100 is an even number), it should be solvable in all cases. Numberphile did a video about it, called "Why is this 15-Puzzle impossible?" th-cam.com/video/YI1WqYKHi78/w-d-xo.html
    ..but if the blank square doesn't start, in the shuffled puzzle, in the bottom right corner, things can go differently...

  • @zinsy23
    @zinsy23 2 ปีที่แล้ว +1

    How the heck did you do that with the whiteboard?! Did you cover that in a livestream or something I missed? That's really impressive! Keep it up!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +3

      We're using runwayml.com/ for the rotoscoping and then my drawings are manually traced, hoping to automate it someday!

    • @MrUgleh
      @MrUgleh 2 ปีที่แล้ว +1

      He mentions the whiteboard was messy and I see the "editor" avatar pop up when discussing it so I assume the video editor greenscreened/rotoscoped him out and then animated his own cleaner version, which is why the square isn't so square and the pseudo code is much more than just written text.

  • @ShaneDavisDFTBA
    @ShaneDavisDFTBA 2 ปีที่แล้ว

    How could you get the white tiles be treated as in the correct place?

  • @Nisha.B2
    @Nisha.B2 2 ปีที่แล้ว

    Super sir

  • @eyeonyou1009
    @eyeonyou1009 2 ปีที่แล้ว +1

    hi! great job man! can you kindly make a tetris game^^

  • @CShep99
    @CShep99 2 ปีที่แล้ว

    what is the significance of 549317 in the source image?

  • @leimapapa
    @leimapapa 2 ปีที่แล้ว

    Would love to see if you could implement Eulerian video magnification in p5

  • @baze3541
    @baze3541 2 ปีที่แล้ว

    Oh i actually made this a few muths back =)

  • @emekanwoye4951
    @emekanwoye4951 2 ปีที่แล้ว

    How do I enable other buttons in my sketch window when it runs, so basically I need I stop button and when you click the start Button, every other button becomes disabled. Nothing work until you click on the Stop which is outside the sketch window ... I don't know jow to resolve this

  • @subhamkumar7424
    @subhamkumar7424 2 ปีที่แล้ว

    hi. how you added animation to white board? That was interesting

  • @danielstephenson7558
    @danielstephenson7558 2 ปีที่แล้ว

    Will you be releasing the ASCII Art stream you did a few months back? Or can that be another full coding challenge vid?

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว

      Ahhhh! I'm trying to remember when I did that? I definitely want to do that as a Coding Challenge.

  • @aayush_dutt
    @aayush_dutt 2 ปีที่แล้ว

    Nice tip at 12:35

  • @instanewsupdates
    @instanewsupdates 2 ปีที่แล้ว

    How to crop pieces of the image

  • @hologram4118
    @hologram4118 ปีที่แล้ว

    came for the javascript, stayed cause hes got on a O's hat

  • @barttemolder3405
    @barttemolder3405 2 ปีที่แล้ว

    It is a neighbour if abs(i-x) + abs(j-y) = 1 ...

  • @Vairoon
    @Vairoon 2 ปีที่แล้ว

    I have solved one of these, and random switching doesnt work, becomes impossible sometimes.

    • @Grimlock1979
      @Grimlock1979 2 ปีที่แล้ว

      You can check if it's solvable and then fix it if it's not.

  • @JordanMSeverns
    @JordanMSeverns 2 ปีที่แล้ว

    Ok but what even is that source image lol

  • @kalahari8295
    @kalahari8295 2 ปีที่แล้ว

    😀 PS this video made me like you more as a teacher

  • @RajJaiswal538
    @RajJaiswal538 2 ปีที่แล้ว

    I think I'm gonna do something with my previous codes by shuffling the canvas
    (Not gonna make it solvable)

  • @noorb374
    @noorb374 2 ปีที่แล้ว

    sir if i write this same code then will it work in pure javascript ...

  • @rubenstenlund
    @rubenstenlund 2 ปีที่แล้ว

    Hello! Uvota from stream chat!

    • @TheCodingTrain
      @TheCodingTrain  2 ปีที่แล้ว +1

      Hi hi hi!!!! Thanks for joining the live stream and all of your support!