教你用Vue基础语法来写一个五子棋小游戏
1. 前言
本篇攻略将通过使用 Vue 基础语法实现一个简单的五子棋小游戏。这个项目不是一个完整可玩的游戏,它只是演示了使用Vue框架来实现五子棋的各种功能和思路。在这个过程中,你将了解到如何使用Vue开发一个复杂的项目。如果你是初学者,建议先学习 Vue 的基础语法再来实践本文内容。
2. 开始实现五子棋小游戏
首先,我们需要构建一个Vue程序。使用Vue-cli建立一个项目,或者在CodePen等在线编译器中开始编写代码。这里我们以 Vue-cli 为例:
# 安装脚手架
npm install -g vue-cli
# 创建一个基于 webpack 模板的新项目
vue init webpack my-project
# 安装依赖
cd my-project
npm install
在 src
目录下添加两个 vue 组件文件:
Board.vue
渲染游戏棋盘和监听用户的交互事件。Game.vue
完成游戏当前状态的渲染,并提供落子的方法。
<!-- Board.vue -->
<template>
<div class="board">
<div class="cell"
v-for="i in 15"
:key="i">
<div
class="row"
v-for="j in 15"
:key="'r'+i+j"
:class="{ 'cell-black': list.some(item => item.x === i && item.y === j && item.type === 1), 'cell-white': list.some(item => item.x === i && item.y === j && item.type === 2) }"
@click="handleClick(i, j)"></div>
</div>
</div>
</template>
<script>
export default {
name: 'Board',
props: {
list: {
type: Array,
default: () => []
}
},
methods: {
handleClick(row, col) {
this.$emit('click', row, col);
}
}
}
</script>
<style>
.board {
width: 630px;
height: 630px;
display: flex;
flex-wrap: wrap;
border: 2px solid #777;
}
.cell {
width: 42px;
height: 42px;
box-sizing: border-box;
border: 1px solid #777;
cursor: pointer;
position: relative;
&.cell-black::before {
content: '';
position: absolute;
width: 20px;
height: 20px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
background-color: black;
}
&.cell-white::before {
content: '';
position: absolute;
width: 20px;
height: 20px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
background-color: white;
}
}
.row {
width: 40px;
height: 40px;
box-sizing: border-box;
}
</style>
<!-- Game.vue -->
<template>
<div class="game">
<board
:list="list"
@click="handleClick"/>
<div class="info">
<div>{{message}}</div>
<button @click="handleReset">重新开始</button>
</div>
</div>
</template>
<script>
import Board from '@/components/Board';
export default {
name: 'Game',
components: { Board },
data() {
return {
list: [],
message: '',
current: 1
}
},
methods: {
handleClick(row, col) {
//判断是否存在这个点
if (this.list.some(item => item.x === row && item.y === col )) {
return;
}
// 更新落子状态类
this.list.push({
x: row,
y: col,
type: this.current
})
// 翻转落子状态
this.current = this.current === 1 ? 2 : 1;
// 判断胜利条件: 行、列、对角线
if (this.checkWin(row, col)) {
this.message = this.current === 1 ? '黑方胜利' : '白方胜利';
}
},
// 判断胜利条件
checkWin(row, col) {
const x = row;
const y = col;
const list = this.list;
const count = this.current; // 红子和黄子
let rowCounter = 0;
let colCounter = 0;
let diagonalCounter = 0;
let oDiagonalCounter = 0;
// 判断行
for (let i = x - 4; i <= x; i++) {
if (list.some(item => item.x === i && item.y === y && item.type === count)) {
rowCounter++;
}
}
// 判断列
for (let j = y - 4; j <= y; j++) {
if (list.some(item => item.x === x && item.y === j && item.type === count)) {
colCounter++;
}
}
// 判断左上角到右下角斜线 /
for (let k = 4; k >= -4; k--) {
if (list.some(item => item.x === x + k && item.y === y + k && item.type === count)) {
diagonalCounter++;
}
}
// 判断右上角到左下角斜线 \
for (let l = 4; l >= -4; l--) {
if (list.some(item => item.x === x - l && item.y === y + l && item.type === count)) {
oDiagonalCounter++;
}
}
return rowCounter === 5 || colCounter === 5 || diagonalCounter === 5 || oDiagonalCounter === 5;
},
handleReset() {
this.current = 1;
this.list = [];
this.message = '';
}
}
}
</script>
<style>
.game {
width: 630px;
margin: 30px auto;
padding: 20px;
background-color: #eee;
border-radius: 10px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.info {
margin-top: 20px;
display: flex;
justify-content: center;
align-items: center;
}
</style>
在 App.vue
文件中引入 Game
即可。
<!-- App.vue -->
<template>
<div id="app">
<Game />
</div>
</template>
<script>
import Game from './components/Game';
export default {
name: 'App',
components: {
Game
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
}
</style>
至此,我们完成了五子棋小游戏的大体呈现。接下来就可以试着打开预览网页了。
3. 运行Vue项目
在 my-project
目录下运行如下命令启动Web服务器:
npm run dev
在浏览器中打开 http://localhost:8080 即可看到五子棋游戏界面。
4. 示例说明
4.1. 在棋盘任意位置落子
你可以通过通过点击游戏棋盘上的任意一个格子,来进行落子。如果该格子已经有落子则无法落子。
<!-- Board.vue -->
<template>
<div class="board">
<div class="cell"
v-for="i in 15"
:key="i">
<div
class="row"
v-for="j in 15"
:key="'r'+i+j"
:class="{ 'cell-black': list.some(item => item.x === i && item.y === j && item.type === 1), 'cell-white': list.some(item => item.x === i && item.y === j && item.type === 2) }"
@click="handleClick(i, j)"></div>
</div>
</div>
</template>
<script>
export default {
name: 'Board',
props: {
list: {
type: Array,
default: () => []
}
},
methods: {
handleClick(row, col) {
this.$emit('click', row, col);
}
}
}
</script>
4.2. 判断胜利条件
游戏需要有胜利条件判断和显示,这里简单地判断胜利条件是该列或该行或该斜线连续的五个棋子颜色与当前落子颜色一致。
<!-- Game.vue -->
<template>
<div class="game">
<board
:list="list"
@click="handleClick"/>
<div class="info">
<div>{{message}}</div>
<button @click="handleReset">重新开始</button>
</div>
</div>
</template>
<script>
import Board from '@/components/Board';
export default {
name: 'Game',
components: { Board },
data() {
return {
list: [],
message: '',
current: 1
}
},
methods: {
handleClick(row, col) {
//判断是否存在这个点
if (this.list.some(item => item.x === row && item.y === col )) {
return;
}
// 更新落子状态类
this.list.push({
x: row,
y: col,
type: this.current
})
// 翻转落子状态
this.current = this.current === 1 ? 2 : 1;
// 判断胜利条件: 行、列、对角线
if (this.checkWin(row, col)) {
this.message = this.current === 1 ? '黑方胜利' : '白方胜利';
}
},
// 判断胜利条件
checkWin(row, col) {
const x = row;
const y = col;
const list = this.list;
const count = this.current; // 红子和黄子
let rowCounter = 0;
let colCounter = 0;
let diagonalCounter = 0;
let oDiagonalCounter = 0;
// 判断行
for (let i = x - 4; i <= x; i++) {
if (list.some(item => item.x === i && item.y === y && item.type === count)) {
rowCounter++;
}
}
// 判断列
for (let j = y - 4; j <= y; j++) {
if (list.some(item => item.x === x && item.y === j && item.type === count)) {
colCounter++;
}
}
// 判断左上角到右下角斜线 /
for (let k = 4; k >= -4; k--) {
if (list.some(item => item.x === x + k && item.y === y + k && item.type === count)) {
diagonalCounter++;
}
}
// 判断右上角到左下角斜线 \
for (let l = 4; l >= -4; l--) {
if (list.some(item => item.x === x - l && item.y === y + l && item.type === count)) {
oDiagonalCounter++;
}
}
return rowCounter === 5 || colCounter === 5 || diagonalCounter === 5 || oDiagonalCounter === 5;
},
handleReset() {
this.current = 1;
this.list = [];
this.message = '';
}
}
}
</script>
以上就是示例内容的讲解,理论上你可以通过将以上代码拷贝至对应文件再运行应该就可以看到效果了。当然最好自己手动敲一遍来加深理解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:教你用Vue基础语法来写一个五子棋小游戏 - Python技术站