Go项目开发----2048小游戏(下)
时间:2022-05-05
本文章向大家介绍Go项目开发----2048小游戏(下),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//向左旋转90度
func (t *G2048)left90() {
tn := new(G2048)
for i, line := range t {
for j, num := range line {
tn[len(line)-j-1][i] =num
}
}
*t = *tn
}
func (t *G2048)right180() {
tn := new(G2048)
for i, line := range t {
for j, num := range line {
tn[len(line)-i-1][len(line)-j-1] = num
}
}
*t = *tn
}
//向上移动并合并
func (t *G2048)mergeUp() bool {
tl := len(t)
changed := false
notfull := false
for i := 0; i <tl; i++ {
np := tl
n := 0 // 统计每一列中非零值的个数
// 向上移动非零值,如果有零值元素,则用非零元素进行覆盖
for x := 0; x <np; x++ {
if t[x][i] != 0 {
t[n][i] = t[x][i]
if n != x {
changed = true //标示数组的元素是否有变化
}
n++
}
}
if n < tl {
notfull = true
}
np = n
// 向上合并所有相同的元素
for x := 0; x <np-1; x++ {
if t[x][i] == t[x+1][i] {
t[x][i] *= 2
t[x+1][i] = 0
Score += t[x][i] *step // 计算游戏分数
x++
changed = true
}
}
// 合并完相同元素以后,再次向上移动非零元素
n = 0
for x := 0; x <np; x++ {
if t[x][i] != 0 {
t[n][i] = t[x][i]
n++
}
}
for x := n; x <tl; x++ {
t[x][i] = 0
}
}
return changed || !notfull
}
//向下移动合并的操作可以转换向上移动合并:
//1.向右旋转180度矩阵
//2.向上合并
//3.再次向右旋转180度矩阵
func (t *G2048)mergeDwon() bool {
//t.mirrorV()
t.right180()
changed := t.mergeUp()
//t.mirrorV()
t.right180()
return changed
}
//向左移动合并转换为向上移动合并
func (t *G2048)mergeLeft() bool {
t.right90()
changed := t.mergeUp()
t.left90()
return changed
}
///向右移动合并转换为向上移动合并
func (t *G2048)mergeRight() bool {
t.left90()
changed := t.mergeUp()
t.right90()
return changed
}
//检查按键,做出不同的移动动作或者退出程序
func (t *G2048)mrgeAndReturnKey() termbox.Key {
var changed bool
Lable:
changed = false
//ev := termbox.PollEvent()
event_queue := make(chan termbox.Event)
go func() { // 在其他goroutine中开始监听
for {
event_queue <- termbox.PollEvent()// 开始监听键盘事件
}
}()
ev := <-event_queue
switch ev.Type {
case termbox.EventKey:
switch ev.Key {
case termbox.KeyArrowUp:
changed = t.mergeUp()
case termbox.KeyArrowDown:
changed = t.mergeDwon()
case termbox.KeyArrowLeft:
changed = t.mergeLeft()
case termbox.KeyArrowRight:
changed = t.mergeRight()
case termbox.KeyEsc, termbox.KeyEnter:
changed = true
default:
changed = false
}
//如果元素的值没有任何更改,则从新开始循环
if !changed {
goto Lable
}
case termbox.EventResize:
x, y := termbox.Size()
t.initialize(x/2-10, y/2-4)
goto Lable
case termbox.EventError:
panic(ev.Err)
}
step++ // 计算游戏操作数
return ev.Key
}
//重置
func (b *G2048)clear() {
next :=new(G2048)
Score = 0
step = 0
*b = *next
}
//开始游戏
func (b *G2048)Run() {
err := termbox.Init()
if err != nil {
panic(err)
}
defer termbox.Close()
rand.Seed(time.Now().UnixNano())
A:
b.clear()
for { // 进入无限循环
st := b.checkWinOrAdd()
x, y := termbox.Size()
b.initialize(x/2-10, y/2-4) // 初始化游戏界面
switch st {
case Win:
str := "Win!!"
strl := len(str)
coverPrintStr(x/2-strl/2, y/2, str, termbox.ColorMagenta,termbox.ColorYellow)
case Lose:
str := "Lose!!"
strl := len(str)
coverPrintStr(x/2-strl/2, y/2, str, termbox.ColorBlack,termbox.ColorRed)
case Add:
default:
fmt.Print("Err")
}
// 检查用户按键
key := b.mrgeAndReturnKey()
// 如果按键是 Esc 则退出游戏
if key == termbox.KeyEsc{
return
}
// 如果按键是 Enter 则从新开始游戏
if key == termbox.KeyEnter{
goto A
}
}
}
本文来自:CSDN博客
感谢作者:hzy305365977
查看原文:Go项目开发----2048小游戏
- centos6.6 下安装mysql
- silverlight 4 tools for vs2010无法在vs2010 SP1上安装的解决办法
- find命令小结
- Python加圣诞帽
- 多次grep 没有看到输出
- java多线程 基础demo
- 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()
- mybatis 使用tips - 使用多个参数
- 从高的角度看自动化测试
- Django中请求的生命周期
- 程序猿python学习AIphaZero,TensorFlow强化学习AI游戏,100行代码运行看看!
- awk中NF的使用
- tar.gz 解压
- Python&机器学习之项目实践
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅析PHP7的多进程及实例源码
- spring-boot-route(十九)spring-boot-admin监控服务
- Python scrapy爬取小说代码案例详解
- 解决pip install psycopg2出错问题
- PHP开发的文字水印,缩略图,图片水印实现类与用法示例
- spring-boot-route(二十)Spring Task实现简单定时任务
- php+ajax实现商品对比功能示例
- spring-boot-route(二十一)Quartz实现动态定时任务
- Helm仓库的重要变更和v2支持将在11月结束
- ThinkPHP框架整合微信支付之刷卡模式图文详解
- 详解Python直接赋值,深拷贝和浅拷贝
- 利用python下载scihub成文献为PDF操作
- PHP中的Iterator迭代对象属性详解
- 使用Python实现微信拍一拍功能的思路代码
- Laravel5.7 Eloquent ORM快速入门详解