Skip to content

Commit

Permalink
Exercise vertex degree
Browse files Browse the repository at this point in the history
  • Loading branch information
loig committed May 11, 2021
1 parent d345a3c commit 83330b4
Show file tree
Hide file tree
Showing 9 changed files with 168 additions and 4 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ ex2gr
assets/*.png~
assets/*.kra
assets/*.kra~
ex2grSave.json
9 changes: 8 additions & 1 deletion answers.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package main

import "github.com/hajimehoshi/ebiten/v2"
import (
"github.com/hajimehoshi/ebiten/v2"
)

type answerSheet struct {
xposition int
yposition int
aboveText *ebiten.Image
buttons []button
clics []int
numClics *int
}

type button struct {
Expand All @@ -23,6 +26,8 @@ func (a *answerSheet) init(x, y int) {
a.yposition = y
a.buttons = make([]button, 0)
a.clics = make([]int, 0)
numClics := 0
a.numClics = &numClics
}

func (a *answerSheet) addButton(x, y int, content *ebiten.Image) {
Expand Down Expand Up @@ -60,13 +65,15 @@ func (b *button) isOver(x, y int) bool {
func (a *answerSheet) clic(buttonID int) {
if buttonID >= 0 && buttonID < len(a.buttons) {
a.clics[buttonID]++
*(a.numClics)++
}
}

func (a *answerSheet) resetClics() {
for i := range a.clics {
a.clics[i] = 0
}
*(a.numClics) = 0
}

func (a *answerSheet) draw(screen *ebiten.Image, buttonSelected int) {
Expand Down
20 changes: 20 additions & 0 deletions assets.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,14 @@ var generalTitleImage *ebiten.Image
var quitGameAsset []byte
var quitGameImage *ebiten.Image

//go:embed assets/ex-degreegraph.png
var degreeGraphAsset []byte
var degreeGraphImage *ebiten.Image // should maybe be created only when needed

//go:embed assets/extitle-degreegraph.png
var titleDegreeGraphAsset []byte
var titleDegreeGraphImage *ebiten.Image // should maybe be created only when needed

const spriteSide int = 64
const menuSpriteSide int = 128

Expand Down Expand Up @@ -494,6 +502,18 @@ func loadAssets() {
log.Fatal(err)
}
quitGameImage = ebiten.NewImageFromImage(decodedAsset)

decodedAsset, _, err = image.Decode(bytes.NewReader(degreeGraphAsset))
if err != nil {
log.Fatal(err)
}
degreeGraphImage = ebiten.NewImageFromImage(decodedAsset)

decodedAsset, _, err = image.Decode(bytes.NewReader(titleDegreeGraphAsset))
if err != nil {
log.Fatal(err)
}
titleDegreeGraphImage = ebiten.NewImageFromImage(decodedAsset)
}

// split the graphElementsImage
Expand Down
Binary file added assets/ex-degreegraph.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/extitle-degreegraph.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
129 changes: 129 additions & 0 deletions ex-degreegraph.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package main

import (
"image"
"math/rand"

"github.com/hajimehoshi/ebiten/v2"
)

func initDegreeGraph(correction bool, graphCode, questionCode, answerCode int) (e exo, gCode, qCode int) {

e.BasicSetup()
e.id = degreeGraph
e.successRequired = 5

numNodes := 4

elementSpacing := 100

// title setup
e.titleImage = titleDegreeGraphImage
xTitleShift, yTitleShift := e.titleImage.Size()
e.titleXPosition = (windowWidth - xTitleShift) / 2
e.titleYPosition = elementSpacing
e.successCounterY = elementSpacing + yTitleShift
yTitleShift += spriteSide

// graph setup
e.modifiableGraph = false
e.modifiableAdjMatr = false
e.displayGraph = true
e.displayAdjMatr = false

if correction {
e.g.decode(graphCode, numNodes)
gCode = graphCode
} else {
e.g.genConnectedGraph(numNodes, 4, 12, -1, -1)
gCode = e.g.encode()
}
e.g.linkMatrGraph = false

nodeSpacing := 300
e.g.xposition = (windowWidth - nodeSpacing) / 2
e.g.yposition = 2*elementSpacing + yTitleShift
e.g.xsize = nodeSpacing
e.g.ysize = nodeSpacing

e.g.nodes[0].loopPosition = loopTopLeft
e.g.nodes[1].xposition = nodeSpacing
e.g.nodes[1].loopPosition = loopTopRight
e.g.nodes[2].yposition = nodeSpacing
e.g.nodes[2].loopPosition = loopBottomLeft
e.g.nodes[3].xposition = nodeSpacing
e.g.nodes[3].yposition = nodeSpacing
e.g.nodes[3].loopPosition = loopBottomRight

// question setup
var from int
if correction {
from, _ = decodeFromToQuestion(questionCode, numNodes)
qCode = questionCode
} else {
from = rand.Intn(numNodes)
qCode = encodeFromToQuestion(from, from, numNodes)
}
xshift, yshift := degreeGraphImage.Size()
e.drawQuestion = func(screen *ebiten.Image) {
options := ebiten.DrawImageOptions{}
options.GeoM.Translate(float64((windowWidth-xshift)/2), float64(e.g.ysize+4*elementSpacing+yTitleShift))
screen.DrawImage(
degreeGraphImage,
&options,
)
// from label
options.GeoM.Translate(float64(8*spriteSide+5), 8)
xLabel := from % 10
yLabel := from / 10
labelSubimage := image.Rect(
xLabel*spriteSide, (yLabel+1)*spriteSide,
(xLabel+1)*spriteSide, (yLabel+2)*spriteSide,
)
screen.DrawImage(
graphElementsImage.SubImage(labelSubimage).(*ebiten.Image),
&options,
)
}

// answers setup
e.hasAnswerSheet = true
answerSize := menuSpriteSide / 2
e.answers.init((windowWidth-15*answerSize)/2, e.g.ysize+yshift+4*elementSpacing+20+yTitleShift)
for i := 0; i < 10; i++ {
x := (i % 6) * (menuSpriteSide / 2)
y := (i / 6) * (menuSpriteSide / 2)
e.answers.addButton(i*3*answerSize/2+answerSize/4, 0, menuElementsImage.SubImage(image.Rect(x, y+menuSpriteSide, x+menuSpriteSide/2, y+menuSpriteSide+menuSpriteSide/2)).(*ebiten.Image))
}

answer := len(e.g.successorsList[from])
for i := 0; i < len(e.g.edges); i++ {
if i != from {
if e.g.edges[i][from] > 0 {
answer++
}
}
}

if correction {
if answerCode < len(e.answers.clics) && answerCode >= 0 {
e.answers.clics[answerCode] = 1
}
}

e.checkResult = func() (bool, bool) {
return e.answers.clics[answer] >= 1, *(e.answers.numClics) >= 1
}

e.codeAnswer = func() int {
for answerID, clics := range e.answers.clics {
if clics > 0 {
return answerID
}
}
return 0
}

// return exercise
return e, gCode, qCode
}
2 changes: 1 addition & 1 deletion exo.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ func (e *exo) draw(screen *ebiten.Image, correction bool) {
e.drawTitle(screen)

// quit
if !e.done {
if !e.done && !correction {
e.quitButton.draw(screen, e.selectedQuitButton)
}

Expand Down
5 changes: 5 additions & 0 deletions exolist.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const (
isTreeGraph
isTreeList
isTreeMatr
degreeGraph
globalNumExo
)

Expand Down Expand Up @@ -75,6 +76,8 @@ func (g *game) initExo(exNum int) {
g.e, g.exState.descriptionExo = initListToMatr(g.correctionMode, g.exState.descriptionExo, g.exState.answer)
case matrToList:
g.e, g.exState.descriptionExo = initMatrToList(g.correctionMode, g.exState.descriptionExo, g.exState.answer)
case degreeGraph:
g.e, g.exState.descriptionExo, g.exState.descriptionQuestion = initDegreeGraph(g.correctionMode, g.exState.descriptionExo, g.exState.descriptionQuestion, g.exState.answer)
}

log.Print(g.exState.encode())
Expand Down Expand Up @@ -120,6 +123,8 @@ func getExTitlePerNum(exNum int) *ebiten.Image {
return titleListToMatrImage
case matrToList:
return titleMatrToListImage
case degreeGraph:
return titleDegreeGraphImage
}

return nil
Expand Down
6 changes: 4 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package main
import (
"flag"
"log"
"math/rand"
"time"

"github.com/hajimehoshi/ebiten/v2"
)
Expand All @@ -12,10 +14,10 @@ const (
windowHeight = 1448
)

// ajouter flag pour lire la seed

func main() {

rand.Seed(time.Now().UnixNano())

restartPoint := flag.String("seed", "", "Utiliser pour reprendre sur un exercice donné.")
flag.Parse()
saveFile := flag.String("sauvegarde", "ex2grSave.json", "Utiliser pour changer le fichier de sauvegarde")
Expand Down

0 comments on commit 83330b4

Please sign in to comment.