简介扫雷这个游戏没有什么好说的,就是排布雷场场加判定,很经典的游戏,于是我尝试用golang自己写一个,选用了fyne框架作为UI。个人认为fyne灵活程度不是很高,自定义有些难度,拿来做一些简单的ui可以,但是想要深度定制需要下一番功夫去学习。效果展示两个难点懂得使用fyne进行简单的元素排布其实整个界面就能写出来了,无非是根据数组循环生成按钮和标签。不过生成雷场是一个难点,另一个我认为是做到点击空地后一点打开一大片的效果一、生成雷场这个项目中我使用了自定义的Vector3结构去记录每个单元的X,Y位置信息,以及单元格代表的属性(0表示空地,-1表示地雷,其余数字表示该方格周围存在的地雷数)type Vector3 struct { X int Y int Num int }这样,如果我们想要布雷,只需要根据两个随机数生成器生成x,y上的随机数就可以了,然后准备一个Vector3的数组来装载这些单元。不过记得除重以及判断是否超界,否则就会出现报错和莫名其妙的BUG。那么,如何去求那些烦人的数字呢?现在我的手里有一个数组的代表单元格的结构体,但是我怎么去
近期在写一个扫雷的小游戏,用到了fyne框架,但是不是很熟悉这个框架,遇见了很多报错信息。其中就包括这个问题。问题描述:我写了一个menu界面用来选择游戏难度,然后点击相应按钮之后生成游戏界面。想法是很合理的,但是我的show()函数出现了如题所示的报错。原因:原因在于我是用了ShowAndRun()方法来显示游戏界面。在Go中,有一些函数和操作是安全的,可以在任何goroutine中运行,但是大多数函数和操作,包括许多GUI和网络操作,都只能在主goroutine中运行。这是因为在Go中,所有的goroutine都是并行的,但是主goroutine是特别的那个,它是所有goroutine的协调者,它负责启动和停止所有的goroutine。因此,只有主goroutine可以安全地执行许多操作,包括显示GUI或启动和停止其他goroutine。而三个函数:“show()”是非模式对话框(Modeless Dialog)。调用该函数后,程序的控制权会立即返回给调用函数,不会阻塞程序的其他操作。也就是说,即使对话框在弹出的时候,用户没有关闭它,程序的其他部分也可以继续运行。“ShowAndR
else { this.server.mapLock.Lock() delete(this.server.OnlineMap, this.Name) this.server.OnlineMap[newName] = this this.server.mapLock.Unlock() //this是一个指针对象 this.Name = newName this.SendMsg("更换用户名" + this.Name + "\n") }第一次看这段代码没有反应过来,为什么先存储到OnlineMap之后,再更新对象的Name还能改变OnlineMap中的对象。后来发现this本身是个指针对象,而OnlineMap存储的是this的指针。因此改变this指向的对象其实就是改变OnlineMap中存储的对象。
Tips: Goroutine是Go语言中的轻量级线程实现,由Go运行时管理;Goroutine比线程更小,十几个Goroutine可能体现在底层就是五六个线程。比thread更易用、更高效、更轻便。总所周知,Go语言以其良好的原生多线程支持闻名于世。而golang多线程的声明极其简单,只需要在执行函数前添加go便可实现java一顿Thread.run()的操作。而其优秀的channal机制可以轻易的让线程之间进行通信,甚至不用加锁就线程安全。今日就来小实验一下来探究他们的特性。并发实验莫过于消费者与生产者实验最为经典。首先我们请出二位主角:func producer(ch chan int) { list := [6]int{1, 2, 3, 4, 5, 6} for _, value := range list { fmt.Println("我放进去了:", value) ch <- value } close(ch) } func customer(ch chan int) { f
walker
人生若只如初见
本站由
特别加持