# -*- coding: utf-8 -*-
from __future__ import unicode_literals
# MyLibrary.py
dict_ = {(0,0):0,(-1, 0): 3, (1, 0): 0, (0, 1): 2, (0, -1): 1, (-1, 1): 2, (-1, -1): 1, (1, -1): 1, (1, 1): 2};
import sys, time, random, math, pygame
from pygame.locals import *
import random
class MySprite(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self) #extend the base Sprite class
self.master_image = None
self.frame = 0
self.old_frame = -1
self.frame_width = 1
self.frame_height = 1
self.first_frame = 0
self.last_frame = 0
self.columns = 1
self.last_time = 0
self.direction = list([0,0])
self.velocity = Point(0.0,0.0)
self.moving = False
self.state = None
self.tag = None
#X property
def _getx(self): return self.rect.x
def _setx(self,value): self.rect.x = value
X = property(_getx,_setx)
#Y property
def _gety(self): return self.rect.y
def _sety(self,value): self.rect.y = value
Y = property(_gety,_sety)
#position property
def _getpos(self): return self.rect.topleft
def _setpos(self,pos): self.rect.topleft = pos
position = property(_getpos,_setpos)
def load(self, filename, width, height, columns):
self.master_image = pygame.image.load(filename).convert_alpha()
self.frame_width = width
self.frame_height = height
self.rect = Rect(0,0,width,height)
self.columns = columns
#try to auto-calculate total frames
rect = self.master_image.get_rect()
self.last_frame = (rect.width // width) * (rect.height // height) - 1
def update(self, current_time, rate=30):
#update animation frame number
if current_time > self.last_time + rate:
self.frame += 1
if self.frame > self.last_frame:
self.frame = self.first_frame
self.last_time = current_time
#build current frame only if it changed
if self.frame != self.old_frame:
frame_x = (self.frame % self.columns) * self.frame_width
frame_y = (self.frame // self.columns) * self.frame_height
rect = Rect(frame_x, frame_y, self.frame_width, self.frame_height)
self.image = self.master_image.subsurface(rect)
self.old_frame = self.frame
def __str__(self):
return str(self.frame) + "," + str(self.first_frame) + \
"," + str(self.last_frame) + "," + str(self.frame_width) + \
"," + str(self.frame_height) + "," + str(self.columns) + \
"," + str(self.rect)
class Point(object):
def __init__(self, x, y):
self.__x = x
self.__y = y
#X property
def getx(self): return self.__x
def setx(self, x): self.__x = x
x = property(getx, setx)
#Y property
def gety(self): return self.__y
def sety(self, y): self.__y = y
y = property(gety, sety)
def __str__(self):
return "{X:" + "{:.0f}".format(self.__x) + \
",Y:" + "{:.0f}".format(self.__y) + "}"
class robot(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self) #extend the base Sprite class
self.master_image = None
self.frame = 0
self.goal = None
self.old_frame = -1
self.ball = None
self.leader = None
self.frame_width = 1
self.frame_height = 1
self.goal_pos = None
self.first_frame = 0
self.last_frame = 0
self.columns = 1
self.last_time = 0
self.direction = list([0,0])
self.speed = 3
self.moving = False
self.state = "chase"
self.tag = None
self.other_group = None
#X property
def _getx(self): return self.rect.x
def _setx(self,value): self.rect.x = value
X = property(_getx,_setx)
#Y property
def _gety(self): return self.rect.y
def _sety(self,value): self.rect.y = value
Y = property(_gety,_sety)
#position property
def _getpos(self): return self.rect.topleft
def _setpos(self,pos): self.rect.topleft = pos
position = property(_getpos,_setpos)
def load(self, filename, width, height, columns):
self.master_image = pygame.image.load(filename).convert_alpha()
self.frame_width = width
self.frame_height = height
self.rect = Rect(0,0,width,height)
self.columns = columns
#try to auto-calculate total frames
rect = self.master_image.get_rect()
self.last_frame = (rect.width // width) * (rect.height // height) - 1
def update(self, current_time, rate=30):
#update animation frame number
# print("tag :"+str(self.tag))
# print(self.direction)
# print(self.speed)
self.behavior()
if self.state == "back":
self.state ="chase"
if self.direction == [0,0]:
self.still()
return
self.which_frame()
if current_time > self.last_time + rate:
self.frame += 1
if self.frame > self.last_frame:
self.frame = self.first_frame
self.last_time = current_time
#build current frame only if it changed
if self.frame != self.old_frame:
frame_x = (self.frame % self.columns) * self.frame_width
frame_y = (self.frame // self.columns) * self.frame_height
rect = Rect(frame_x, frame_y, self.frame_width, self.frame_height)
self.image = self.master_image.subsurface(rect)
self.old_frame = self.frame
def __str__(self):
return str(self.frame) + "," + str(self.first_frame) + \
"," + str(self.last_frame) + "," + str(self.frame_width) + \
"," + str(self.frame_height) + "," + str(self.columns) + \
"," + str(self.rect)
def still(self):
self.frame= self.last_frame = self.first_frame
def chase(self):
self.direction = [self.ball.Y - self.Y ,self.ball.X- self.X]
def catch(self):
t = self.detected()
if t == 2:
self.direction = [self.goal[1] -self.Y+random.randint(-10,10),self.goal[0]- self.X+random.randint(-10,10)]
self.ball.kick_off()
self.state = "chase"
elif t == 1:
self.direction = [self.leader.Y -self.Y+random.randint(-10,10),self.leader.X - self.X +random.randint(-10,10)]
self.ball.kick_off()
self.state = "chase"
else:
self.direction = [self.goal_pos[1] -self.Y,self.goal_pos[0]- self.X]
# if detected() == 1:
# kick_off()
# def kick_off(self):
# if random.randint(1,10) < 5:
# self.direction = [self.leader.Y -self.Y,self.leader.X - self.X ]
# self.ball.kick_off(self)
# self.state = "chase"
def distant(self,p):
return ((self.X - p.X)**2 + (self.Y - p.Y)**2)**(1/2)
def detected(self):
if self.X < 400 and self.tag == 2 and self.X > 100:
return 2;
if self.X > 780 and self.tag == 1 and self.X < 1100:
return 2
for x in self.other_group:
if self.distant(x) < 100:
return 1;
return 3;
def which_frame(self):
which_column = dict_[tuple(self.direction)]
self.first_frame = which_column * self.columns
self.last_frame = self.first_frame + self.columns - 1
if self.frame < self.first_frame:
self.frame = self.first_frame
def run(self):
if self.direction == [0,0]:
return
if self.X >=0 and self.X < 70 and self.Y >=260 and self.Y <265:
if self.dir
![avatar](https://profile-avatar.csdnimg.cn/5fd577049cbf45a6b4920872db46e521_qq_44886601.jpg!1)
听风吹等浪起
- 粉丝: 2w+
- 资源: 2519
最新资源
- 基于Python和多种前端技术的stable-diffusion-webui AI绘画设计源码
- BLDC无刷直流电机Matlab仿真:转速电流双闭环控制及无感反电动势过零换相方式探究,BLDC无刷直流电机Matlab仿真:转速电流双闭环控制及无感反电动势过零换相方式研究,BLDC无刷直流电机ma
- 基于MATLAB的改进量子遗传算法多变量函数寻优代码详解:动态调整量子旋转门提升计算精度,基于Matlab的改进量子遗传算法在多变量函数寻优中的应用,旋转门调整精细化处理程序,基于matlab的改进的
- 基于Java和Vue的RuoYi-Vue新露营项目设计源码
- 三菱电梯LEHY-Pro:解析地址码的奥秘与应用,三菱LEHY-Pro电梯系列:专业级地址码解析与应用指南,三菱电梯LEHY-Pro电梯地址码 ,三菱电梯; LEHY-Pro; 电梯地址码,三菱电梯L
- 基于Java开发的1001上课代码设计源码
- 基于2024年春季学期C语言学习记录的bite代码设计与实现
- 基于改进灰狼算法IGWO的LSSVM回归预测建模系统-实现自适应权重初始化、数据替换及多图可视化误差分析,基于IGWO优化LSSVM回归预测建模的改进算法-初始化优化与自适应权重策略研究,改进灰狼
- 基于HTML的Ajax前端学习设计与源码示例
- 基于Java语言的公益性同城拼车小程序设计源码
- 飞度电感均衡技术解析:三节电池控制逻辑与Sfunction逻辑运算详解,飞度电感均衡技术在三节电池中的应用:控制逻辑与Sfunction详解及逻辑运算解析,飞度电感均衡 三节电池为例 内附控制逻辑 s
- 基于SSM框架的Java+JavaScript+CSS小区物业信息管理系统设计源码
- 基于TypeScript的Cocos行为转向实现与优化设计源码
- 基于Vue框架的DIY商城网站设计源码
- 基于Objective-C的兼职APP设计源码,支持C与MATLAB多语言开发
- 基于Java Server Pages的goldenArches项目设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)