diff --git a/.pnp.cjs b/.pnp.cjs index 908eb4c..34ee2ab 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -37,6 +37,7 @@ const RAW_RUNTIME_STATE = ["eslint-plugin-vue", "virtual:7d6457be6b857bdb44066d1c6f9d2471ca71cf43c0df847ead5ae9289c5e9f98de3a67668fdd588c95fcb212da2ba4f12a34babd1f52380566b5d7bf44a88ca5#npm:10.0.0"],\ ["jiti", "npm:2.4.2"],\ ["npm-run-all2", "npm:7.0.2"],\ + ["peerjs", "npm:1.5.4"],\ ["pinia", "virtual:7d6457be6b857bdb44066d1c6f9d2471ca71cf43c0df847ead5ae9289c5e9f98de3a67668fdd588c95fcb212da2ba4f12a34babd1f52380566b5d7bf44a88ca5#npm:3.0.2"],\ ["prettier", "npm:3.5.3"],\ ["typescript", "patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5"],\ @@ -1001,6 +1002,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@msgpack/msgpack", [\ + ["npm:2.8.0", {\ + "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/@msgpack-msgpack-npm-2.8.0-c4768c71d4-10c0.zip/node_modules/@msgpack/msgpack/",\ + "packageDependencies": [\ + ["@msgpack/msgpack", "npm:2.8.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@nodelib/fs.scandir", [\ ["npm:2.1.5", {\ "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/@nodelib-fs.scandir-npm-2.1.5-89c67370dd-10c0.zip/node_modules/@nodelib/fs.scandir/",\ @@ -2107,6 +2117,7 @@ const RAW_RUNTIME_STATE = ["eslint-plugin-vue", "virtual:7d6457be6b857bdb44066d1c6f9d2471ca71cf43c0df847ead5ae9289c5e9f98de3a67668fdd588c95fcb212da2ba4f12a34babd1f52380566b5d7bf44a88ca5#npm:10.0.0"],\ ["jiti", "npm:2.4.2"],\ ["npm-run-all2", "npm:7.0.2"],\ + ["peerjs", "npm:1.5.4"],\ ["pinia", "virtual:7d6457be6b857bdb44066d1c6f9d2471ca71cf43c0df847ead5ae9289c5e9f98de3a67668fdd588c95fcb212da2ba4f12a34babd1f52380566b5d7bf44a88ca5#npm:3.0.2"],\ ["prettier", "npm:3.5.3"],\ ["typescript", "patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5"],\ @@ -2765,6 +2776,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["eventemitter3", [\ + ["npm:4.0.7", {\ + "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/eventemitter3-npm-4.0.7-7afcdd74ae-10c0.zip/node_modules/eventemitter3/",\ + "packageDependencies": [\ + ["eventemitter3", "npm:4.0.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["execa", [\ ["npm:9.5.2", {\ "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/execa-npm-9.5.2-f74ad877bc-10c0.zip/node_modules/execa/",\ @@ -3951,6 +3971,28 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["peerjs", [\ + ["npm:1.5.4", {\ + "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/peerjs-npm-1.5.4-b1f39eb912-10c0.zip/node_modules/peerjs/",\ + "packageDependencies": [\ + ["peerjs", "npm:1.5.4"],\ + ["@msgpack/msgpack", "npm:2.8.0"],\ + ["eventemitter3", "npm:4.0.7"],\ + ["peerjs-js-binarypack", "npm:2.1.0"],\ + ["webrtc-adapter", "npm:9.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["peerjs-js-binarypack", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/peerjs-js-binarypack-npm-2.1.0-59ed32add7-10c0.zip/node_modules/peerjs-js-binarypack/",\ + "packageDependencies": [\ + ["peerjs-js-binarypack", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["perfect-debounce", [\ ["npm:1.0.0", {\ "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/perfect-debounce-npm-1.0.0-0968810009-10c0.zip/node_modules/perfect-debounce/",\ @@ -4226,6 +4268,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["sdp", [\ + ["npm:3.2.0", {\ + "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/sdp-npm-3.2.0-b1a5f85233-10c0.zip/node_modules/sdp/",\ + "packageDependencies": [\ + ["sdp", "npm:3.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["semver", [\ ["npm:6.3.1", {\ "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/semver-npm-6.3.1-bcba31fdbe-10c0.zip/node_modules/semver/",\ @@ -4959,6 +5010,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["webrtc-adapter", [\ + ["npm:9.0.3", {\ + "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/webrtc-adapter-npm-9.0.3-9d13b6cc5b-10c0.zip/node_modules/webrtc-adapter/",\ + "packageDependencies": [\ + ["webrtc-adapter", "npm:9.0.3"],\ + ["sdp", "npm:3.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["which", [\ ["npm:2.0.2", {\ "packageLocation": "../../../../AppData/Local/Yarn/Berry/cache/which-npm-2.0.2-320ddf72f7-10c0.zip/node_modules/which/",\ diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 5901c86..1899a67 100644 Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ diff --git a/README.md b/README.md index bf32480..4f5e691 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,161 @@ -# . +

+ Arithma Battle Logo +

-This template should help get you started developing with Vue 3 in Vite. +# Arithma Battle -## Recommended IDE Setup +基于Vue.js的心算竞技场 | 实时对战PK × 渐进式训练 -[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). +✓ 成绩追踪 -## Type Support for `.vue` Imports in TS +📊 使用Vue.js构建的网页端数学训练平台,融合游戏化设计,支持多难度级别、排行榜、响应式布局,适合教育与娱乐场景。 -TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types. +🚀 通过组件化开发实现高效交互,后续计划扩展社交分享与成就系统。 -## Customize configuration +## 项目概述 -See [Vite Configuration Reference](https://vite.dev/config/). +ArithmaBattle 是一款基于网页的交互式心算训练与竞技平台,旨在通过趣味PK模式和单机练习模式提升用户的计算速度和数学能力。 -## Project Setup +### 核心功能: -```sh -yarn -``` +- 实时对战模式(支持加减乘除运算) +- 多难度级别适应不同年龄段用户 +- 成绩追踪系统记录进步轨迹 +- 响应式设计适配各种设备 -### Compile and Hot-Reload for Development +### 项目特色: +- ✓ 将数学练习与游戏对战完美结合 +- ✓ 单人训练与多人PK双模式 +- ✓ 竞技机制激发学习动力 +- ✓ 简洁直观的用户界面 +- ✓ 适合课堂教学或家庭娱乐 -```sh +无论是想提升计算能力的学生,还是喜欢数字游戏的爱好者,都能在这里找到挑战乐趣。 + +## 在线演示 + +[![Demo](https://img.shields.io/badge/demo-online-green)](https://ab.co1d.in) + +上述链接为演示部署版本。 + +## 技术栈 + +- 前端框架:Vue.js +- UI组件:自定义组件 +- 状态管理:Vuex +- 路由管理:Vue Router +- 构建工具:Vite +- CSS预处理:SCSS/LESS +- 响应式设计:Flexbox/Grid + +## 安装与运行 + +### 前提条件 +- Node.js (v14.0+) +- npm 或 yarn + +### 安装步骤 + +```bash +# 克隆仓库 +git clone https://github.com/Coldin04/ArithmaBattle.git + +# 进入项目目录 +cd ArithmaBattle + +# 安装依赖 +yarn install + +# 启动开发服务器 yarn dev ``` -### Type-Check, Compile and Minify for Production +### 构建生产版本 + +```bash -```sh yarn build ``` -### Lint with [ESLint](https://eslint.org/) +## 项目结构 -```sh -yarn lint ``` +ArithmaBattle/ +├── public/ # 静态资源目录 +│ ├── favicon.ico # 网站图标 +│ └── index.html # HTML入口文件 +├── src/ # 源代码目录 +│ ├── assets/ # 资源文件(图片、音效等) +│ ├── components/ # 组件目录 +│ │ ├── common/ # 通用组件 +│ │ │ ├── Button.vue +│ │ │ └── Modal.vue +│ │ ├── game/ # 游戏相关组件 +│ │ │ ├── ProblemDisplay.vue # 数学题目显示 +│ │ │ ├── Timer.vue # 计时器组件 +│ │ │ ├── ScoreBoard.vue # 得分板组件 +│ │ │ └── AnswerInput.vue # 答案输入组件 +│ │ └── layout/ # 布局组件 +│ │ ├── Header.vue +│ │ └── Footer.vue +│ ├── views/ # 页面视图组件 +│ │ ├── Home.vue # 首页 +│ │ ├── Practice.vue # 练习模式 +│ │ ├── Battle.vue # 对战模式 +│ │ ├── Profile.vue # 用户资料 +│ │ └── Leaderboard.vue # 排行榜 +│ ├── router/ # 路由配置 +│ │ └── index.js +│ ├── store/ # Vuex状态管理 +│ │ ├── index.js +│ │ └── modules/ # 状态模块 +│ │ ├── game.js +│ │ └── user.js +│ ├── styles/ # 全局样式文件 +│ │ ├── variables.scss +│ │ └── global.scss +│ ├── utils/ # 工具函数 +│ │ ├── arithmetic.js # 数学运算生成 +│ │ └── storage.js # 本地存储处理 +│ ├── App.vue # 根组件 +│ └── main.js # 应用入口 +├── .gitignore # Git忽略配置 +├── package.json # 项目依赖与脚本 +├── vite.config.js # Vite配置 +└── README.md # 项目说明文档 +``` + +## 功能展示 + +![练习模式](./screenshots/practice-mode.png) + +![对战模式](./screenshots/battle-mode.png) + +## 贡献指南 + +欢迎对ArithmaBattle项目做出贡献!请按照以下步骤参与: + +1. Fork本仓库 +2. 创建您的特性分支 (`git checkout -b feature/AmazingFeature`) +3. 提交您的更改 (`git commit -m 'Add some AmazingFeature'`) +4. 推送到分支 (`git push origin feature/AmazingFeature`) +5. 开启一个Pull Request + +## 开发计划 + +- [ ] 添加更多数学运算类型(如指数、开方等) +- [ ] 实现多人在线对战房间 +- [ ] 添加成就系统 +- [ ] 开发移动应用版本 +- [ ] 支持自定义题目难度 + +## 许可证 + +本项目采用MIT许可证 - 查看[LICENSE](LICENSE)文件了解详情 + +## 联系方式 + +项目维护者: Coldin04 - https://co1d.in + +项目链接: [https://github.com/yourusername/ArithmaBattle](https://github.com/Coldin04/ArithmaBattle) + diff --git a/package.json b/package.json index ec76464..71ce349 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "format": "prettier --write src/" }, "dependencies": { + "peerjs": "^1.5.4", "pinia": "^3.0.1", "vue": "^3.5.13", "vue-router": "^4.5.0" @@ -28,7 +29,7 @@ "eslint-plugin-vue": "~10.0.0", "jiti": "^2.4.2", "npm-run-all2": "^7.0.2", - "prettier": "3.5.3", + "prettier": "^3.5.3", "typescript": "~5.8.0", "vite": "^6.2.4", "vite-plugin-vue-devtools": "^7.7.2", diff --git a/public/favicon.ico b/public/favicon.ico index df36fcf..a85cc40 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/screenshots/battle-mode.png b/screenshots/battle-mode.png new file mode 100644 index 0000000..3135a0f Binary files /dev/null and b/screenshots/battle-mode.png differ diff --git a/screenshots/practice-mode.png b/screenshots/practice-mode.png new file mode 100644 index 0000000..2144985 Binary files /dev/null and b/screenshots/practice-mode.png differ diff --git a/src/App.vue b/src/App.vue index 7905b05..fc21914 100644 --- a/src/App.vue +++ b/src/App.vue @@ -5,16 +5,9 @@ import HelloWorld from './components/HelloWorld.vue'