最近在学习Python,发现一个学习面向对象开发很好的例子,于是用js实现了一遍,下面是源码,有兴趣的同学可以看下:
// 老王开枪
/**
* @desc 人类
*/
class Person {
constructor(name) {
this.name = name
this.gun = null
this.hp = 100
}
// 安装子弹
anzhuangZidan(danjia, zidan) {
danjia.saveZidan(zidan)
}
// 安装弹夹
anzhuangDanjia(ak47, danjia) {
ak47.saveDanjia(danjia)
}
// 拿枪
naqiang(gun) {
this.gun = gun
}
// 扣扳机
koubanjia(laosong) {
this.gun.fire(laosong)
}
// 掉血
diaoxue(shashangli) {
this.hp -= shashangli
}
// 测试信息
test() {
return this.gun
? `${this.name}的血量是${this.hp}, 有枪, ${this.gun.test()}`
: this.hp
? `${this.name}的血量是${this.hp}, 没有枪`
: `${this.name}挂了....`
}
}
/**
* @desc 枪类
*/
class Gun {
constructor(name) {
this.name = name
this.danjia = null
}
// 将弹夹安装到枪上
saveDanjia(danjia) {
this.danjia = danjia
}
// 开火
fire(laosong) {
var zidanObj = this.danjia.tanchuDanjia(laosong)
if (!zidanObj) {
return '没有子弹了'
}
zidanObj.jizhong(laosong)
}
// 测试信息
test() {
return `枪的信息是: ${this.name}, ${this.danjia.test()}`
}
}
/**
* @desc 弹夹类
*/
class Danjia {
constructor(max_num) {
this.max_num = max_num
this.zidanList = []
}
// 将子弹安装到弹夹
saveZidan(zidan) {
this.zidanList.push(zidan)
}
// 弹出最上面的子弹
tanchuDanjia(laosong) {
return this.zidanList ? this.zidanList.pop() : null
}
// 测试信息
test() {
return this.zidanList.length
? `弹夹的信息是: ${this.zidanList.length} / ${this.max_num}`
: `没有子弹了`
}
}
/**
* @desc 子弹类
*/
class Zidan {
constructor(shashangli) {
this.shashangli = shashangli
}
// 击中敌人
jizhong(laosong) {
laosong.diaoxue(this.shashangli)
}
}
// 1. 创建一个老王
var laowang = new Person('老王')
// 2. 创建一杆枪
var ak47 = new Gun('AK47')
// 3. 创建一个弹夹
var danjia = new Danjia(20)
// 安装一些子弹
for (let i = 0; i < 10; i++) {
// 4. 创建一些子弹
var zidan = new Zidan(10)
// 5. 老王向弹夹中安装子弹
laowang.anzhuangZidan(danjia, zidan)
}
// 6. 老王将弹夹安装到枪上
laowang.anzhuangDanjia(ak47, danjia)
// 7. 老王拿枪
laowang.naqiang(ak47)
// 8. 创建敌人老宋
laosong = new Person('老宋')
// 9. 老王扣扳机打老宋
for (let i = 0; i < 10; i++) {
laowang.koubanjia(laosong)
console.log(laowang.test())
console.log(laosong.test())
}
Python写法:
# -*- coding: utf-8 -*-
class Person:
def __init__(self, name):
self.name = name
self.gun = None
self.hp = 100
def anzhuang_zidan(self, danjia, zidan):
danjia.save_zidan(zidan)
def anzhuang_danjia(self, gun, danjia):
gun.save_danjia(danjia)
def naqiang(self, gun):
self.gun = gun
def kou_ban_ji(self, diren):
self.gun.fire(diren)
def diaoxue(self, sha_shang_li):
self.hp -= sha_shang_li
def __str__(self):
if self.gun:
return '%s的血量是%d, 他有枪,%s' % (self.name, self.hp, self.gun)
else:
if self.hp >= 0:
return '%s的血量是%d, 没有枪' % (self.name, self.hp)
else:
return '%s挂了。。。' % self.name
class Gun:
def __init__(self, name):
self.name = name
self.danjia = None
def save_danjia(self, danjia):
self.danjia = danjia
def fire(self, diren):
zidan_temp = self.danjia.tanchu_zidan(diren)
if zidan_temp:
zidan_temp.jizhong(diren)
else:
print('没有子弹了')
def __str__(self):
return '枪的信息是%s, %s' % (self.name, self.danjia)
class Danjia:
def __init__(self, max_num):
self.max_num = max_num
self.zidan_list = []
def save_zidan(self, zidan):
self.zidan_list.append(zidan)
def tanchu_zidan(self, diren):
if self.zidan_list:
return self.zidan_list.pop()
else:
return None
def __str__(self):
if self.zidan_list:
return '弹夹的信息是:%d/%d' % (len(self.zidan_list), self.max_num)
else:
return '没有子弹了'
class Zidan:
def __init__(self, sha_shang_li):
self.sha_shang_li = sha_shang_li
def jizhong(self, diren):
diren.diaoxue(self.sha_shang_li)
# 老王开枪
def main():
# 1. 创建一个老王
laowang = Person('老王')
# 2. 创建一杆枪
ak47 = Gun('ak47')
# 3. 创建一个弹夹
danjia = Danjia(20)
for i in range(0, 15):
# 4. 创建一些子弹
zidan = Zidan(10)
# 5. 让老王把子弹装进弹夹
laowang.anzhuang_zidan(danjia, zidan)
# 6. 让老王把弹夹装到抢里
laowang.anzhuang_danjia(ak47, danjia)
# 7. 老王拿起枪
laowang.naqiang(ak47)
# 8. 创建一个敌人老宋
laosong = Person('老宋')
for i in range(0, 11):
# 9. 老王扣扳机
laowang.kou_ban_ji(laosong)
print(laowang)
print(laosong)
if __name__ == '__main__':
main()