JS经典继承案例----宠物游戏

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script src="./simba.js"></script>
    <script src="./util.js"></script>
    <script>
        //类
        function User(nickname, pwd) {
            this.nickname = nickname
            this.pwd = pwd
        }

        function Pet(nickname, gender, state, owner) {
            this.nickname = nickname
            this.gender = gender
            this.state = state
            this.owner = owner
        }
        function Dog(nickname, gender, state, owner) {
            Pet.call(this, nickname, gender, state, owner)


            this.introduceSelf = function () {
                console.log(`
                    你的骨头就是我的骨头,我叫${this.nickname}
                    我是个${fmtGender(this.gender)}孩子
                    我的状态值目前是${this.state}
                    我的召唤师叫${this.owner}
                `);
            }

            this.eat = _.throttling(function () {
                console.log(this.nickname + '吃骨头咯~');
                this.state += 20
            }, 3000)

            this.play = function () {
                console.log(this.nickname + '玩飞盘去咯~');
                this.state += 10
            }
        }
        function Cat(nickname, gender, state, owner) {
            Pet.call(this, nickname, gender, state, owner)

            this.introduceSelf = function () {
                console.log(`
                    虱子如风常伴吾身,我叫${this.nickname}
                    我是个${fmtGender(this.gender)}孩子
                    我的状态值目前是${this.state}
                    我的召唤师叫${this.owner}
                `);
            }

            this.eat = _.throttling(function () {
                console.log(this.nickname + '吃烤鱼咯~');
                this.state += 15
            }, 6000)

            this.play = function () {
                console.log(this.nickname + '玩猫球去咯~');
                this.state += 8
            }
        }
        let pet = new Pet()
        Dog.prototype = pet
        Cat.prototype = pet

        let game = {
            service: {
                loginUser: "",
                userList: [
                    new User('ace', '123123')
                ],
                petList: [],
                sensitiveWords: ['TMD', 'QNM', 'CNM'],
                getMyPetInfo() {
                    return this.petList.find(r => r.owner === this.loginUser)
                },
                register(nickname, pwd) {
                    let user = new User(nickname, pwd)
                    this.userList.push(user)
                },
                registerPet(nickname, type, gender) {
                    let pet = null
                    switch (type) {
                        case '1':
                            pet = new Dog(nickname, gender, 80, this.loginUser)
                            break;
                        case '2':
                            pet = new Cat(nickname, gender, 80, this.loginUser)
                            break;
                    }
                    this.petList.push(pet)
                },
                login(nickname, pwd) {
                    return this.userList.some(r => _.eq(r.nickname, nickname) && _.eq(r.pwd, pwd))
                },
                checkUserHasPet() {
                    return this.petList.some(r => _.eq(r.owner, this.loginUser))
                },
                checkUserRepeat(nickname) {
                    return this.userList.some(r => _.eq(r.nickname, nickname))
                },
                checkSensitiveWords(str) {
                    return this.sensitiveWords.includes(str)
                }
            },
            showBuyPetPage() {
                if (this.service.checkUserHasPet()) {
                    console.log('您已经拥有一只宠物了,请好好珍惜');
                    return this.showMainPage()
                }
                let nickname = '', type = '', gender = ''
                let isValidNickName = false,
                    isValidType = false,
                    isValidGender = false
                do {
                    type = _.trim(prompt('请选择宠物类型: 1.狗  2.猫'))
                    isValidType = ['1', '2'].includes(type)
                    if (!isValidType)
                        console.log('类型输入有误!');
                } while (!isValidType);

                do {
                    nickname = _.trim(prompt('请输入宠物昵称'))
                    isValidNickName = _.checkStrHasVal(nickname)
                    if (!isValidNickName)
                        console.log('昵称不能为空...');

                    if (this.service.checkSensitiveWords(nickname)) {
                        isValidNickName = false
                        console.log('昵称不能包含敏感词汇');
                    }

                } while (!isValidNickName);

                do {
                    gender = _.trim(prompt('请选择宠物性别: 1.GG  2.MM'))
                    isValidGender = ['1', '2'].includes(gender)
                    if (!isValidGender)
                        console.log('性别输入有误!');
                } while (!isValidGender);

                this.service.registerPet(nickname, type, gender)

                this.showMainPage()
            },
            showPetDetailPage() {
                let mypet = this.service.getMyPetInfo()
                if (mypet) {
                    mypet.introduceSelf()
                    this.showGamePage(mypet)
                } else
                    console.log('您还没有宠物,快去领养一只吧~')

                this.showMainPage()
            },
            showGamePage(pet) {
                let res = prompt('请选择操作:1.喂食  2.逗TA玩 3.返回')
                switch (res) {
                    case '1':
                        pet.eat()
                        break;
                    case '2':
                        pet.play()
                        break;
                    case '3':
                        break;
                    default:
                        console.log('输入有误,请重新输入');
                        arguments.callee.call(this, pet)
                        break;
                }

                pet.introduceSelf()
            },
            showLoginPage() {
                let nickname = '', pwd = ''
                let isValidNickName = false,
                    isValidPwd = false
                do {
                    nickname = _.trim(prompt('请输入昵称'))
                    isValidNickName = _.checkStrHasVal(nickname)
                    if (!isValidNickName)
                        console.log('昵称不能为空...');
                } while (!isValidNickName);

                do {
                    pwd = _.trim(prompt('请输入密码'))
                    isValidPwd = _.checkStrHasVal(pwd, 6)
                    if (!isValidPwd)
                        console.log('密码不能为空...');
                } while (!isValidPwd);

                if (this.service.login(nickname, pwd)) {
                    console.log('登录成功');
                    this.service.loginUser = nickname
                    this.showMainPage()
                } else {
                    console.log('用户名或密码错误');
                    arguments.callee.call(this)
                }
            },
            showMainPage() {
                let result = prompt('欢迎' + this.service.loginUser + ',请选择操作:1.领养宠物  2.查看宠物  3.注销')
                switch (result) {
                    case '1':
                        this.showBuyPetPage()
                        break;
                    case '2':
                        this.showPetDetailPage()
                        break;
                    case '3':
                        this.service.loginUser = ''
                        this.showWelcomePage()
                        break;
                    default:
                        console.log('输入有误,请重新输入');
                        arguments.callee.call(this)
                        break;
                }
            },
            showRegisterPage() {
                let nickname = '', pwd = '', c_pwd = ''
                let isValidNickName = false,
                    isValidPwd = false,
                    isValidCPwd = false
                do {
                    nickname = _.trim(prompt('请输入昵称'))
                    isValidNickName = _.checkStrHasVal(nickname)
                    if (!isValidNickName)
                        console.log('昵称不能为空...');

                    if (this.service.checkUserRepeat(nickname)) {
                        isValidNickName = false
                        console.log('昵称已存在');
                    }

                    if (this.service.checkSensitiveWords(nickname)) {
                        isValidNickName = false
                        console.log('昵称不能包含敏感词汇');
                    }

                } while (!isValidNickName);

                do {
                    pwd = _.trim(prompt('请输入密码'))
                    isValidPwd = _.checkStrLength(pwd, 6)
                    if (!isValidPwd)
                        console.log('密码长度不能小于6位...');
                } while (!isValidPwd);

                do {
                    c_pwd = _.trim(prompt('请输入密码'))
                    isValidCPwd = _.eq(pwd, c_pwd)
                    if (!isValidCPwd)
                        console.log('两次密码不一致...');
                } while (!isValidCPwd);

                this.service.register(nickname, pwd)

                this.showWelcomePage()

            },
            showWelcomePage() {
                let result = prompt('欢迎来到MYPET,请选择操作:1.登录  2.注册  3.关闭')
                switch (result) {
                    case '1':
                        this.showLoginPage()
                        break;
                    case '2':
                        this.showRegisterPage()
                        break;
                    case '3':
                        console.log('已关闭');
                        break;
                    default:
                        console.log('输入有误,请重新输入');
                        arguments.callee.call(this)
                        break;
                }
            }
        }

        game.showWelcomePage()

    </script>
</body>

</html>

案例中引入JS封装代码段

let _ = {
    eq(a, b) {
        return a === b
    },
    throttle(fn, wait) {
        let endTime = +new Date
        return function () {
            if (+new Date - endTime < wait) {
                return;
            }
            fn.apply(this, arguments)
            endTime = +new Date
        }
    },
    trim(str) {
        if (!str) return ''
        return str.trim()
    },
    isOdd(val) {
        return val % 2 !== 0
    },
    isEven(val) {
        return !this.isOdd(val)
    },
    checkStrNullOrEmpty(str) {
        return !str || str.trim() === ''
    },
    checkStrHasVal(str) {
        return !this.checkStrNullOrEmpty(str)
    },
    checkStrLength(str, len) {
        return str && str.trim().length >= len
    },
    setCookie(key, val, expires) {
        if (typeof val === 'object')
            val = JSON.stringify(val)
        let now = new Date()
        now.setMinutes(now.getMinutes() + expires)
        document.cookie = `${key}=${encodeURI(val)};expires=${now.toUTCString()}`
    },
    removeCookie(key) {
        this.setCookie(key, null, -1)
    },
    getCookie(key) {
        let obj = {}
        document.cookie.split('; ').forEach(r => {
            let kv = r.split('=')
            obj[kv[0]] = decodeURI(kv[1])
        })
        if (key) {
            let res = null
            try {
                res = JSON.parse(obj[key])
            } catch (error) {
                res = obj[key]
            } finally {
                return res
            }
        }
        return obj
    },
    keys(obj) {
        let arr = []
        for (const key in obj) {
            arr.push(key)
        }
        return arr
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值