Go语言基础小项目应用学习|青训营

75 阅读4分钟

猜拳小游戏


import (
	"fmt"
	"math/rand"
	"strconv"
	"time"
)

func main() {
	fmt.Println("\t欢迎来到猜拳游戏!")
	rand.Seed(time.Now().UnixNano()) //设置种子
	var choice, myn string
	var computerchoice string      //电脑出拳
	var mychoice string            //我出拳
	var mycount, computercount int //我和机器各自赢得次数
	var count int                  //统计游戏总次数
	FistMap := map[int]string{0: "石头", 1: "剪刀", 2: "布"}
	fmt.Println("-------------------------------------")
	fmt.Print("游戏规则:三局两胜\n")
	fmt.Print("注意:1为继续玩     0为退出\n")
	fmt.Println("-------------------------------------")
	for {
		fmt.Printf("是否继续玩(1.继续玩,0.退出游戏):")
		fmt.Scan(&choice)
		choiceint, err := strconv.Atoi(choice)
		for err != nil || (choiceint < 0 || choiceint > 1) {
			fmt.Printf("你的输入不合法!请输入(0-1)之间的数:")
			fmt.Scan(&choice)
			choiceint, err = strconv.Atoi(choice)
		}
		if choiceint == 1 {
			for i := 0; i < 3; i++ {
				n := rand.Intn(3) //取0-2的随机整数存在n变量里
				fmt.Printf("请输入你的出招(0为石头,1为剪刀,2为布):")
				fmt.Scan(&myn)
				//如果用户不按要求输入,就重新让他输入
				mynint, errint := strconv.Atoi(myn)
				for errint != nil || (mynint > 2 || mynint < 0) {
					fmt.Printf("你的出招有误,重新输入(0为石头,1为剪刀,2为布):")
					fmt.Scan(&myn)
					mynint, errint = strconv.Atoi(myn)
				}
				computerchoice = FistMap[n]
				mychoice = FistMap[mynint]
				if (computerchoice == "石头" && mychoice == "布") || (computerchoice == "剪刀" && mychoice == "石头") || (computerchoice == "布" && mychoice == "剪刀") {
					fmt.Printf("机器出招(%s) --  我出招(%s)\n", computerchoice, mychoice)
					mycount += 1
				} else if (computerchoice == "石头" && mychoice == "剪刀") || (computerchoice == "剪刀" && mychoice == "布") || (computerchoice == "布" && mychoice == "石头") {
					fmt.Printf("机器出招(%s) --我出招(%s)\n", computerchoice, mychoice)
					computercount += 1
				} else {
					fmt.Printf("机器出招(%s) --我出招(%s)\n", computerchoice, mychoice)
				}
			}
			count += 1
			if mycount > computercount {
				fmt.Println("----我赢了,啊哈哈哈!----")
			} else if mycount < computercount {
				fmt.Println("----我输了,呜呜呜呜!----")
			} else {
				fmt.Println("----打个平手,下次再战----")
			}
		}
		if choiceint == 0 {
			fmt.Printf("拜拜了,本次你一共玩了%d次", count)
			break
		}
	}
}



其中的fmt包实现了格式化I/O。主要分为向外输出内容和获取输入内容两大部分。

format说明 Go 语言中的fmt包含有格式化输入输出的函数,类似于C语言的printf和scanf。格式字符串的规则来源于C但更简单更好用。

在 fmt 包中,有三种标准输出的打印语句:

Printf 可以给定输出格式的打印语句 Printf(“格式化串定义”,变量列表) 格式化串定义:即format字符串 变量列表: 可以是任意类型的值变量列表,系统实现的是一通用接口函数 Print 这个函数不需要format字符串,等价于对每一个参数设置为%v Println 等价于Print语句,但输出时会在参数之间加上空格并在输出结束换行

1、Print系列函数 用于标准输出

1.1 func Print(a …interface{}) (n int, err error) 参数列表 a… 值变量列表 返回值:返回打印字符数 n活返回error 功能说明:这个函数主要是用来根据系统默认格式字符串和参数表生成一个打印字符串

1.2 func Printf(format string, a …interface{}) (n int, err error)

参数列表 format 打印的格式说明 a… 值变量列表 返回值:返回打印字符数 n或返回error

功能说明:这个函数主要是用来根据说明格式字符串和参数表生成一个打印字符串

1.3 func Println(a …interface{}) (n int, err error) 参数列表 a… 值变量列表 返回值:返回打印字符数 n或返回error

功能说明:这个函数主要是用来根据系统默认格式字符串和参数表生成一个打印字符串并加换行 func main() { fmt.Print("默认格式打印!") //默认格式打印

fmt.Printf("Format:%s\n", "格式打印!") //Format:格式打印

fmt.Println("默认格式打印,有换行啊!") //默认格式打印,有换行

}

2、Scan系列函数 用于标准输入

2.1 func Scan(a …interface{}) (n int, err error) 参数列表 a… 值变量列表 返回值: 返回成功读取的参数的数量 n或返回error

功能说明:这个函数主要是从标准输入读取文本,将空白分割的连续数据顺序存入参数里。换行视同空白。它返回成功读取的参数的数量。如果少于提供的参数的数量,返回值err将报告原因。

2.2 func Scanf(format string, a …interface{}) (n int, err error) 参数列表 format 输入格式说明 a… 值变量列表 返回值:返回输入字符数 n或返回error

功能说明:这个函数主要是从标准输入读取文本,根据格式字符串顺序将数据存入参数中,它返回成功解析并存入的参数的数量

2.3func Scanln(a …interface{}) (n int, err error) 参数列表

  • a… 值变量列表

返回值:返回成功读取的参数的数量 n或返回error

功能说明:这个函数主要是从标准输入读取文本,将空白分割的连续数据顺序存入参数里。换行视同空白。它返回成功读取的参数的数量。如果少于提供的参数的数量,返回值err将报告原因。类似Scan,但会在换行符中止,并且存入最后一条后时读取位置必须有换行或者换行符。