Friday, September 30, 2011

roguelike tutorial 13: aggressive monsters

Now that we have all these cool weapons and armor and food, the bat's and fungi aren't as troublesome as they used to be. We need something that charges straight for us, something that peruses us relentlessly, a simple minded foe that we don't want to run into. For that we need a way to find a path to the player.

The monsters are only going to pathfind to the player if they see him so we could do the simpleist thing and move east if the player is east, north if the player is north, etc. That would almost always work well enough but let's go ahead and add real path finding. Entire tutorials are written about path finding but for this we can use the following code that implements the A Star algorithm and is specialized for our creatures:

package rltut;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

public class PathFinder {
       private ArrayList<Point> open;
       private ArrayList<Point> closed;
       private HashMap<Point, Point> parents;
       private HashMap<Point,Integer> totalCost;
     
       public PathFinder() {
             this.open = new ArrayList<Point>();
             this.closed = new ArrayList<Point>();
             this.parents = new HashMap<Point, Point>();
             this.totalCost = new HashMap<Point, Integer>();
       }
     
       private int heuristicCost(Point from, Point to) {
             return Math.max(Math.abs(from.x - to.x), Math.abs(from.y - to.y));
       }

       private int costToGetTo(Point from) {
             return parents.get(from) == null ? 0 : (1 + costToGetTo(parents.get(from)));
       }
     
       private int totalCost(Point from, Point to) {
             if (totalCost.containsKey(from))
                 return totalCost.get(from);
           
             int cost = costToGetTo(from) + heuristicCost(from, to);
             totalCost.put(from, cost);
             return cost;
       }

       private void reParent(Point child, Point parent){
             parents.put(child, parent);
             totalCost.remove(child);
       }

       public ArrayList<Point> findPath(Creature creature, Point start, Point end, int maxTries) {
             open.clear();
             closed.clear();
             parents.clear();
             totalCost.clear();
       
             open.add(start);
           
             for (int tries = 0; tries < maxTries && open.size() > 0; tries++){
                   Point closest = getClosestPoint(end);
                 
                   open.remove(closest);
                   closed.add(closest);

                   if (closest.equals(end))
                         return createPath(start, closest);
                   else
                         checkNeighbors(creature, end, closest);
             }
             return null;
       }

        private Point getClosestPoint(Point end) {
            Point closest = open.get(0);
            for (Point other : open){
                if (totalCost(other, end) < totalCost(closest, end))
                    closest = other;
            }
            return closest;
        }

        private void checkNeighbors(Creature creature, Point end, Point closest) {
            for (Point neighbor : closest.neighbors8()) {
                if (closed.contains(neighbor)
                 || !creature.canEnter(neighbor.x, neighbor.y, creature.z)
                 && !neighbor.equals(end))
                     continue;
    
                if (open.contains(neighbor))
                    reParentNeighborIfNecessary(closest, neighbor);
                else
                    reParentNeighbor(closest, neighbor);
            }
        }

        private void reParentNeighbor(Point closest, Point neighbor) {
            reParent(neighbor, closest);
            open.add(neighbor);
        }

        private void reParentNeighborIfNecessary(Point closest, Point neighbor) {
            Point originalParent = parents.get(neighbor);
            double currentCost = costToGetTo(neighbor);
            reParent(neighbor, closest);
            double reparentCost = costToGetTo(neighbor);
  
            if (reparentCost < currentCost)
                open.remove(neighbor);
            else
                reParent(neighbor, originalParent);
        }

        private ArrayList<Point> createPath(Point start, Point end) {
            ArrayList<Point> path = new ArrayList<Point>();

            while (!end.equals(start)) {
                path.add(end);
                end = parents.get(end);
            }

            Collections.reverse(path);
            return path;
        }
    }

So far I've liked having Points and Lines where all the work is done in the constructor and would like to extend this idea to Paths. So let's create a Path class that hides the details from us.

package rltut;

import java.util.List;

public class Path {

  private static PathFinder pf = new PathFinder();

  private List<Point> points;
  public List<Point> points() { return points; }

  public Path(Creature creature, int x, int y){
      points = pf.findPath(creature, 
                           new Point(creature.x, creature.y, creature.z), 
                           new Point(x, y, creature.z), 
                           300);
  }
}

If having our Line path do all that work in the constructor was questionable then this is far more questionable. I may end up regretting this and making sure future employers never see this but for now I'll try it and we'll see if it becomes a problem.


Like with our other creatures we need a CreatureAi. I'll take the easy and uncreative way out and pick Zombies for our new monster. The ZombieAi will be a bit different than the others since it needs a reference to the player so it knows who to look for.

package rltut;

import java.util.List;

public class ZombieAi extends CreatureAi {
  private Creature player;

  public ZombieAi(Creature creature, Creature player) {
    super(creature);
    this.player = player;
  }
}

During the zombie's turn it will move to the player if it can see him, otherwise it will wander around. Since zombies are a little slow, I gave them a chance of doing nothing during their turn for just a little bit of interest.

public void onUpdate(){
      if (Math.random() < 0.2)
          return;
  
      if (creature.canSee(player.x, player.y, player.z))
          hunt(player);
      else
          wander();
  }

Creating a new path each turn may not be the best idea but we'll only have a few zombies and rogulikes are turn based so it shouldn't be too much of a problem. If it does be come a performance problem we can fix it.

The hunt method finds a path to the target and moves to it.
public void hunt(Creature target){
      List<Point> points = new Path(creature, target.x, target.y).points();
  
      int mx = points.get(0).x - creature.x;
      int my = points.get(0).y - creature.y;
  
      creature.moveBy(mx, my, 0);
  }

Now we can add zombies to our factory. Since the Ai needs a reference to the player, we have to pass that in.
public Creature newZombie(int depth, Creature player){
      Creature zombie = new Creature(world, 'z', AsciiPanel.white, "zombie", 50, 10, 10);
      world.addAtEmptyLocation(zombie, depth);
      new ZombieAi(zombie, player);
      return zombie;
  }

To add zombies to our world we need to update createCreatures in the PlayScreen.

for (int i = 0; i < z + 3; i++){
         factory.newZombie(z, player);
     }

Adding pathfinding to a game is a big deal. The PathFinder we're using for now is good enough but has some major inefficiencies. I'm using a HashMap of points rather than an array so we don't have to worry about the world size or anything like that. This will take up less memory and handle aarbitrarily large maps but it will be much much slower.

download the code

257 comments:

  1. I can't seem to get this to work, I get the following error in the Pathfinding class;
    java.lang.StackOverflowError
    at java.util.HashMap.get(Unknown Source)


    It seems to be getting stuck on the costToGetTo() method, any ideas on what is causing it to error out?

    ReplyDelete
    Replies
    1. A StackOverflowError is usually caused by a recursive function going haywire and not terminating. I'm guessing that some point is the parent of itself but I'm not sure what to do without the code you're running. Have you looked at other implementations? A* pathfinding is a simple enough idea that you could probably swap this implementation for another. I tried to keep the pathfinding stuff completely unaware of the World and that really shaped the implementation. It turns out that's not good for performance, debugging, or overall clarity.

      Delete
    2. IEEE Final Year Project centers make amazing deep learning final year projects ideas for final year students Final Year Projects for CSE to training and develop their deep learning experience and talents.

      IEEE Final Year projects Project Centers in India are consistently sought after. Final Year Students Projects take a shot at them to improve their aptitudes, while specialists like the enjoyment in interfering with innovation.

      corporate training in chennai corporate training in chennai

      corporate training companies in india corporate training companies in india

      corporate training companies in chennai corporate training companies in chennai

      I have read your blog its very attractive and impressive. I like it your blog. Digital Marketing Company in Chennai

      Delete
  2. Hi thanks for getting back to me. The code is exactly the same as what you have here except I've taken out the z level stuff as well as casted some floats to ints and vice versa. I've been following the tutorials here; http://randomtower.blogspot.co.uk/ and I wanted to see if I could put pathfinding in by seeing how you did it.

    What other pathfinding algorithms would you recommend if I were to use something else other then A*, this is really my first time I've played around with pathfinding.

    ReplyDelete
  3. I had a weird NullPointerException pop up in the Zombie AI.

    In the method

    public void hunt(Creature target)
    {
    ArrayList points = new Path(creature, target.x, target.y).points();

    int mx = points.get(0).x - creature.x;
    int my = points.get(0).y - creature.y;

    creature.moveBy(mx, my, 0);
    }

    the line int mx = points.get(0).x - creature.x; threw it. I was in the bottom floor and almost everything was surrounded by fungus, including the zombie I aggrod. Do you think it was just that there were no points for it to move to, so it threw the exception? I'm personally thinking that's what caused it but haven't been able to get it to throw again.

    ReplyDelete
  4. I'm guessing that the points is null; probably because findPath couldn't find a way to the player so it returns null after a while (300 tries I think). The hunt method should return if points is null or has a length of zero.

    ReplyDelete
  5. The principles have been well cited above and surely would even proved to be much better for them to proceed further with all those instances and the values which are indeed said to be important.

    ReplyDelete
  6. Because you calculate a new path on every onUpdate call (given a monster can see a player), you are solely relying on an heuristic function of A* algorithm. You might as well drop A*, unless you make the monster to calculate a path once and update it if necessary (on player's move).

    You have to at least check if a path that you get in hunt method is not null, otherwise you could get some unexpected behaviour.

    ReplyDelete
  7. Thanks for your article. Its coding is very useful to me. Thank You...Java Training in Chennai
    Java Training Institude in Chennai

    ReplyDelete
  8. ... 6 years later :)
    Hi, I'm trying to code your nice RogueLike using Monogame (c#). I think your createCreatures (PlayScreen) have a little gameplay problem. I imagine that you would like to add Zombies only at depth 3 and above, so for my part I'd prefer the implement that :

    for (int i = 0; i < z - 2; i++)
    factory.NewZombie(z, player);

    I used z - 2 instead of z + 3 (so zimbie start to be seed at depth 3).

    ReplyDelete
  9. http://ttminstitute.blogspot.com/2007/10/what-is-tiit-ttm-institute-of.html

    ReplyDelete
  10. This comment has been removed by the author.

    ReplyDelete
  11. Nice! you are sharing such helpful and easy to understandable blog in decoration. i have no words for say i just say thanks because it is helpful for me.

    robotic process automation companies in us
    Robotic Process Automation in us
    machine maintanance in us
    erp in chennai
    mobility software companies in chennai
    erp providers in us

    ReplyDelete
  12. professional bridal makeup artist in chennai Style Specializes in beauty bridal makeup and makes assured that individual bride should look like a princess.

    best bridal makeup artist in chennai

    ReplyDelete
  13. Soma pill is very effective as a painkiller that helps us to get effective relief from pain. This cannot cure pain. Yet when it is taken with proper rest, it can offer you effective relief from pain.
    This painkiller can offer you relief from any kind of pain. But Soma 350 mg is best in treating acute pain. Acute pain is a type of short-term pain which is sharp in nature. Buy Soma 350 mg online to get relief from your acute pain.

    https://globalonlinepills.com/product/soma-350-mg/


    Buy Soma 350 mg
    Soma Pill
    Buy Soma 350 mg online



    Buy Soma 350 mg online
    Soma Pill
    Buy Soma 350 mg

    ReplyDelete
  14. I gathered a lot of information through this article.Every example is easy to undestandable and explaining the logic easily.selenium training in bangalore

    ReplyDelete
  15. It’s really great information Thanks for sharing.

    Best Manual Testing Training in Bangalore, BTM layout. My Class Training Academy training center for certified course, learning on Manual Testing Course by expert faculties, also provides job placement for fresher, experience job seekers.

    ReplyDelete
  16. Really it was an awesome article,very interesting to read.You have provided an nice article,Thanks for sharing.salesforce developer training in bangalore

    ReplyDelete
  17. Thanks for sharing this blog. This very important and informative blog.dot net training in bangalore

    ReplyDelete
  18. It’s really great information for becoming a better Blogger. Keep sharing, Thanks...

    Bangalore Training Academy located in BTM - Bangalore, Best Informatica Training in Bangalore with expert real-time trainers who are working Professionals with min 8 + years of experience in Informatica Industry, we also provide 100% Placement Assistance with Live Projects on Informatica.

    ReplyDelete
  19. Thank you so much for the great and very beneficial stuff that you have shared with the world.

    Become an Expert In Python Training! The most trusted and trending Programming Language. Learn from experienced Trainers and get the knowledge to crack a coding interview, @Softgen Infotech Located in BTM Layout.

    ReplyDelete
  20. Really very happy to say, your post is very interesting to read. I never stop myself to say something about it. You’re doing a great job. Keep it up...

    Upgrade your career Learn AWS Training from industry experts get Complete hands-on Training, Interview preparation, and Job Assistance at Softgen Infotech Located in BTM Layout.

    ReplyDelete
  21. Enjoyed reading the article above, really explains everything in detail,the article is very interesting and effective.Thank you and good luck…

    Start your journey with DevOps Course and get hands-on Experience with 100% Placement assistance from experts Trainers @Softgen Infotech Located in BTM Layout Bangalore.

    ReplyDelete
  22. That was really a great Article. Thanks for sharing information. Continue doing this.

    Real Time Experts provides Best SAP PM Training in Bangalore with expert real-time trainers who are working Professionals with min 8+ years of experience in Java Training Industry, we also provide 100% Placement Assistance with Live Projects on Java Training

    ReplyDelete
  23. such a great word which you use in your article and article is amazing knowledge. thank you for sharing it.

    Start your journey with AWS Course and get hands-on Experience with 100% Placement assistance from Expert Trainers with 8+ Years of experience @eTechno Soft Solutions Located in BTM Layout Bangalore.

    ReplyDelete
  24. Such a great information for blogger i am a professional blogger thanks…

    Softgen Infotech is the Best HADOOP Training located in BTM Layout, Bangalore providing quality training with Realtime Trainers and 100% Job Assistance.

    ReplyDelete
  25. This comment has been removed by the author.

    ReplyDelete
  26. GrueBleen – One of the best social media marketing agency in Riyadh- Saudi Arabia. Visit here for the all service details of GrueBleen.
    Social Media Marketing Agency

    ReplyDelete
  27. Agriculture Solutions – Taldeen is a plastic manufacturing company in Saudi Arabia. They are manufacturing agricultural plastic products like greenhouse cover and hay cover. Visit the below link to know more details
    Agriculture Solutions
    Greenhouse Cover

    ReplyDelete
  28. GrueBleen – One of the best branding and marketing agency in Riyadh- Saudi Arabia. If you need the details, click the below link
    Branding Agency Riyadh
    Marketing Agency Riyadh

    ReplyDelete
  29. BSc in Optometry – Here is the details about Best BSc Optometry Colleges In Bangalore. If you are looking to study in Bangalore, the below link will redirect to a page that will show the best OPT colleges in Bangalore. If you are looking to study BSc Optometry in Bangalore, click the below link.
    Optometry Colleges In Bangalore

    ReplyDelete
  30. BSc Cardiac Care Technology – Here is the details about Best BSc Cardiac Care Technology Colleges In Bangalore. If you are looking to study in Bangalore, the below link will redirect to a page that will show the best BCC colleges in Bangalore
    BSc Cardiac Care Technology Colleges In Bangalore

    ReplyDelete
  31. BBA Aviation – One of the most demanding management course in recent times. Here is the details of Best BBA Aviation colleges in Bangalore. If you are looking too study in Bangalore, visit the below link.
    BBA Aviation Colleges In Bangalore

    ReplyDelete
  32. BSc Perfusion Technology – If you are looking to study BSc Perfusion Technology in Bangalore, just check out the following link. In that link you can get the details of Best BSc Medical Imaging Technology colleges in Bangalore
    BSc Perfusion Technology Colleges in Bangalore

    ReplyDelete
  33. BMIT – BSc Medical Imaging Technology – Here is the details about Best BSc Medical Imaging Technology Colleges In Bangalore. If you are looking to study in Bangalore, the below link will redirect to a page that will show the best BMIT colleges in Bangalore
    BSc Medical Imaging Technology Colleges In Bangalore

    ReplyDelete
  34. I have been more or less playing around with different paths for myself in my head and one of the new ones is to become a blogger.
    ExcelR Digital Marketing Courses In Bangalore

    ReplyDelete
  35. Thanks for sharing such a great information..Its really nice and informative..

    sap bi training

    ReplyDelete

  36. Very nice job... Thanks for sharing this amazing and educative blog post! Digital Marketing Course Pune

    ReplyDelete
  37. This comment has been removed by the author.

    ReplyDelete
  38. I just got to this amazing site not long ago. I was actually captured with the piece of resources you have got here. Big thumbs up for making such wonderful blog page!. digital marketing course Bangalore

    ReplyDelete
  39. Whatever we gathered information from the blogs, we should implement that in practically then only we can understand that exact thing clearly, but it’s no need to do it, because you have explained the concepts very well. It was crystal clear, keep sharing....

    sapui5 online training

    ReplyDelete
  40. I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.satta king

    ReplyDelete
  41. With the help of creative designing team TSS advertising company provides different branding and marketing strategies in advertising industry...
    https://www.tss-adv.com/branding-and-marketing

    ReplyDelete
  42. Welcome to the party of my life here you will learn everything about me.
    Digital Marketing Courses in Pune

    ReplyDelete
  43. Needed to compose you a very little word to thank you yet again regarding the nice suggestions you’ve contributed here.

    Python Training
    Digital Marketing Training
    AWS Training

    ReplyDelete
  44. This is a splendid website! I"m extremely content with the remarks!.
    ExcelR Solutions

    ReplyDelete
  45. Other content online cannot measure up to the work you have put out here. Your insight on this subject has convinced me of many of the points you have expressed. This is great unique writing.
    Best Data Science training in Mumbai

    Data Science training in Mumbai

    ReplyDelete
  46. GrueBleen Creative Club - Digital Marketing is booming now. People & Brands are engaging Social Media for content creation alike. People are focusing to share their beautiful moments on Social Media. But, Brands are creating post for their product or service and Social Commitment alike. Brands are choose Social Media Agencies for their trust creation in Digital Media. Here, is the details that provided by GrueBleen Creative Club, Riyadh.
    Branding Agency Riyadh
    Marketing Agency Riyadh
    Digital Marketing Agency Riyadh
    Digital Marketing Agency Saudi Arabia
    Digital Marketing Agency Jeddah
    Social Media Agency Riyadh
    Social Media Agency Jeddah
    Social Media Agency Saudi Arabia
    Branding Agency Jeddah
    Marketing Agency Jeddah
    Marketing Agency Saudi Arabia
    Branding Agency Saudi Arabia

    ReplyDelete
  47. It's really a nice and useful piece of information about Selenium. I'm satisfied that you shared this helpful information with us.Please keep us informed like this. Thank you for sharing.

    Java training in chennai | Java training in annanagar | Java training in omr | Java training in porur | Java training in tambaram | Java training in velachery

    ReplyDelete
  48. It is actually a great and helpful piece of information about Java. I am satisfied that you simply shared this helpful information with us. Please stay us informed like this. Thanks for sharing.
    Java training in chennai | Java training in annanagar | Java training in omr | Java training in porur | Java training in tambaram | Java training in velachery

    ReplyDelete
  49. Not many writers can persuade me to their way of thinking. You've done a great job of doing that on many of your views here.
    SAP training in Kolkata
    SAP training Kolkata
    Best SAP training in Kolkata
    SAP course in Kolkata
    SAP training institute Kolkata

    ReplyDelete
  50. I like viewing web sites which comprehend the price of delivering the excellent useful resource free of charge. I truly adored reading your posting. Thank you!...digital marketing courses in bangalore

    ReplyDelete
  51. Very interesting blog Thank you for sharing such a nice and interesting blog and really very helpful article.

    Dell Boomi Training in Bangalore

    Best Dell Boomi Training Institutes in Bangalore

    ReplyDelete
  52. I had to read this three times because I wanted to be sure on some of your points. I agree on almost everything here, and I am impressed with how well you wrote this article.
    Data Science training in Mumbai
    Data Science course in Mumbai
    SAP training in Mumbai

    ReplyDelete
  53. Writing, like great art requires much more than knowledge and education. A great writer is born as opposed to ""made"" and you are a great writer. This is excellent content and interesting information. Thank you.
    SAP training in Kolkata
    SAP training Kolkata
    Best SAP training in Kolkata
    SAP course in Kolkata

    ReplyDelete
  54. Great article! Thanks for sharing content and such nice information for me. Keep sharing. Thanks...
    Golden Triangle Tour 5 Days

    ReplyDelete
  55. This article is well formulated. I particularly like the way how you have delivered all the major points about the topic of the content in petite and crisp points.
    SAP training in Kolkata
    SAP training Kolkata
    Best SAP training in Kolkata
    SAP course in Kolkata

    ReplyDelete
  56. Its really helpful for the users of this site. I am also searching about these type of sites now a days. So your site really helps me for searching the new and great stuff.

    SAP HANA Online Training

    SAP HANA Classes Online

    SAP HANA Training Online

    Online SAP HANA Course

    SAP HANA Course Online

    ReplyDelete
  57. Being new to the blogging world I feel like there is still so much to learn. Your tips helped to clarify a few things for me as well as giving.

    SAP HCM Online Training

    SAP HCM Classes Online

    SAP HCM Training Online

    Online SAP HCM Course

    SAP HCM Course Online

    ReplyDelete
  58. This splendid article really deserves a courteous bow down. I must own up that this article is very helpful.
    SAP training in Kolkata
    SAP course in Kolkata
    SAP training institute in Kolkata

    ReplyDelete
  59. Nice Blog!
    Facing error while using QuickBooks get instant solution with our QuickBooks experts.Dial +1-(855)533-6333 QuickBooks Payroll Support Phone Number

    ReplyDelete
  60. Love the article, I likes your content. Thanks for sharing your information. Fashion bloggers in India

    ReplyDelete
  61. thanks for sharing, keep up the good work, great post

    freelancing site in india

    ReplyDelete
  62. Nice tutorial. Thanks for sharing the valuable information. it’s really helpful. Who want to learn this blog most helpful. Keep sharing on updated tutorials…
    Digital Marketing Course in Chennai
    Digital Marketing Courses in Bangalore
    Digital Marketing Course in Delhi
    Digital Marketing Online Course

    ReplyDelete
  63. I feel that is one of the so much vital information for me. And I am happy to read your article. However want to observation on some general things, The site style is great, the articles is, in reality, excellent: D. Good activity, cheers
    B2B Marketplace
    Wholesalers
    Our Service Partners
    Refrigerator Repair Service
    Satta King
    Mumbai Call Girls

    ReplyDelete
  64. Take a look at Best Indoor Playground Los Angeles For Kids to have fun and enjoyable with them.

    ReplyDelete
  65. Great tips and very easy to understand. This will definitely be very useful for me when I get a chance to start my blog. ExcelR Data Science Course In Pune

    ReplyDelete
  66. Great article with excellent idea i appreciate your post thank you so much and let keep on sharing your stuffs.
    Thanks for the article
    Spa in dubai
    Thai massage in Dubai
    massage spa near me
    spa in sharjah

    ReplyDelete
  67. Oracle Corporation is an American multinational computer technology corporation headquartered in Redwood Shores, California.
    tally training in chennai

    hadoop training in chennai

    sap training in chennai

    oracle training in chennai

    angular js training in chennai




    ReplyDelete
  68. iot training in chennai - IoT Training in Chennai - IOT is one of the technology which has a lot of scope at the very same time very less number of skilled empolyees in this technology which means this particular technology will give a huge success rate. Join the Best IOT Training Institute in Chennai now.

    Devops training Institute in Chennai - Devops a combination of Development and operations has an better career .Jobs opportunities are there from startup company to big mnc. Start to learn the devops technology soon and secure your job now.

    blue prism training in Chennai - If you choose to learn the blue prism or automation tool you are supposed to have the programming language. start to learn the blue prism training from the Best Blue prism training Institute in Chennai.

    uipath training in Chennai - ui path technology is one of the fastest developing field which has lot of job opportunities such as software developer, Programmer and lot more. Join the Best Uipath training Institute in Chennai.

    microsoft azure training in chennai -Microsoft azure technology is growing and soon it will be competitive aws. So students start to learn microsoft azure now will be well - paid in future. Start to learn microsoft azure training in Chennai.

    Chennai IT Training Center

    ReplyDelete
  69. I have been searching to find a comfort or effective procedure to complete this process and I think this is the most suitable way to do it effectively. ExcelR Data Analyst Course

    ReplyDelete
  70. The Pomsky is a designer breed of dog that is a hybrid of the Pomeranian and the Siberian Husky. Adorable Pomsky puppies have attracted a lot of attention recently and made them one of the most popular breeds of 2017.
    Best Online Pet Adoption : Cavapoo Puppies For Sale : Australian Shepherd Puppies Below $200 : Available Maltipoo Puppies Online : Where To Buy Golden Retriever Puppies OnlineBest Online Adoption|Healthy Puppies for Sale|Cavapoo puppies for sale

    ReplyDelete
  71. Thanks so much with this fantastic new web site. I’m very fired up to show it to anyone. It makes me so satisfied your vast understanding and wisdom have a new channel for trying into the world.
    If Want Play online Satta King Games Click Satta King :-

    ReplyDelete
  72. Did you know that you can easily view the contents of your phone on your TV without a cable? With a screen mirror app you can easily do the screen mirroring from Android to TV. Check out www.screenmirroring.me to find out more.

    ReplyDelete
  73. Really glad to have your amazing historical website, the sharing history is really impressive and quite useful too. Thanks for the house museum information to share that would be a great way to acknowledge kids about legends who died for the country
    If Want Play online Satta King click Satta King :-

    ReplyDelete
  74. Thumbs up guys your doing a really good job. 인증업체

    ReplyDelete
  75. You have a real ability for writing unique content. I like how you think and the way you represent your views in this article. I agree with your way of thinking. Thank you for sharing.먹튀검증사이트

    ReplyDelete
  76. It is the intent to provide valuable information and best practices, including an understanding of the regulatory process. 먹튀검증사이트

    ReplyDelete
  77. A debt of gratitude is in order for ExcelR Data Analytics Courses the blog entry amigo! Keep them coming...

    ReplyDelete
  78. Great tips and very easy to understand. This will definitely be very useful for me when I get a chance to start my blog. 토토사이트

    ReplyDelete
  79. Thanks for Sharing This Article.It is very so much valuable content. I hope these Commenting lists will help to my website
    mulesoft online training
    best mulesoft online training
    top mulesoft online training

    ReplyDelete
  80. Thanks for the informative and helpful post, obviously in your blog everything is good.. 토토사이트

    ReplyDelete
  81. Wow it is really wonderful and awesome thus it is very much useful for me to understand many concepts and helped me a lot.

    RPA Training in Bangalore

    Best RPA Training Institutes in Bangalore

    ReplyDelete
  82. pharmacy websites that operate legally such as buy adderall XR online and offer convenience

    ReplyDelete
  83. this real good content buy colombian cocaine online will like to also say we have an amazing blog

    ReplyDelete
  84. And Yes, you can buy crack cocaine online illegal drugs on the Internet, and it's a lot safer

    ReplyDelete
  85. Thanks for Sharing This Article.It is very so much valuable content. I hope these Commenting lists will help to my website
    splunk online training

    ReplyDelete
  86. Thanks For sharing a nice post about all Course.It is very helpful and for us.
    Dell Boomi training in bangalore

    ReplyDelete
  87. This Blog Contain Good information about that. bsc 3rd year time table Thanks for sharing this blog.

    ReplyDelete

  88. I have been searching to find a comfort or effective procedure to complete this process and I think this is the most suitable way to do it effectively. ExcelR Data Scientist Course In Pune

    ReplyDelete
  89. Thanks For Sharing The Information The Information Shared Is Very Valuable Please Keep Updating Us Time Just Went On Reading The article
    by cognex is the AWS Training in Chennai

    ReplyDelete
  90. aws training in chennai - AWS Amazon web services is a Trending Technologies and one of the most sought after courses.Join the Best Aws course in Chennai now.

    IOT training in chennai - Internet of things is one of best technology, Imagine a world with a Internet and everything minute things connected to it .

    DevOps Training Institute in Chennai - Just from DevOps course Best DeVops training Institute in Chennai is also providing Interview Q & A with complete course guidance, Join the Best DevOps Training Institute in Chennai.

    Load runner training in Chennai - Load runner is an software testin tool. It is basically used to test application measuring system behaviour and performance under load. Here comes an Opportunity to learn Load Runner under the guidance of Best Load Runner Training Institute in Chennai.

    ReplyDelete
  91. Wonderful blog found to be very impressive to come across such an awesome blog. I should really appreciate the blogger for the efforts they have put in to develop such an amazing content for all the curious readers who are very keen of being updated across every corner. Ultimately, this is an awesome experience for the readers. Anyways, thanks a lot and keep sharing the content in future too.

    Digital Marketing training in Bhilai

    ReplyDelete
  92. Chennai IT Training Center
    Artificial Intelligence training in chennai - Basically AI Artificial Intelligence is a programming which is created for robots to think and work on there own without the help of humans.

    RPA Training Institute in Chennai - RPA is useful in making complex decision by collaborating with Artificial Intelligence. And it will also contribute to the market of Big data and IOT. Join the Best RPA Training Institute in Chennai now.

    Load runner training in Chennai - Load runner is an software testin tool. It is basically used to test application measuring system behaviour and performance under load. Here comes an Opportunity to learn Load Runner under the guidance of Best Load Runner Training Institute in Chennai.

    apache Spark training in Chennai - Apache Spark is an open- source, Split Processing System commonly used for big data workloads. Learn this wonderful technology from and under the guidance of Best Apache spark Training Institute in Chennai.

    ReplyDelete
  93. Thanks for Sharing This Article.It is very so much valuable content. I hope these Commenting lists will help to my website
    splunk online training

    ReplyDelete
  94. Wonderful blog found to be very impressive to come across such an awesome blog. I should really appreciate the blogger for the efforts they have put in to develop such an amazing content for all the curious readers who are very keen of being updated across every corner. Ultimately, this is an awesome experience for the readers. Anyways, thanks a lot and keep sharing the content in future too.
    Digital Marketing Training

    ReplyDelete
  95. I am very thankful for share this post. Buy real leather jackets with worldwide free shipping.
    Harley Davidson Jackets
    Superhero Leather Jackets
    Aviator Leather Jacket
    Motogp Leather Jacket

    ReplyDelete
  96. Nice to be visiting your blog again, it has been months for me. Well this article that i've been waited for so long. I need this article to complete my assignment in the college, and it has the same topic with your article. Thanks, great share 메이저놀이터

    ReplyDelete