一个简单的答题游戏
完整项目
需要一个csv文件
涉及知识点
- 命令解析
- select
- timer
package main
import (
"flag"
"fmt"
"os"
"encoding/csv"
"strings"
"time"
"math/rand"
)
func main(){
csvFileName:= flag.String("csv","problems.csv","导入题文件")
timeOut:= flag.Int("time",4,"设置游戏款慢")
flag.Parse()
//fmt.Println(*csvFileName)
file,err:=os.Open(*csvFileName)
//close file
defer file.Close()
if err != nil{
exit(fmt.Sprintf("打开文件错误:%s",*csvFileName))
}
reader:=csv.NewReader(file)
lines,err:= reader.ReadAll()
if err != nil{
exit("读取失败····")
}
var score = 0
//打乱数组
problems:=shuffle(parseLines(lines))
fmt.Println(problems)
for k,v:=range problems{
t:=time.NewTimer(time.Duration(*timeOut) * time.Second)
fmt.Printf("当前第%d道题:%s\n",k+1,v.q)
answerChan:=make(chan string)
go func() {
var answer string
fmt.Scanf("%s\n",&answer)
answerChan<-answer
}()
select {
case <-t.C:
fmt.Println("--------------------时间到跳过该题-----------------------")
case answer:=<-answerChan:
if answer == strings.TrimSpace(v.a){
score++
fmt.Println("恭喜你答对了")
}
}
fmt.Printf("当前得分%d/%d\n",score,len(lines))
}
}
func parseLines(lines [][]string) []problem{
ret := make([]problem,len(lines))
for k,v:=range lines{
ret[k]=problem{
q:v[0],
a:strings.TrimSpace(v[1]),
}
}
return ret
}
func shuffle(vals []problem)[]problem{
r := rand.New(rand.NewSource(time.Now().Unix()))
ret := make([]problem, len(vals))
randNum:=r.Perm(len(vals))
for i,v:=range randNum {
ret[i] = vals[v]
}
return ret
}
type problem struct {
q string
a string
}
func exit(msg string){
fmt.Println(msg)
os.Exit(1)
}