// 用来更新控制台的显示,在指定位置写字符,使用错误输出避免缓冲 func draw(p loct, c int) { C.gotoxy(C.int(p.i*2+4), C.int(p.j+1)) //蛇的初始化位置 fmt.Fprintf(os.Stderr, "%c", c) }
// 用来更新控制台的显示,在指定位置写字符,使用错误输出避免缓冲 func draw(p loct, c byte) { C.gotoxy(C.int(p.i*2+4), C.int(p.j+2)) fmt.Fprintf(os.Stderr, "%c", c) }
func Snake() { initialize() // 主程序 for { // 程序更新周期,400毫秒 time.Sleep(400 * time.Millisecond) // 暂停 if lead == 'P' { continue } // 放置食物 if !food { give := place() if area[give.i][give.j] == 0 { // 食物只能放在空闲位置 area[give.i][give.j] = 'F' draw(give, '◎') // 绘制食物▇◎ food = true } } // 我们在蛇头位置记录它移动的方向 area[head.i][head.j] = lead // 根据lead来移动蛇头 switch lead { case 'U': head.j-- case 'L': head.i-- case 'R': head.i++ case 'D': head.j++ } // 判断蛇头是否出界 if head.i < 0 || head.i >= 20 || head.j < 0 || head.j >= 21 { C.gotoxy(0, 23) // 让光标移动到画面下方 break // 跳出死循环 } // 获取蛇头位置的原值,来判断是否撞车,或者吃到食物 eat := area[head.i][head.j] if eat == 'F' { // 吃到食物 food = false // 增加蛇的尺寸,并且不移动蛇尾 size++ } else if eat == 0 { // 普通移动 draw(tail, ' ') // 擦除蛇尾 // 注意我们记录了它移动的方向 dir := area[tail.i][tail.j] // 我们需要擦除蛇尾的记录 area[tail.i][tail.j] = 0 // 移动蛇尾 switch dir { case 'U': tail.j-- case 'L': tail.i-- case 'R': tail.i++ case 'D': tail.j++ } } else { // 撞车了 C.gotoxy(0, 23) break } draw(head, '●') // 绘制蛇头◎ } SetConsoleTextAttribute(hCon, 0x0007) // 收尾了 // switch { // case size < 22: // fmt.Fprintf(os.Stderr, "Faild! You've eaten %d *\n", size-1) // case size < 42: // fmt.Fprintf(os.Stderr, "Try your best! You've eaten %d *\n", size-1) // default: // fmt.Fprintf(os.Stderr, "Congratulations! You've eaten %d *\n", size-1) // } switch { case size < 22: fmt.Printf("Faild! You've eaten %d *\n", size-1) case size < 42: fmt.Printf("Try your best! You've eaten %d *\n", size-1) default: fmt.Printf("Congratulations! You've eaten %d *\n", size-1) } cmd := exec.Command("cmd", "/c", "cls") cmd.Stdout = os.Stdout cmd.Run() fmt.Println("当前游戏结束,3秒后退出本程序....") time.Sleep(3 * time.Second) os.Exit(0) }
func main() { // 主程序 for { // 程序更新周期,400毫秒 time.Sleep(time.Millisecond * 400) // 暂停,还是要有滴 if lead == 'P' { continue } // 放置食物 if !food { give := place() if area[give.i][give.j] == 0 { // 食物只能放在空闲位置 area[give.i][give.j] = 'F' draw(give, '$') // 绘制食物 food = true } } // 我们在蛇头位置记录它移动的方向 area[head.i][head.j] = lead // 根据lead来移动蛇头 switch lead { case 'U': head.j-- case 'L': head.i-- case 'R': head.i++ case 'D': head.j++ } // 判断蛇头是否出界 if head.i < 0 || head.i >= 20 || head.j < 0 || head.j >= 20 { C.gotoxy(0, 23) // 让光标移动到画面下方 break // 跳出死循环 } // 获取蛇头位置的原值,来判断是否撞车,或者吃到食物 eat := area[head.i][head.j] if eat == 'F' { // 吃到食物 food = false // 增加蛇的尺寸,并且不移动蛇尾 size++ } else if eat == 0 { // 普通移动 draw(tail, ' ') // 擦除蛇尾 // 注意我们记录了它移动的方向 dir := area[tail.i][tail.j] // 我们需要擦除蛇尾的记录 area[tail.i][tail.j] = 0 // 移动蛇尾 switch dir { case 'U': tail.j-- case 'L': tail.i-- case 'R': tail.i++ case 'D': tail.j++ } } else { // 撞车了 C.gotoxy(0, 23) break } draw(head, '*') // 绘制蛇头 } // 收尾了 switch { case size < 22: fmt.Fprint(os.Stderr, "Faild! ") case size < 42: fmt.Fprint(os.Stderr, "Try your best! ") default: fmt.Fprint(os.Stderr, "Congratulations! ") } fmt.Fprintf(os.Stderr, "You've eaten %d $\n", size-1) }