X01.AntWorld: An Python AI Game, x01.antworldpython

Source: Internet
Author: User

X01.AntWorld: An Python AI Game, x01.antworldpython

1. I learned about AI wuziqi and changed it to a 19-way chessboard to facilitate general use of go. Render. py is mainly modified as follows:

# Constant part: IMAGE_PATH = 'img/'StoneSize = 32 WIDTH = 650 HEIGHT = 732 ColSize = 33 RowSize = 34.44H _ Pad = (HEIGHT-RowSize * 19) /2 + (RowSize-StoneSize)/2 + 1W_Pad = (WIDTH-ColSize * 19)/2 + (ColSize-StoneSize)/2 + 1Pad = ColSize-StoneSize, rowSize-StoneSizePIECE = StoneSize # coordinate transformation part: def coordinate_transform_map2pixel (self, I, j ): # conversion from logical coordinates in chessMap to draw coordinates on the UI return j * (PIECE + Pad [0]) + W_Pad, I * (PIECE + Pad [1]) + H_Pad def coordinate_transform_pixel2map (self, x, y): # transformation from the draw coordinate on the UI to the logical coordinate in the chessMap I, j = int (y-H_Pad) /(PIECE + Pad [1]), int (x-W_Pad)/(PIECE + Pad [0]) if I <0 or I> = N or j <0 or j> = N: return None, None else: return I, j

2. I found that pygame is not bad. I searched for Beginning Game Development With Python And Pygame on the Internet. The AI performance of ant games is very good. The main code is as follows:

Import pygamefrom pygame. locals import * from random import randintfrom core. vector2d import Vector2DScreenSize = (640,480) NestLocation = (320,240) AntCount = 20 NestSize = 100.0 ImgPath = "img/" class State (object): def _ init _ (self, name): self. name = name def do_actions (self): pass def check_conditions (self): pass def entry_actions (self): pass def exit_actions (self): pass class StateMachine (object ): Def _ init _ (self): self. states = {} self. active_state = None def add_state (self, state): self. states [state. name] = state def think (self): if self. active_state is None: return self. active_state.do_actions () new_state_name = self. active_state.check_conditions () if new_state_name is not None: self. set_state (new_state_name) def set_state (self, new_state_name): if self. active_state is not None: sel F. active_state.exit_actions () self. active_state = self. states [new_state_name] self. active_state.entry_actions () class World (object): def _ init _ (self): self. entities = {} self. entity_id = 0 self. background = pygame. surface. surface (ScreenSize ). convert () self. background. fill (255,255,255) pygame. draw. circle (self. background, (200,255,200), NestLocation, int (NestSize) def add_entity (self, entity): s Elf. entities [self. entity_id] = entity. id = self. entity_id self. entity_id + = 1 def remove_entity (self, entity): del self. entities [entity. id] def get (self, entity_id): if entity_id in self. entities: return self. entities [entity_id] else: return None def process (self, time_passed): time_passed_seconds = time_passed/1000.0 entities = list (self. entities. values () for entity in entities: entity. Process (time_passed_seconds) def render (self, surface): surface. BITs (self. background, (0, 0) for entity in self. entities. values (): entity. render (surface) def got_close_entity (self, name, location, range = 100.0): location = Vector2D (* location) for entity in self. entities. values (): if entity. name = name: distance = location. get_distance_to (entity. location) if distance <range: return entity return N One class GameEntity (object): def _ init _ (self, world, name, image): self. world = world self. name = name self. image = image self. location = Vector2D (0, 0) self. destination = Vector2D (0, 0) self. speed = 0 self. brain = StateMachine () self. id = 0 def render (self, surface): x, y = self. location w, h = self. image. get_size () surface. BITs (self. image, (x-w/2, y-h/2) def process (self, time_passed): self.br Ain. think () if self. speed> 0 and self. location! = Self. destination: vec_to_destination = self. destination-self. location distance_to_destination = vec_to_destination.get_length () heading = vec_to_destination.get_normalized () travel_distance = min (distance_to_destination, time_passed * self. speed) self. location + = travel_distance * heading class Leaf (GameEntity): def _ init _ (self, world, image): GameEntity. _ init _ (self, world, "leaf", image) class Spider (GameEntity): def _ init _ (self, world, image): GameEntity. _ init _ (self, world, "spider", image) self. dead_image = pygame. transform. flip (image, 0, 1) self. health = 25 self. speed = 50.0 + randint (-20, 20) def bitten (self): self. health-= 1 if self. health <= 0: self. speed = 0 self. image = self. dead_image self. speed = 140 def render (self, surface): GameEntity. render (self, surface) x, y = self. location w, h = self. image. get_size () bar_x = x-12 bar_y = y + h/2 surface. fill (255, 0, 0), (bar_x, bar_y, 25, 4) surface. fill (0,255, 0), (bar_x, bar_y, self. health, 4) def process (self, time_passed): x, y = self. location if x> ScreenSize [0] + 2: self. world. remove_entity (self) return GameEntity. process (self, time_passed) class Ant (GameEntity): def _ init _ (self, world, image): GameEntity. _ init _ (self, world, "ant", image) paiing_state = antstategrouping (self) seeking_state = AntStateSeeking (self) delivering_state = login (self) hunting_state = AntStateHunting (self) self. brain. add_state (exploring_state) self. brain. add_state (seeking_state) self. brain. add_state (delivering_state) self. brain. add_state (hunting_state) self. carry_image = None def carry (self, image): self. carry_image = image def drop (self, surface): if self. carry_image: x, y = self. location w, h = self. carry_image.get_size () surface. BITs (self. carry_image, (x-w, y-h/2) self. carry_image = None def render (self, surface): GameEntity. render (self, surface) if self. carry_image: x, y = self. location w, h = self. carry_image.get_size () surface. BITs (self. carry_image, (x-w, y-h/2) class antstategrouping (State): def _ init _ (self, ant): State. _ init _ (self, "inserting ing") self. ant = ant def random_destination (self): w, h = ScreenSize self. ant. destination = Vector2D (randint (0, w), randint (0, h) def do_actions (self): if randint (1, 20) = 1: self. random_destination () def check_conditions (self): leaf = self. ant. world. got_close_entity ("leaf", self. ant. location) if leaf is not None: self. ant. leaf_id = leaf. id return "seeking" spider = self. ant. world. got_close_entity ("spider", NestLocation, NestSize) if spider is not None: if self. ant. location. get_distance_to (spider. location) <100: self. ant. spider_id = spider. id return "hunting" return None def entry_actions (self): self. ant. speed = 120 + randint (-30, 30) self. random_destination () class AntStateSeeking (State): def _ init _ (self, ant): State. _ init _ (self, "seeking") self. ant = ant self. leaf_id = None def check_conditions (self): leaf = self. ant. world. get (self. ant. leaf_id) if leaf is None: return "processing ing" if self. ant. location. get_distance_to (leaf. location) <5: self. ant. carry (leaf. image) self. ant. world. remove_entity (leaf) return "delivering" return None def entry_actions (self): leaf = self. ant. world. get (self. ant. leaf_id) if leaf is not None: self. ant. destination = leaf. location self. ant. speed = 160 + randint (-20, 20) class AntStateDelivering (State): def _ init _ (self, ant): State. _ init _ (self, "delivering") self. ant = ant def check_conditions (self): if Vector2D (* NestLocation ). get_distance_to (self. ant. location) <NestSize: if randint (1, 10) = 1: self. ant. drop (self. ant. world. background) return "sorting ing" return None def entry_actions (self): self. ant. speed = 60 random_offset = Vector2D (randint (-20,20), randint (-20,20) self. ant. destination = Vector2D (* NestLocation) + random_offsetclass AntStateHunting (State): def _ init _ (self, ant): State. _ init _ (self, "hunting") self. ant = ant self. got_kill = False def do_actions (self): spider = self. ant. world. get (self. ant. spider_id) if spider is None: return self. ant. destination = spider. location if self. ant. location. get_distance_to (spider. location) <15: if randint (1, 5) = 1: spider. bitten () if spider. health <= 0: self. ant. carry (spider. image) self. ant. world. remove_entity (spider) self. got_kill = True def check_conditions (self): if self. got_kill: return "delivering" spider = self. ant. world. get (self. ant. spider_id) if spider is None: return "processing ing" if spider. location. get_distance_to (NestLocation)> NestSize * 3: return "sorting ing" return None def entry_actions (self): self. speed = 160 + randint () def exit_actions (self): self. got_kill = Falsedef run (): pygame. init () screen = pygame. display. set_mode (ScreenSize, 0, 32) world = World () w, h = ScreenSize clock = pygame. time. clock () ant_image = pygame. image. load (ImgPath + "ant.png "). convert_alpha () leaf_image = pygame. image. load (ImgPath + "leaf.png "). convert_alpha () spider_image = pygame. image. load (ImgPath + "spider.png "). convert_alpha () for ant_nr in range (AntCount): ant = Ant (world, ant_image) ant. location = Vector2D (randint (0, w), randint (0, h) ant. brain. set_state ("processing ing") world. add_entity (ant) while True: for e in pygame. event. get (): if e. type = QUIT: return time_passed = clock. tick (30) if randint (1, 10) = 1: leaf = Leaf (world, leaf_image) leaf. location = Vector2D (randint (0, w), randint (0, h) world. add_entity (leaf) if randint (1,100) = 1: spider = Spider (world, spider_image) spider. location = Vector2D (-50, randint (0, h) spider. destination = Vector2D (w + 50, randint (0, h) world. add_entity (spider) world. process (time_passed) world. render (screen) pygame. display. update ()Antworld. py

Run the following command:

 

Complete source code download: http://download.csdn.net/download/china_x01/10125074

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.