鱼C论坛

 找回密码
 立即注册
查看: 1328|回复: 4

[已解决]怎么优化这段课后作业代码?

[复制链接]
发表于 2021-8-7 23:23:15 From FishC Mobile | 显示全部楼层 |阅读模式
10鱼币
课后作业的部分代码:
规则(乌龟部分)是乌龟在(0,0)到(10,10)内的正方形区域移动,每次步幅不超过2(可以是1),碰到边界往反方向移动…

我看答案乌龟x坐标动完就得移y坐标,但是不是有其他情况如连续移两次x坐标等等,是否有办法实现往不同方向移动的需求?

部分代码如下:
import random as r

legal_x = [0, 10]
legal_y = [0, 10]

class Turtle:
    def __init__(self):
        # 初始体力
        self.power = 100
        # 初始位置随机
        self.x = r.randint(legal_x[0], legal_x[1])
        self.y = r.randint(legal_y[0], legal_y[1])

    def move(self):
        # 随机计算方向并移动到新的位置(x, y)
         new_x = self.x + r.choice([1, 2, -1, -2])
        new_y = self.y + r.choice([1, 2, -1, -2])

就是new_x和new_y这一段,后面就是关于边界返回的部分了
最佳答案
2021-8-7 23:23:16
def move(self):
    m = r.choice([0+1j, 0+2j, 0-1j, 0-2j, 1+0j, 1+1j, 1-1j, -1-0j, -1-1j, -1+1j, 2+0j, -2+0j])
    new_x = self.x + int(m.imag)
    new_y = self.y + int(m.real)

最佳答案

查看完整内容

def move(self): m = r.choice([0+1j, 0+2j, 0-1j, 0-2j, 1+0j, 1+1j, 1-1j, -1-0j, -1-1j, -1+1j, 2+0j, -2+0j]) new_x = self.x + int(m.imag) new_y = self.y + int(m.real)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-7 23:23:16 | 显示全部楼层    本楼为最佳答案   
def move(self):
    m = r.choice([0+1j, 0+2j, 0-1j, 0-2j, 1+0j, 1+1j, 1-1j, -1-0j, -1-1j, -1+1j, 2+0j, -2+0j])
    new_x = self.x + int(m.imag)
    new_y = self.y + int(m.real)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-8 10:24:30 | 显示全部楼层
kogawananari 发表于 2021-8-7 23:54
def move(self):
    m = r.choice([0+1j, 0+2j, 0-1j, 0-2j, 1+0j, 1+1j, 1-1j, -1-0j, -1-1j, -1+1j, 2+ ...

import random as r

class Turtle:
    def __init__(self):
        self.x = r.randint(0,10)
        self.y = r.randint(0,10)
        self.blood = 100
        
    def move(self):
        m = r.choice([0+1j, 0+2j, 0-1j, 0-2j,
                      1+0j, 1+1j, 1-1j, -1-0j, -1-1j, -1+1j, 2+0j, -2+0j])
        self.x += int(m.imag)
        self.y += int(m.real)
        self.blood -= 1
        if self.x < 0:
            self.x = -self.x
        if self.x > 10:
            self.x = 20-self.x
        elif 0 <= self.x <= 10:
            self.x =self.x
        if self.y < 0:
            self.y = -self.y
        if self.y > 10:
            self.y = 20-self.y
        else:
            self.y =self.y
       print(self.x,self.y)
   
    def eat(self):
        self.blood += 20
        if self.blood >= 100:
            self.blood = 100
class Fish:
    def __init__(self):
        self.x = r.randint(0,10)
        self.y = r.randint(0,10)
    def move(self):
        m = r.choice([0+1j, 0-1j,1+0j, -1+0j])
        self.x += int(m.imag)
        self.y += int(m.real)

        if self.x < 0:
            self.x = -self.x
        if self.x > 10:
            self.x = 20-self.x
        elif 0 <= self.x <= 10:
            self.x =self.x
        if self.y < 0:
            self.y = -self.y
        if self.y > 10:
            self.y = 20-self.y
        else:
            self.y = self.y
        print(self.x,self.y)

fish = []
turtle = Turtle()
for i in range(10):
    new_fish = Fish()
    fish.append(new_fish)
   
while True:
    if fish == []:
        print("鱼被吃光了,游戏结束!")
        break
    if turtle.blood <= 0:
        print("乌龟体力值不足,游戏结束!")
        break
    pos = turtle.move()
    for each_fish in fish[:]:
        if each_fish.move() == pos:
            # 鱼儿被吃掉了
            turtle.eat()
            fish.remove(each_fish)
            print("有一条鱼儿被吃掉了...")
那能帮我解释一下这两处print换成return有什么区别吗?我运行起来好像不太一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-8 10:25:41 | 显示全部楼层
kogawananari 发表于 2021-8-7 23:54
def move(self):
    m = r.choice([0+1j, 0+2j, 0-1j, 0-2j, 1+0j, 1+1j, 1-1j, -1-0j, -1-1j, -1+1j, 2+ ...

规则是:
假设游戏场景为范围(x, y)为0<=x<=10,0<=y<=10
游戏生成1只乌龟和10条鱼
它们的移动方向均随机
乌龟的最大移动能力是2(Ta可以随机选择1还是2移动),鱼儿的最大移动能力是1
当移动到场景边缘,自动向反方向移动
乌龟初始化体力为100(上限)
乌龟每移动一次,体力消耗1
当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20
鱼暂不计算体力
当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-8 11:40:02 | 显示全部楼层
kogawananari 发表于 2021-8-7 23:54
def move(self):
    m = r.choice([0+1j, 0+2j, 0-1j, 0-2j, 1+0j, 1+1j, 1-1j, -1-0j, -1-1j, -1+1j, 2+ ...

哦,没事了,懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 15:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表