Python第五课----一个关于进化的Python游戏

目录

1. 概述

2.游戏设定

3.程序编写

3.1 import导入

3.2 无颚鱼类的建立

3.3 草履虫类的建立

3.3 主循环的建立

3.4 程序运行结果

3.4.1 当把边界位置设定为[0,4]时

3.4.2 当把边界位置设定为[0,8]时

3.4.3 当把边界位置设定为[0,10]时

4. 小结


1. 概述

中年大叔在学习了一周Python后,决定做一个关于进化的小游戏,游戏用到的知识比较简单,使用的技术包括:

1. import 导入随机数模块:

  •  使用randint得到[min,max]的随机数;
  • 使用choice得到choice([c1,c2,c3])的随机一种结果。

2. 面向对象编程:

  • 使用class
  • 使用def函数

2.游戏设定

游戏的设定如下:

1. 假设有一片原始海洋,原始海洋的大小为10*10

2. 游戏首先设定2个角色,分别是10只草履虫和1只无颚鱼

3. 鱼和草履虫都可以向4个方向随机移动

4. 无鄂虫的最大移动距离为2(每次移动1或者2),草履虫的移动能力为1

5. 当两种生物移动到边缘时,自动向反方向移动

6. 无颚虫的体力初始值为100,草履虫体力无限;

7. 当无颚虫移动时,每移动一次,体力消耗1(无论移动1还是2)

8. 当无额虫吃了草履虫时,体力加20;

9. 当无颚虫体力为0或者草履虫数量为0时,游戏结束。

3.程序编写

3.1 import导入

# 导入random类
import random as rd

3.2 无颚鱼类的建立

  • 首先建立构造函数,在构造函数中对位置x,位置y,体力power进行初始化设定
  • 建立move函数,x或者y向进行随机移动,每次移动1,2,-1或者-2;并对是否到达边界进行判断;每移动一次,就减少1点体力
  • 建立eat函数,一旦吃到草履虫,则体力加20.
# 建立一个无颚虫的模型,并对其进行初始化
X_max = 8
X_min = 0
Y_max = 8
Y_min = 0
class WEC:
    def __init__(self):
        # 位置初始化
        self.posx = rd.randint(X_min,X_max)
        self.posy = rd.randint(Y_min,Y_max)
        # 能量初始化
        self.power = 100
    def move(self):
        new_x = self.posx
        new_y = self.posy
        axis_choice = rd.choice([0,1])
        if axis_choice == 0:
            new_x = self.posx + rd.choice([1,2,-1,-2])
        elif axis_choice == 1:
            new_y = self.posy + rd.choice([1,2,-1,-2])
        else:    
            print('无额虫的移动方向错误\n')
        # 辨识是否已经到达边界
        if new_x >= X_max:
            new_x = X_max 
        elif new_x <=0:
            new_x = 0 
        if new_y >= Y_max:
            new_y = 10 
        elif new_y <=Y_min:
            new_y = 0 
        self.power -= 1
        return(new_x,new_y)
    def eat(self):
        self.power += 20
        if self.power >=100:
            self.power = 100
        return self.power

3.3 草履虫类的建立

  • 首先建立构造函数,在构造函数中对位置x,位置y进行初始化设定
  • 建立move函数,x或者y向进行随机移动,每次移动1或者-1;并对是否到达边界进行判断
# 建立一个草履虫的模型,并对其进行初始化
class CaoLvChong:
    def __init__(self):
    # 位置初始化
        self.posx = rd.randint(X_min,X_max)
        self.posy = rd.randint(Y_min,Y_max)
    def move(self):
        new_x = self.posx
        new_y = self.posy
        axis_choice = rd.choice([0,1])
        if axis_choice == 0:
            new_x = self.posx + rd.choice([1,-1])
        elif axis_choice == 1:
            new_y = self.posy + rd.choice([1,-1])
        else:    
            print('无额虫的移动方向错误\n')
        # 辨识是否已经到达边界
        if new_x >= X_max:
            new_x = X_max 
        elif new_x <=X_min:
            new_x = X_min
        if new_y >= Y_max:
            new_y = Y_max 
        elif new_x <=Y_min:
            new_y = Y_min 
        return(new_x,new_y)

3.3 主循环的建立

  • 首先实例化无颚鱼对象;
  • 实例化10个草履虫对象,并形成一个队列
  • 建立一个主循环,在主循环中,判断循环跳出条件:
    • 条件1:草履虫队列为空,即所有草履虫均被吃掉;
    • 条件2:无颚鱼体力耗尽
  • 每经过一次循环,就在循环中判断一次,是否草履虫的位置和无颚鱼位置相同,如果相同则表示被无颚鱼吃掉,并且把该位置对应的鱼从队列中删除
  • 打印结果
# 实例化一个无颚虫模型
fish = WEC()
# 实例化10个草履虫
clc  = []
for i in range(10):
    clc.append(CaoLvChong())
count = 0 
while True:
    count = count + 10
    # 如果草履虫都被吃光了
    if not len(clc):
        print('草履虫被吃光了 !!!!')
        break
    # 如果鱼的体力光了
    if not fish.power:
        print('体力耗尽!!!')
        break
    fish_pos = fish.move()
    for each_clc in clc[:]:
        if each_clc.move() == fish_pos :
            fish.eat()
            clc.remove(each_clc)
            print('一个虫子被吃掉了')
print('可怜的无额鱼一共走了',count,'步')

3.4 程序运行结果

3.4.1 当把边界位置设定为[0,4]时

Python第五课----一个关于进化的Python游戏

3.4.2 当把边界位置设定为[0,8]时

Python第五课----一个关于进化的Python游戏

3.4.3 当把边界位置设定为[0,10]时

Python第五课----一个关于进化的Python游戏

4. 小结

本文主要将前期学习的知识进行了一个串联,通过建立一个简单的进化游戏对内容进行了复习,相关数据供大家批判指正。

 

上一篇:Linux_Redhat8 root密码重置


下一篇:Oracle的DQL