猜数字(Bulls and Cows)是一个经典的小游戏.
程序先产生4位各不相同的随机数,然后用户输入0-9四位各不相同的数字,程序将输入的数字与随机数进行对比,位置和数字对应相同者提示为xA,数字相同而位置不同者提示为xB,共15次机会.如随机数为1543,输入5134将提示0A4B,输入1534将提示2A2B,输入1543将提示4A0B(此时用户获胜).
这个游戏逻辑简单但代码实现富有挑战性,非常适合编程练手使用.最近学习go语言中,下面是go语言版的Bulls and Cows:
package main
import (
"fmt"
"time"
"math/rand"
"os"
)
func gen_num(length int)[]int32{
a:=[]int32{1,2,3,4,5,6,7,8,9,0}
b:=make([]int32,length,length)
if length>10 || length<0{
fmt.Println("invalid length:",length)
os.Exit(-1)
}
r:=rand.New(rand.NewSource(time.Now().UnixNano()))
for i:=0;i<length;i++{
tmp:=r.Intn(len(a)-i)
b[i]=a[tmp]
a[tmp],a[len(a)-1-i]=a[len(a)-1-i],a[tmp]
}
return b
}
func check_num(a,b []int32)bool{
var aa,bb int
if len(a)!=len(b){
return false
}
dict:=make(map[int32]int)
for i:=0;i<len(a);i++{
dict[a[i]]=0
}
for i:=0;i<len(a);i++{
if _,ok:=dict[b[i]];ok{
bb++
}
}
for i:=0;i<len(a);i++{
if a[i]==b[i]{
aa++
}
}
bb=bb-aa
fmt.Printf("%dA%dB\n",aa,bb)
if aa==len(a){
fmt.Println("OK!")
return true
}else{
return false
}
}
func main(){
var ipu int32
var i int
status:=false
length:=4
src:=gen_num(length)
tmp:=make([]int32,length,length)
for j:=0;j<15 && !status;j++{
fmt.Printf("Please input %d numbers\n",length)
fmt.Scanf("%d",&ipu)
for i=0;ipu>0;i++{
tmp[i]=ipu%10
ipu=ipu/10
}
if i<length{
tmp[i]=0
}
dest:=make([]int32,length,length)
for i:=0;i<len(tmp);i++{
dest[length-1-i]=tmp[i]
}
status=check_num(src,dest)
}
}
运行截图:
有疑问加站长微信联系(非本文作者)