HarmonyOS NEXT版五子棋游戏开发实战
创作时间:
作者:
@小白创作中心
HarmonyOS NEXT版五子棋游戏开发实战
引用
1
来源
1.
https://www.cnblogs.com/wgjava/p/18752138
本文将详细介绍如何使用HarmonyOS的ArkTS语言开发一个五子棋游戏。通过这个实战项目,你将掌握ArkUI框架的基本使用方法,包括状态管理、触摸事件处理和布局设计等核心技能。
五子棋游戏介绍
功能特性
- 使用15x15的标准棋盘
- 支持双人轮流下棋(黑棋先手)
- 自动判断胜负(任意方向五连即胜)
- 游戏结束提示
- 重新开始功能
- 触摸交互支持
视觉设计
- 黑色棋子代表玩家1
- 白色棋子代表玩家2
- 棕色(#CBA)棋盘背景
使用方法
- 点击棋盘格子下棋
- 当一方达成五连时弹出胜利提示
- 点击"重新开始"按钮重置游戏
游戏规则
- 黑棋先手,白棋后手,轮流下棋
- 棋子只能下在空白处
- 率先在横、竖、斜任意方向形成五连者获胜
- 游戏结束后需要点击重新开始才能开始新游戏
技术特点
- 使用Grid布局实现棋盘
- @State管理游戏状态
- TouchTarget处理触摸事件
- AlertDialog显示胜利提示
- Flex布局实现整体界面
- 二维数组存储棋盘状态
注意:在测试时使用的是模拟器,在真实设备运行时可能需要根据屏幕尺寸调整单元格大小(修改.width(30)和.height(30)的数值)以获得最佳显示效果。
五子棋游戏代码分析
这段代码实现了一个简单的五子棋游戏,使用了ArkTS(Ark TypeScript)语言。下面我将详细解释每个部分的功能,帮助你理解代码。
导入和声明
@Entry
@Component
struct GobangGame {
@Entry
和@Component
是装饰器,用于标记这是一个页面组件。struct GobangGame
定义了一个名为GobangGame
的结构体,表示五子棋游戏的主界面。
状态变量
@State board: number[][] = Array(15).fill(null).map(() => Array(15).fill(0))
@State currentPlayer: number = 1 // 1: 黑棋, 2: 白棋
@State gameOver: boolean = false
@State
表示这些变量是可变的状态。board
是一个15x15的二维数组,表示棋盘,初始值为0(空位),1表示黑棋,2表示白棋。currentPlayer
表示当前玩家,1为黑棋,2为白棋。gameOver
表示游戏是否结束。
构建UI
build() {
Column() {
// 游戏标题
Text(this.gameOver ? '游戏结束' : `当前玩家: ${this.currentPlayer === 1 ? '黑棋' : '白棋'}`)
.fontSize(20)
.margin(10)
// 重新开始按钮
Button('重新开始')
.onClick(() => this.resetGame())
.margin(5)
// 棋盘
Column() {
ForEach(this.board, (row: number[], rowIndex: number) => {
Row() {
ForEach(row, (cell: number, colIndex: number) => {
Column()
.width(30)
.height(30)
.border({ width: 1, color: '#999' })
.backgroundColor(this.getCellColor(cell))
.onTouch((event: TouchEvent) => {
if (event.type === TouchType.Down) {
this.handleClick(rowIndex, colIndex)
}
})
}, (colIndex: number) => colIndex.toString())
}
}, (rowIndex: number) => rowIndex.toString())
}
.margin(10)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
build()
方法用于构建页面的UI。- 使用
Column
和Row
布局容器来排列元素。 - 显示当前玩家或游戏结束信息。
- 提供一个“重新开始”按钮,点击后调用
resetGame()
方法重置游戏。 - 使用
ForEach
循环渲染棋盘,每个单元格是一个Column
,设置了宽度、高度、边框和背景颜色,并绑定了触摸事件。
获取单元格颜色
private getCellColor(value: number): ResourceColor {
return value === 1 ? '#000' : value === 2 ? '#fff' : '#CBA'
}
getCellColor
方法根据单元格的值返回相应的颜色:- 1(黑棋)返回黑色 (
#000
) - 2(白棋)返回白色 (
#fff
) - 0(空位)返回浅灰色 (
#CBA
)
处理点击事件
private handleClick(row: number, col: number) {
if (this.gameOver || this.board[row][col] !== 0) return
let newBoard = [...this.board]
newBoard[row][col] = this.currentPlayer
this.board = newBoard
if (this.checkWin(row, col)) {
this.gameOver = true
AlertDialog.show({ message: `${this.currentPlayer === 1 ? '黑棋' : '白棋'}获胜!` })
} else {
this.currentPlayer = this.currentPlayer === 1 ? 2 : 1
}
}
handleClick
方法处理玩家点击棋盘的动作:- 如果游戏已经结束或该位置已有棋子,则不处理。
- 否则,在指定位置放置当前玩家的棋子。
- 检查是否有玩家获胜,如果有则显示胜利提示并结束游戏。
- 否则切换到下一个玩家。
检查胜利条件
private checkWin(row: number, col: number): boolean {
const directions = [
[[-1, 0], [1, 0]], // 垂直
[[0, -1], [0, 1]], // 水平
[[-1, -1], [1, 1]], // 主对角线
[[-1, 1], [1, -1]] // 副对角线
]
for (let direction of directions) {
let count = 1
for (let i = 0; i < direction.length; i++) {
let dx = direction[i][0]
let dy = direction[i][1]
let x = row + dx
let y = col + dy
while (x >= 0 && x < 15 && y >= 0 && y < 15 &&
this.board[x][y] === this.currentPlayer) {
count++
x += dx
y += dy
}
}
if (count >= 5) return true
}
return false
}
checkWin
方法检查当前玩家是否在某个方向上连成五子:- 定义了四个方向:垂直、水平、主对角线和副对角线。
- 对每个方向进行检查,统计连续相同棋子的数量。
- 如果任意方向上有五个或更多相同的棋子,则返回
true
,表示当前玩家获胜。
重置游戏
private resetGame() {
this.board = Array(15).fill(null).map(() => Array(15).fill(0))
this.currentPlayer = 1
this.gameOver = false
}
resetGame
方法重置游戏状态:- 清空棋盘。
- 将当前玩家设置为黑棋(1)。
- 设置
gameOver
为false
,表示游戏未结束。
最后小结
这段代码实现了一个完整的五子棋游戏,包括棋盘绘制、玩家交互、胜负判断和游戏重置功能。通过理解每个部分的功能,你可以更好地掌握如何使用ArkTS开发类似的游戏应用。最后需要游戏源码的伙伴,可以到 Gitee 下载,源代码已上传到 Gitee(https://gitee.com/wgjava/GobangGame),欢迎一起交流鸿蒙原生开发。
热门推荐
手指头中指骨质增生怎么办
设计师如何提升自身专业技能?
各方争论:广州BRT车道是否应该开放?
家庭资产是指什么?如何合理规划和管理家庭资产?
腰麻术后为何不能坐立和抬头?医院麻醉科专家为你解答!
《春秋的侧面》:探寻春秋的别样风景
ChatGPT助力学术论文引言写作:从初稿到优化的完整指南
山楂在中医药理中的应用探讨
高考英语语法知识点归纳总结:动词的时态和语态
基于机器学习的虚假新闻智能检测系统
网上的瘦脸操真的有用吗?
担保合同怎么签才有效?一文详解签订要点与纠纷处理
影视编导培训丨视听语言教程之影调
八字五行论性格
陕西双一流大学排名“大调整”,西安交大稳居第一,西农跌至第6
公交车道开放却不敢走?交管部门提醒:可多看指示牌,多用导航
基于机器学习的人格预测项目:通过社交媒体数据预测MBTI人格类型
唐刀与武士刀:冷兵器时代的巅峰对决
小萝卜头:八个月大就被捕,却协助两位地下党成功越狱
“路上4不捡,捡了是麻烦”,指哪4样东西?别拿健康开玩笑
手指泡水后为什么会起皱?医生的专业解答来了
揭秘胆囊疾病的“真相”
高压电工上岗技能分享:大白话详细的讲解:停送电倒闸操作的基础知识
一吃东西就肚子胀,怎么办?这3个方法或能调理,让胃“消消气”
一文读懂 MOSFET:从结构原理到特性曲线的深度解析
新规出炉!银行卖保险,有了新要求
和田玉里的籽料和山料:六大维度全面解析
意思表示合同效力详解
看了日本的一户建,才知道大雄家那么有钱
酒吧经营必备证件及无证经营的法律风险