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