首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

用 Go 写一个可以双人对弈的中国象棋游戏!附完整源码

  • 25-04-22 01:21
  • 3670
  • 14108
juejin.cn

你有没有想过用 Go 写一个 中国象棋?今天就带你一步步从零打造一个支持 双人对战的终端版中国象棋游戏,不仅有完整代码,还有运行效果,适合新手练手,也适合进阶开发者继续拓展为 AI 版或网页版!

文末附完整代码,复制即玩!


为什么选择 Go 实现中国象棋?

  • • Go 的语法简单直观,比 Java/Python 更适合写 CLI 游戏
  • • 协程天生适合拓展对战、AI 功能
  • • 项目易部署、编译快、跨平台运行

功能设计概览

本项目属于入门级版本,核心功能如下:

支持双方轮流走棋
棋盘初始化 + 控制台打印棋盘
使用如 move a0 a1 的命令进行走子
棋子可覆盖吃掉对方(不含规则限制)


中国象棋棋盘和坐标系统

为简化控制台输入,我们把棋盘位置用 a0 ~ i9 表示。例如:

  • • a0 是黑方左上角车
  • • e9 是红方“帅”所在位置

这个直观坐标方式可以方便命令操作,非常适合终端交互。


完整代码(复制即用)

保存为 main.go,然后 go run main.go:

go
代码解读
复制代码
// main.go package main import (     "bufio"     "fmt"     "os"     "strings" ) type Piece struct {     Name  string     Color string // "red" or "black" } type Position struct {     X int     Y int } var board [10][9]*Piece var posMap = map[string]Position{} func initBoard() {     // 初始化坐标映射     letters := "abcdefghi"     for i := 0; i < 10; i++ {         for j := 0; j < 9; j++ {             key := fmt.Sprintf("%c%d", letters[j], i)             posMap[key] = Position{i, j}         }     }     // Red side     board[9][0] = &Piece{"车", "red"}     board[9][1] = &Piece{"马", "red"}     board[9][2] = &Piece{"相", "red"}     board[9][3] = &Piece{"仕", "red"}     board[9][4] = &Piece{"帅", "red"}     board[9][5] = &Piece{"仕", "red"}     board[9][6] = &Piece{"相", "red"}     board[9][7] = &Piece{"马", "red"}     board[9][8] = &Piece{"车", "red"}     board[7][1] = &Piece{"炮", "red"}     board[7][7] = &Piece{"炮", "red"}     board[6][0] = &Piece{"兵", "red"}     board[6][2] = &Piece{"兵", "red"}     board[6][4] = &Piece{"兵", "red"}     board[6][6] = &Piece{"兵", "red"}     board[6][8] = &Piece{"兵", "red"}     // Black side     board[0][0] = &Piece{"车", "black"}     board[0][1] = &Piece{"马", "black"}     board[0][2] = &Piece{"象", "black"}     board[0][3] = &Piece{"士", "black"}     board[0][4] = &Piece{"将", "black"}     board[0][5] = &Piece{"士", "black"}     board[0][6] = &Piece{"象", "black"}     board[0][7] = &Piece{"马", "black"}     board[0][8] = &Piece{"车", "black"}     board[2][1] = &Piece{"炮", "black"}     board[2][7] = &Piece{"炮", "black"}     board[3][0] = &Piece{"卒", "black"}     board[3][2] = &Piece{"卒", "black"}     board[3][4] = &Piece{"卒", "black"}     board[3][6] = &Piece{"卒", "black"}     board[3][8] = &Piece{"卒", "black"} } func printBoard() {     fmt.Println("    a   b   c   d   e   f   g   h   i")     fmt.Println("  +---+---+---+---+---+---+---+---+---+")     for i, row := range board {         fmt.Printf("%d |", i)         for _, cell := range row {             if cell != nil {                 color := "红"                 if cell.Color == "black" {                     color = "黑"                 }                 fmt.Printf(" %s%s|", color, cell.Name)             } else {                 fmt.Print("   |")             }         }         fmt.Println()         fmt.Println("  +---+---+---+---+---+---+---+---+---+")     } } func movePiece(from, to string, turn string) bool {     p1, ok1 := posMap[from]     p2, ok2 := posMap[to]     if !ok1 || !ok2 {         fmt.Println("❌ 坐标格式错误,请使用如 a0, b3 格式")         return false     }     piece := board[p1.X][p1.Y]     if piece == nil {         fmt.Println("❌ 起始位置没有棋子")         return false     }     if piece.Color != turn {         fmt.Println("❌ 不能动对方的棋子")         return false     }     board[p2.X][p2.Y] = piece     board[p1.X][p1.Y] = nil     return true } func main() {     initBoard()     scanner := bufio.NewScanner(os.Stdin)     turn := "red"     for {         printBoard()         fmt.Printf("[%s方] 请输入移动命令,例如 move a0 a1:", turn)         scanner.Scan()         line := strings.TrimSpace(scanner.Text())         tokens := strings.Split(line, " ")         if len(tokens) != 3 || tokens[0] != "move" {             fmt.Println("❗️命令格式错误,用法: move  ")             continue         }         from := tokens[1]         to := tokens[2]         if movePiece(from, to, turn) {             if turn == "red" {                 turn = "black"             } else {                 turn = "red"             }         }     } }

运行效果

scss
代码解读
复制代码
[red方] 请输入移动命令,例如 move a0 a1: move a0 a1

终端将会展示棋盘更新后的状态,非常适合你和朋友一边敲命令,一边下棋!


进阶玩法(你可以继续做的)

  • • 加入棋子合法性规则(比如兵不能后退)
  • • 判定将死/胜负
  • • 网络版:用 WebSocket 实现远程对弈
  • • 图形界面:Go + Web (Vite/React) 实现在线对弈
  • • AI 功能:引入搜索算法进行人机对战

总结

这个项目虽然简单,却是入门游戏开发、控制台交互、坐标系统建模的好练手案例。如果你也觉得有趣,不妨动手试试!同时也欢迎你把它发给朋友,一起下盘终端象棋

注:本文转载自juejin.cn的程序员爱钓鱼的文章"https://juejin.cn/post/7494642584994086953"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

103
后端
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top