• 从零开始学Vue3--井字棋


    简介

    今天的教程是一个综合案例,在这个案例中你将学会如何创建组件,如何监听事件,如何在组件间传值,如何定义计算属性,如何循环渲染,如何条件渲染等

    1.生成棋盘

    井字棋一共九个格子,我们先定义一个组件Square.vue生成格子

    1. <script setup>
    2. // 使用 <script setup>
    3. defineProps({
    4. value: [String, Number]
    5. })
    6. script>
    7. <style scoped>
    8. .square {
    9. background: #fff;
    10. border: 1px solid #999;
    11. float: left;
    12. font-size: 24px;
    13. font-weight: bold;
    14. line-height: 34px;
    15. height: 34px;
    16. margin-right: -1px;
    17. margin-top: -1px;
    18. padding: 0;
    19. text-align: center;
    20. width: 34px;
    21. }
    22. style>

    再定义一个棋盘组件Board用来生成棋盘

    1. <script setup>
    2. import Square from "@/views/basic/Square.vue";script>
    3. <style scoped>
    4. .board-row:after {
    5. clear: both;
    6. content: '';
    7. display: table;
    8. }
    9. style>

    效果如下

    2.点击生成X

    我们定义一个squares数组,初始值都是null,每次点击的时候把对应值置为X,就能实现点击后格子显示X

    <Square :value="squares[(x-1) * 3 + y - 1]" @click="clickSquare((x-1) * 3 + y - 1)">Square>
    1. import { reactive } from 'vue'
    2. // 初始化棋盘数据
    3. const squares = reactive(new Array(9).fill(null))
    4. // 点击格子事件
    5. function clickSquare(index) {
    6. squares[index] = 'X'
    7. }

    3.轮流下棋

    第一个点击是X,第二个点击是圈,需要加下判断

    1. let clickCount = 0
    2. // 点击格子事件
    3. function clickSquare(index) {
    4. // 格子中有值不能被覆盖
    5. if (squares[index]) return
    6. // 轮流落子
    7. if (clickCount % 2 == 0) {
    8. squares[index] = 'X'
    9. } else {
    10. squares[index] = 'O'
    11. }
    12. clickCount++
    13. }

    4.判断输赢

    通过calculateWinner函数来判断优胜者,完整代码如下

    1. <script setup>
    2. import Square from "@/views/basic/Square.vue";
    3. import {computed, reactive, ref} from 'vue'
    4. // 初始化棋盘数据
    5. const squares = reactive(new Array(9).fill(null))
    6. let clickCount = ref(0)
    7. let winner = ref(null)
    8. // 点击格子事件
    9. function clickSquare(index) {
    10. // 格子中有值或者存在优胜者则返回
    11. if (squares[index] || winner.value) return
    12. // 轮流落子
    13. if (clickCount.value % 2 == 0) {
    14. squares[index] = 'X'
    15. } else {
    16. squares[index] = 'O'
    17. }
    18. winner.value = calculateWinner(squares)
    19. clickCount.value++
    20. }
    21. // 计算属性,通过clickCount计算出下个旗手
    22. const nextPlayer = computed(() => {
    23. return clickCount.value % 2 == 0 ? 'X' : 'O'
    24. })
    25. function calculateWinner(squares) {
    26. const lines = [
    27. [0, 1, 2],
    28. [3, 4, 5],
    29. [6, 7, 8],
    30. [0, 3, 6],
    31. [1, 4, 7],
    32. [2, 5, 8],
    33. [0, 4, 8],
    34. [2, 4, 6]
    35. ];
    36. for (let i = 0; i < lines.length; i++) {
    37. const [a, b, c] = lines[i];
    38. if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
    39. return squares[a];
    40. }
    41. }
    42. return null;
    43. }
    44. script>
    45. <style scoped>
    46. .container {
    47. display: flex;
    48. }
    49. .board-row:after {
    50. clear: both;
    51. content: '';
    52. display: table;
    53. }
    54. style>

  • 相关阅读:
    【八股】Java基础、集合、JVM
    go 中解析JSON的三种姿势
    使用shiny包制作自动化树状图
    算法——查找算法
    final修饰的变量必须初始化吗?
    二叉树常见问题
    前端自动化构建-Gulp实现前端插件开发
    【广州华锐互动】利用VR开展高压电缆运维实训,提供更加真实、安全的学习环境
    自动驾驶--定位技术
    人机交互——对话管理
  • 原文地址:https://blog.csdn.net/ting4937/article/details/139300587