Пример #1
0
// 用来更新控制台的显示,在指定位置写字符,使用错误输出避免缓冲
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)

}
Пример #2
0
// 用来更新控制台的显示,在指定位置写字符,使用错误输出避免缓冲
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)
}
Пример #3
0
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)

}
Пример #4
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)
}