golang学习实例-猜拳小游戏

golang学习实例-猜拳小游戏,第1张

概述学了一段golang,觉得应该实践一下,写了这个猜拳小游戏,顺带着学习下go testing。 主程序源码: package mainimport ( "bufio" // 输入输出 "fmt" "math" "math/rand" "os" "strconv" "time")//rock, paper, scissorsconst ( rock int = 1

学了一段golang,觉得应该实践一下,写了这个猜拳小游戏,顺带着学习下go testing。


主程序源码:
package mainimport (	"bufio" // 输入输出	"fmt"	"math"	"math/rand"	"os"	"strconv"	"time")//rock,paper,scissorsconst (	rock     int = 1	scissors int = 2	paper    int = 3	rockname     string = "石头"	scissorsname string = "剪刀"	papername    string = "布"	win  int = 1	lose int = -1	draw int = 0)// 拳的结构type Finger struct {	value int	name  string}func createFinger(n int) (finger Finger) {	switch n {	case rock:		finger.value = rock		finger.name = rockname	case scissors:		finger.value = scissors		finger.name = scissorsname	case paper:		finger.value = paper		finger.name = papername	}	return}func isAiWin(ai Finger,user Finger) int {	result := ai.value - user.value	// 如果是石头和布的比较,比较值正负取反	if int(math.Abs(float64(result))) == paper-rock {		result = -(result)	}	if result < 0 {		return win	} else if result > 0 {		return lose	}	return draw}func randFinger() (finger Finger) {	rand := rand.New(rand.NewSource(time.Now().UnixNano()))	switch rand.Intn(3) {	case 0:		finger.value = rock		finger.name = rockname	case 1:		finger.value = scissors		finger.name = scissorsname	case 2:		finger.value = paper		finger.name = papername	}	return}func main() {	var aifinger,userFinger Finger	reader := bufio.NewReader(os.Stdin)	fmt.Printf("请输入你要出的拳:%d->石头,%d->剪刀,%d->布,9->退出\n",rock,scissors,paper)	for {		data,_,err := reader.Readline()		if err != nil {			fmt.Println("程序出错")			break		}		input,err := strconv.Atoi(string(data))		if err != nil {			fmt.Println("格式不对,请输入数字:",input)			continue		}		if input == 9 {			break		}		switch input {		case rock,paper:			aifinger = randFinger()			fmt.Println("电脑出拳为: ",aifinger.name)			userFinger = createFinger(input)			fmt.Println("你出拳为: ",userFinger.name)			aiWin := isAiWin(aifinger,userFinger)			if aiWin == win {				fmt.Println("你输了,继续输入:")			} else if aiWin == lose {				fmt.Println("你赢了,继续输入:")			} else {				fmt.Println("平局,继续输入:")			}		default:			fmt.Println("输入不合要求,继续输入:")		}	}}


testing 源码
package mainimport (	"testing" // 加载test包)func TestCreateFinger(t *testing.T) {	// 顺带掌握以下struct作为map value的初始化	cases := map[int]Finger{		rock:     Finger{rock,rockname},scissors: Finger{scissors,scissorsname},paper:    Finger{paper,papername},6:        Finger{},// other	}	for cs,except := range cases {		result := createFinger(cs)		if result != except {			t.Errorf("case %v,except %v,result %v",cs,except,result)		}	}}func TestIsAiWin(t *testing.T) {	// 顺带掌握以下struct作为array element的初始化	cases := [...]struct {		cs     [2]int		except int	}{		{[2]int{paper,rock},win},{[2]int{rock,paper},lose},scissors},{[2]int{scissors,{[2]int{paper,draw},}	for i := 0; i < len(cases); i++ {		cs := cases[i].cs		except := cases[i].except		result := isAiWin(createFinger(cs[0]),createFinger(cs[1]))		if result != except {			t.Errorf("case %v,result)		}	}}

执行预览
请输入你要出的拳:1->石头,2->剪刀,3->布,9->退出3电脑出拳为:  石头你出拳为:  布你赢了,继续输入:2电脑出拳为:  布你出拳为:  剪刀你赢了,继续输入:1电脑出拳为:  石头你出拳为:  石头平局,继续输入:1电脑出拳为:  剪刀你出拳为:  石头你赢了,继续输入:1电脑出拳为:  布你出拳为:  石头你输了,继续输入:9exit code 0,process exited normally.

实践过程中,还是发现诸多问题,例如丢失类型是长出现的问题,例如
cases := [...]struct {		cs     [2]int		except int	}{		{[2]int{paper,{{scissors,//原来设想[2]int是可以省略,但是在这里会造语义分析失败,从而丢失cs的数据	}

一些疑问 import分开的话(即中间有空行的话),fmt是不会将之顺序对调,不知道会不会对import产生影响
import (	"bufio" // 输入输出	"os"	"fmt"	"strconv"	"math"	"math/rand"	"time")

不分开的话,会是这样
import (	"bufio" // 输入输出	"fmt"	"math"	"math/rand"	"os"	"strconv"	"time")
总结

以上是内存溢出为你收集整理的golang学习实例-猜拳小游戏全部内容,希望文章能够帮你解决golang学习实例-猜拳小游戏所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1292319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存