当前位置:首页 > JavaScript

js实现自动售卖机

2026-04-04 21:31:29JavaScript

实现自动售卖机的核心逻辑

自动售卖机的JavaScript实现需要模拟商品选择、投币、找零、库存管理等核心功能。以下是一个基础实现框架:

js实现自动售卖机

class VendingMachine {
  constructor() {
    this.products = {
      'A1': { name: '可乐', price: 3, stock: 5 },
      'A2': { name: '雪碧', price: 3, stock: 5 },
      'B1': { name: '矿泉水', price: 2, stock: 10 }
    };
    this.balance = 0;
    this.coins = [1, 2, 5]; // 支持的硬币面额
  }

  insertCoin(amount) {
    if (!this.coins.includes(amount)) {
      throw new Error('不支持该面额');
    }
    this.balance += amount;
    return this.balance;
  }

  selectProduct(code) {
    const product = this.products[code];
    if (!product) throw new Error('无效商品代码');
    if (product.stock <= 0) throw new Error('商品已售罄');
    if (this.balance < product.price) throw new Error('余额不足');

    product.stock--;
    const change = this.balance - product.price;
    this.balance = 0;
    return { product, change };
  }
}

界面交互实现

结合HTML创建基础交互界面:

js实现自动售卖机

<div id="vending-machine">
  <div class="display">余额: ¥<span id="balance">0</span></div>
  <div class="products">
    <div class="product" data-code="A1" data-price="3">
      <span>A1 - 可乐</span>
      <span>¥3</span>
    </div>
    <!-- 其他商品... -->
  </div>
  <div class="coin-buttons">
    <button data-amount="1">¥1</button>
    <button data-amount="2">¥2</button>
    <button data-amount="5">¥5</button>
  </div>
</div>
const machine = new VendingMachine();
const balanceDisplay = document.getElementById('balance');

document.querySelectorAll('.coin-buttons button').forEach(button => {
  button.addEventListener('click', () => {
    const amount = parseInt(button.dataset.amount);
    machine.insertCoin(amount);
    balanceDisplay.textContent = machine.balance;
  });
});

document.querySelectorAll('.product').forEach(product => {
  product.addEventListener('click', () => {
    try {
      const result = machine.selectProduct(product.dataset.code);
      alert(`已购买 ${result.product.name}, 找零 ¥${result.change}`);
      balanceDisplay.textContent = '0';
    } catch (error) {
      alert(error.message);
    }
  });
});

库存管理扩展

添加库存管理方法:

class VendingMachine {
  // ...原有代码...

  restock(code, quantity) {
    if (!this.products[code]) throw new Error('无效商品代码');
    this.products[code].stock += quantity;
  }

  getInventory() {
    return Object.entries(this.products).map(([code, item]) => ({
      code,
      ...item
    }));
  }
}

交易记录功能

添加交易历史记录:

class VendingMachine {
  constructor() {
    // ...原有属性...
    this.transactions = [];
  }

  selectProduct(code) {
    // ...原有逻辑...
    this.transactions.push({
      product: code,
      amount: product.price,
      timestamp: new Date()
    });
    return { product, change };
  }

  getTransactionHistory() {
    return [...this.transactions];
  }
}

测试用例示例

const testMachine = new VendingMachine();
testMachine.insertCoin(5);
const result = testMachine.selectProduct('A1');
console.log(result); // 应输出购买结果和找零2元
console.log(testMachine.getInventory()); // 检查库存变化

实现时可根据实际需求扩展功能,如支持纸币、网络支付、温度控制等功能。核心在于维护好状态管理(余额、库存)和正确处理各种边界情况(库存不足、余额不足等)。

标签: 售卖机js
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…