对于for循环,在 Go语言零基础入门,捕获错误、slice切片、for循环、test 中也有介绍,大家都很熟悉,一般是三部分组成:初始化,条件表达式,后置语句,如下:

func main() {for i := 0; i < 5; i++ {fmt.Printf("%d,", i)}
}
//0,1,2,3,4,

除了条件表达式,前后是可以省略的,在其他语言种,分号要有,不能少,但是在Go语言中可以省略掉,甚至条件表达式都可以省略,当然空的for就是死循环,可以省略条件表达式,保留前后块,所以如果只保留条件表达式,那看起来更像是while语句,如下:

func main() {a := []int{3, 2, 4, 55, 6}for k, v := range a {fmt.Printf("%v,%v\n", k, v)}
}
/*
0,3
1,2
2,4
3,55
4,6
*/

这个遍历数组还是有点区别,跟Python的enumerate一样,带索引,在Go语言更像map,如下:

package mainimport "fmt"func main() {m := map[int]string{}m[1] = "Tony"m[6] = "ChyiChin"m[3] = "牛顿"for k, v := range m {fmt.Printf("%v,%v\n", k, v)}
}
/*
1,Tony
6,ChyiChin
3,牛顿
*/

我们来看个孔明棋的示例,加深对for循环的认识
孔明棋(peg solitaire,也叫十字棋)的玩法:三十三颗棋子,排成十字架,一般是先去掉中间一颗棋子,就可以开始玩了。将棋子跳过邻近的棋子,到达一个空着的位置,然后拿掉被跳过的棋子即可。
棋子只能前后左右,不能对角线的跳,直到不能跳为止,看能剩余多少颗棋子,越少越好。

package mainimport "fmt"const N = 12 // 每行11个位置+1个换行符(10)
//定义棋盘,● 表示棋子(9679),○ 表示空位(9675),rune:如尼字母,[]rune
//board是[]int32数组类型,保存的是它们对应的ASCII码值
var board = []rune(`...........
...........
....●●●....
....●●●....
..●●●●●●●..
..●●●○●●●..
..●●●●●●●..
....●●●....
....●●●....
...........
...........
`)var center intfunc init() {n := 0for pos, field := range board {if field == '○' {center = posn++}}if n != 1 {center = -1 // 不是单个空位}
}var moves int // 移动的次数//是否可以移动,满足就返回true,否则返回false
//满足条件之后就将当前位置和被跳过的位置设置成空位,到达的空位设置为棋子
func move(pos, dir int) bool {moves++if board[pos] == '●' && board[pos+dir] == '●' && board[pos+2*dir] == '○' {board[pos] = '○'board[pos+dir] = '○'board[pos+2*dir] = '●'return true}return false
}// 如果不能移动,就恢复到原来可移动的状态
func unmove(pos, dir int) {board[pos] = '●'board[pos+dir] = '●'board[pos+2*dir] = '○'
}//遍历棋盘,找到棋子然后分别遍历四个方向进行跳跃
//棋子找相邻位置尝试是否能跳过,注意方向(左右相差1,前后相差N)
func solve() bool {var last, n intfor pos, field := range board {if field == '●' {// 遍历四个方向(左、上、右、下)for _, dir := range [...]int{-1, -N, +1, +N} {if move(pos, dir) {if solve() {unmove(pos, dir)fmt.Println(string(board))return true}unmove(pos, dir)}}last = posn++}}//只剩一颗中心棋子if n == 1 && (center < 0 || last == center) {fmt.Println(string(board))return true}return false
}func main() {if !solve() {fmt.Println("未找到解决方案")}s := fmt.Sprintf("试着移动了%d次", moves)fmt.Println(s)
}

其中出现一个rune数组,这里需要重点讲解下,以及关于byte数组的区别,我们来看示例

package mainimport "fmt"func main() {var v1 = []rune(`abAQ
XS`)var v2 = []int{2, 3, 4, 9}var v3 = []string{"qq", "hello", "你好"}//rune与byte的区别var v4 = []byte("你好") //[228 189 160 229 165 189]var v5 = []rune("你好") //[20320 22909]fmt.Println(v1, v2, v3, v4, v5)//占三个字节和1个字节的区别,所以在中文中截取就要注意fmt.Println(string(v4[:3]), string(v5[:1]))
}/*
[97 98 65 81 10 88 83] [2 3 4 9] [qq hello 你好] [228 189 160 229 165 189] [20320 22909]
你 你
*/

Go语言解决孔明棋的玩法(加深对for循环的认识)相关推荐

  1. 通过python递归来解决孔明棋问题

    孔明棋大家应该都不陌生.(好吧可能不一定) 简单来讲,是一种规则简单,但是过程并不见得容易,可以一个人玩的棋. 他有还一个有趣的名字:法国跳棋独立钻石. 我上手的是vx某小程序.玩法比最经典的32颗棋 ...

  2. c语言 switch_switch硬核别致玩法,C语言冷知识,领略认知盲区的switch写法

    前言 本文主要介绍的是C语言中switch的别样玩法,这是很多学习C语言的人基本都没有见过的一个冷知识,虽然不是很常用,但是希望对于广大读者学习C语言有一些帮助. switch别致源码展示 如果你是第 ...

  3. C语言实现 扑克牌 (4种玩法) 洗牌,发牌,整理牌

    // 扑克牌的四种玩法 #include <stdio.h> #include <string.h> #include <stdlib.h> #include &l ...

  4. C语言实现三子棋小游戏(源码+教程)

    我猜中了开头,却猜不到这结局.--<大话西游> 目录 1.设计框架 2.设计流程 2.1菜单 2.2初始化棋子 2.3初始化棋盘 2.4玩家输入落子的坐标 2.5电脑随机生成棋子 2.6判 ...

  5. 详细解读:C语言实现三子棋

    目录: 一.说明 二.多文件创建 三.设计思路 四.代码实现 五.总体代码 六.总结 一.说明 随着我们对C语言学习的逐渐深入,我们可以实现一些简单的小游戏,本文将会介绍C语言实现三子棋小游戏,通过本 ...

  6. 《耻辱2》潜行玩法机制分析

    中文摘要 本文将潜行游戏的玩法机制拆解到底层,并串联玩法机制从内核到表现形式中的各个重要组成部分,结合<耻辱2>具体的关卡设计,深入分析<耻辱2>潜行玩法机制的本质.本文通过对 ...

  7. 请提前布局 Star Trek突破链游全新玩法,市场热度持续高涨

    随着互联网巨头.区块链头部企业对元宇宙的深度布局,从各个角度诠释了元宇宙未来的潜力,而且越来越多的资本.技术投入到元宇宙领域中,其中,加密链游和NFT越来越为人们所关注.尤其是将游戏与 NFT相结合, ...

  8. AI视觉组仙人一步之高级玩法——从Python回归C语言

    开心的程序猿@NXP 2021-02-04 Thursday   读过之前两篇的童鞋们,想来已经开始着手开发属于自己的AI视觉应用了,当然,手中还没有OpenART套件的朋友们,也不用着急,可以先参照 ...

  9. c语言k歌4.0编程,一次在线K歌玩法的尝试

    最近在产品中推出了一个在线K歌玩法,除了满足用户的娱乐交友需求,也总算是做了一件跟个人兴趣有关的事情了. 做这个需求,主要基于一些用户洞察: 交友场景,用户的表现欲需要窗口. 在现实或虚拟社交场景,为 ...

最新文章

  1. 《Android应用开发入门经典(第3版)》——第6.1节创建演示应用
  2. 武汉python培训班排行榜-比较靠谱的武汉Python培训机构是哪个?
  3. 160个Crackme022之故布疑阵
  4. [TCP/IP] TCP如何实现流量控制和拥塞控制
  5. 如何在浏览器里开发并运行 SAP UI5 应用
  6. 办大额信用卡致胜一招
  7. 我的C#/.NET学习诀窍——LINQPad
  8. 微信消息提醒与消息数字提示之BadgeView
  9. 蓝桥杯练习题:保留100位小数的黄金分割数
  10. Windows下的Makefile
  11. (转载)C,C++,C#三者区别
  12. 编程坑太多,Map 集合怎么也有这么多坑?一不小心又踩了好几个!
  13. oracle关联两个字段,oracle字符串连接函数,||使两个或多个字段拼成一个字段
  14. 解决easy ui 1.4datebox控件不能清空的问题
  15. 这年代,你需要了解一下什么是聚合搜索(附站点推荐)
  16. 爬去网络数据的一般思路
  17. Android源码编译:openjdk安装
  18. 可见光成像通信(OOC)驱动频率区域的计算
  19. Spring-framework 5.1.8 中文版文档(Google翻译)- 001
  20. java关于数组的下标越界

热门文章

  1. LAMP环境搭建与配置(二)
  2. Hadoop相关组成介绍
  3. Hadoop知识概要
  4. Away3D 4.0官网教程(翻译)
  5. Rocky Linux操作指南
  6. c#中快速解析和提取json字符串
  7. 用URLOS一键安装laiketui电商门店系统 又快又方便
  8. 怎么合并视频?快把这些方法收好
  9. contentresolver(contentresolver notifychange)
  10. Jquery实现增删改查