用户:wrmdcxy查看:3 回复:4 评论:3 创建时间:2020-05-04T20:57:39
【作品展示】
没什么好展示的,跟以前的二进制游戏(https://shequ.codemao.cn/community/238429)一样
【作品介绍】
这是Go语言版的二进制游戏。和以前的功能一样。但是以前的是顺序编程,这个是函数式编程。作为一个初学者,途中也踩了不少的坑。。。。。。。但是最后还是成功了!
【作品源代码】
package main
import(
"fmt"
"strconv"
"os"
"io"
"bufio"
"os/user"
"strings"
"time"
"math/rand"
)
func DecBin(n int喵)int {
if n == 0 {
return 0
}
s := ""
for q := n; q > 0; q = q / 2 {
m := q % 2
s = fmt.Sprintf("%v%v", m, s)
}
num,_:=strconv.Atoi(s)
return num
}
type Infos struct{
Questions int
name string
scores int
newUser bool
CurrentQuestions int
keepRun bool
ddir string
}
func(info *Infos)getUserScores(){
u,_:=user.Current()
_=os.MkdirAll(u.HomeDir+"\\AppData\\Local\\binaryGames",os.ModePerm)
info.ddir=u.HomeDir+"\\AppData\\Local\\binaryGames\\"
fpath:=info.ddir+"userScores.pkg"
file,_:=os.OpenFile(fpath,os.O_CREATE|os.O_RDONLY,0666)
defer file.Close()
buf:=bufio.NewReader(file)
for{
line,err:=buf.ReadString('\n')
line=strings.TrimSpace(line)
if err != nil && err == io.EOF{
info.scores=0
info.newUser=true
return
}else if a:=strings.Split(line,";");a[0]==info.name{
info.scores,_=strconv.Atoi(a[1])
info.newUser=false
return
}else{}
}
}
func(info *Infos)getName(){
fmt.Print("请输入您的名字:")
fmt.Scanln(&info.name)
}
func(info *Infos)sayHello(){
if info.newUser{
fmt.Println("欢迎加入这个游戏!")
time.Sleep(time.Second/2)
fmt.Println("二进制游戏规则:\n\t在这个游戏中,你会得到一个十进制的数\n\t你的任务是将这个数转换为二进制的数\n\t答对一题加一分,答错一题不扣分。")
time.Sleep(time.Second*1)
fmt.Println("现在开始吧!")
}else{
fmt.Printf("你好,%v,欢迎回来。您当前的分数是:%v。",info.name,info.scores)
fmt.Print("需要再讲一遍游戏规则吗?(1.要 2.不要):")
var ifnds string
fmt.Scanln(&ifnds)
switch ifnds{
case "1":
fmt.Println("好的")
time.Sleep(time.Second/2)
fmt.Println("二进制游戏规则:\n\t在这个游戏中,你会得到一个十进制的数\n\t你的任务是将这个数转换为二进制的数\n\t答对一题加一分,答错一题不扣分。")
case "2":
fmt.Println("好的,现在开始吧")
default:
fmt.Println("......\n好吧,现在开始")
}
}
}
func(info *Infos)ScannumofGame(){
time.Sleep(time.Second/2)
var qesnum string
for{
fmt.Print("问题数(1~15):")
fmt.Scanln(&qesnum)
if numberoq,err:=strconv.Atoi(qesnum);err!=nil{
fmt.Println("请输入正确的数字\n")
}else if numberoq<1{
fmt.Println("问题数不能小于1。\n因此,问题数将设置为1。")
info.Questions=1
break
}else if numberoq>15{
fmt.Println("问题数不能大于15。\n因此,问题数将设置为15。")
info.Questions=15
break
}else{
info.Questions=numberoq
break
}
}
}
func(info *Infos)playGame(){
info.keepRun=true
for info.keepRun{
info.ScannumofGame()
info.CurrentQuestions=info.Questions
var answer string
rand.Seed(time.Now().Unix())
for i:=0;i<info.Questions;i++{
QuestionNum:=rand.Intn(28)+2
TrueAnswer:=DecBin(int喵(QuestionNum))
for{
fmt.Print(QuestionNum,"=")
fmt.Scanln(&answer)
if n,err:=strconv.Atoi(answer);err!=nil && answer==""{
fmt.Println("请输入正确的数字\n\n")
}else if n==TrueAnswer{
fmt.Println("回答正确!\n\n")
info.scores+=1
break
}else{
fmt.Printf("回答错误,正确答案是%v\n\n\n",TrueAnswer)
info.CurrentQuestions-=1
break
}
}
answer=""
}
var i string
fmt.Printf("游戏结束,您答了%v题,答对了%v题。还想玩吗?继续按Enter键,不想玩可以输入\"-1\"退出哦。",info.Questions,info.CurrentQuestions)
fmt.Scanln(&i)
switch i{
case "-1":
fmt.Printf("您当前的分数是%v分。拜拜,欢迎下次来玩!\n",info.scores)
info.writeDatas()
info.keepRun=false
default:
info.keepRun=true
}
}
}
func(info *Infos)writeDatas(){
if info.newUser{
file,_:=os.OpenFile(info.ddir+"userScores.pkg",os.O_APPEND,0666)
defer file.Close()
wt:=bufio.NewWriter(file)
wt.WriteString(fmt.Sprintf("%v;%v\n",info.name,info.scores))
wt.Flush()
}else{
f,_:=os.Create(info.ddir+"nuss.t")
f.Close()
files,_:=os.Open(info.ddir+"userScores.pkg")
filen,_:=os.OpenFile(info.ddir+"nuss.t",os.O_WRONLY,0666)
sf:=bufio.NewReader(files)
nf:=bufio.NewWriter(filen)
for{
line,err:=sf.ReadString('\n')
line=strings.TrimSpace(line)
if err != nil && err==io.EOF{
break
}
if content:=strings.Split(line,";");content[0]==info.name{
nf.WriteString(fmt.Sprintf("%v;%v\n",info.name,info.scores))
nf.Flush()
}else{
nf.WriteString(fmt.Sprintf("%v\n",line))
nf.Flush()
}
}
files.Close()
filen.Close()
os.Remove(info.ddir+"userScores.pkg")
os.Rename(info.ddir+"nuss.t",info.ddir+"userScores.pkg")
}
}
func main(){
var game *Infos=&Infos{}
game.getName()
game.getUserScores()
game.sayHello()
game.playGame()
}
【提示】
别问我为什么发Python专区