From d345263b818bed2c77810d3c68d6589c3e76992d Mon Sep 17 00:00:00 2001 From: bigJIU <1572204178@qq.com> Date: Mon, 3 Apr 2023 14:03:25 +0800 Subject: [PATCH 01/15] Accelerate Try --- newMain.py | 218 ++++++++ templates/Main.html | 1199 ++++++++++++++++++++++++++++++++++++++++++- templates/data.js | 15 +- 3 files changed, 1404 insertions(+), 28 deletions(-) create mode 100644 newMain.py diff --git a/newMain.py b/newMain.py new file mode 100644 index 0000000..6cde2cb --- /dev/null +++ b/newMain.py @@ -0,0 +1,218 @@ +import json +import os +import struct +import uuid + +from IDManager import idManager + +from flask import Flask, render_template, request, redirect, url_for, session +import logging + +# 设置logging模块 +logging.basicConfig(filename='log.txt', level=logging.DEBUG) +# 将print输出重定向到logging模块 +print = logging.getLogger().info + +app = Flask(__name__, static_folder='') +idm = idManager() +app.secret_key = 'asdfasdfawefaewvaf' +replayDataPath = "reps/" +evalDataPath = "evals/" + +questionarePath = "data/questionare.csv" +annotationPath = "data/annotation.csv" +annotationPath2 = "data/annotation2.csv" + + +# id=idm.getId(request.remote_addr) +def getId(): + if 'name' not in session: + session['name'] = str(uuid.uuid4()) + return session['name'] + + +@app.route('/') +def gameinit(): + index = getId() + cid = idm.iniId(index) + return redirect(url_for('Main.html', id=index)) + + +@app.route('/') +def gamewelcome(index): + return render_template('Main.html', id=index) + + +@app.route('/question') +def gamequestion(): + return render_template('GameQuestion.html') + + +@app.route('/result', methods=['POST', 'GET']) +def gamepreplay(): + if request.method == 'POST': + result = request.form + # ip = request.remote_addr + ip = getId() + cid = idm.iniId(ip) + # Save the result to questionare + idm.write_csv(questionarePath, + [cid, + result.get("playeds"), + result.get("playedp"), + result.get("gamestyle"), + result.get("frequency"), + result.get("age") + result.get("myAge"), + result.get("gender") + result.get("myGender"), + ""]) + idm.setControl(cid, result.get("control")) + print(result.get("gamestyle")) + return redirect(url_for('gametutorial', id=cid)) + # debug use: + # return redirect(url_for('gameanno2', id=cid)) + + +@app.route('/gametutorial/') +def gametutorial(id): + return render_template('GameTutorial.html', tutorial=idm.addTutorial(id), next=idm.hasNextTutorial(id), + maxT=idm.tutorialMax, + control=idm.getControl(id)) + + +@app.route('/again') +def gamepreplayAgain(): + return redirect(url_for('gameplay', id=getId())) + + +@app.route('/gametutorial//data') +def gametutorialdata(id): + return redirect(url_for('gameplay', id=id)) + + +@app.route('/gameplay/') +def gameplay(id): + gamelevels = idm.getLevels(id) + return render_template('GamePlay.html', gamelevels=gamelevels, control=idm.getControl(id), levelNum=2, + jump="/annotation") + + +@app.route('/gameplay//data', methods=['POST']) +def getJSONData(id): + if request.method == 'POST': + print("POST Game") + resultList = list(request.form)[0].split(",") + saveFile(replayDataPath, id + resultList[0][:-2], resultList[1:]) + return "return!" + + +@app.route('/annotation') +def gamepreanno(): + return redirect(url_for('gameanno', id=getId())) + + +@app.route('/annotation/') +def gameanno(id): + if (id != "radioresult"): + print("anno " + id) + gamelevels = idm.getRecent(id) + + level1 = "lvl" + str(gamelevels[0]) + level2 = "lvl" + str(gamelevels[1]) + return render_template('GameAnnotation.html', level1=level1, level2=level2) + + +@app.route('/annotation/radioresult', methods=['POST']) +def getRadioData(): + ip = getId() + + if request.method == 'POST': + print("POST Eval") + result = request.form + ipRecent = idm.getRecent(ip) + idm.write_csv(annotationPath, [ip, ipRecent[0], ipRecent[1], result["fun"]]) + + if idm.getTimes(ip): + return redirect(url_for("gameplay2", id=ip)) + else: + idm.addTimes(ip) + return redirect(url_for("gameplay", id=ip)) + + +@app.route('/gameplay2') +def gamepreplay2(): + return redirect(url_for('gameplay2', id=getId())) + + +@app.route('/gameplay2/') +def gameplay2(id): + gamelevels = idm.getTypeLevels(id) + return render_template('GamePlay.html', gamelevels=gamelevels, control=idm.getControl(id), levelNum=3, + jump="/annotation2") + + +@app.route('/gameplay2//data', methods=['POST']) +def getJSONData2(id): + if request.method == 'POST': + print("POST Game") + resultList = list(request.form)[0].split(",") + saveFile(replayDataPath, id + resultList[0][:-2], resultList[1:]) + return "return!" + + +@app.route('/annotation2') +def gamepreanno2(): + return redirect(url_for('gameanno2', id=getId())) + + +@app.route('/annotation2/') +def gameanno2(id): + if id != "result": + print("anno " + id) + gamelevels = idm.getRecent(id) + # gamelevels = idm.getTypeLevels(id) + level1 = gamelevels[0] + level2 = gamelevels[1] + level3 = gamelevels[2] + return render_template('GameAnnotation2.html', level1=level1, level2=level2, level3=level3) + else: + print(id) + + +@app.route('/annotation2//result', methods=['POST']) +def gameannoresult2(id): + if request.method == 'POST': + print("result: " + id) + + resultList = list(request.form)[0].split(",") + levelList = idm.getRecent(getId()) + + idm.write_csv(annotationPath2, + [getId(), resultList[0], resultList[1], resultList[2], levelList[0], levelList[1], + levelList[2], + ""]) + + if idm.getTimes(id): + return redirect(url_for("over", id=id)) + else: + idm.addTimes(id) + return redirect(url_for("gameplay2", id=id)) + + +@app.route("/gameover") +def over(): + finish = idm.getTimes(getId()) + + return render_template("GameOver.html", finish=1, stage=1) + + +def saveFile(path, filename, content): + cp = list(map(int, content)) + file_dir = os.path.join(os.getcwd(), path) + file_path = os.path.join(file_dir, filename + ".rep") + with open(file_path, 'wb') as f: + f.write(b''.join(struct.pack('B', c) for c in cp)) + + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=80, debug=False) + # app.run() diff --git a/templates/Main.html b/templates/Main.html index 7ac6198..6e1456e 100644 --- a/templates/Main.html +++ b/templates/Main.html @@ -1,22 +1,1193 @@ + + + + + - - Title - - - - + + + + + + + + + AI and Games + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ +
+

Purpose of the Experiment

+
    +
  • + This Experiment is designed to study the notion of "fun" elicited while playing Super + Mario + Bros levels. + +
+
+

Procedure of the Experiment

+
    +
  • This experiment has three phases. +
      +
    1. First you must answer a questionnaire.
    2. +
    3. Then you will complete a short game tutorial, play 2 levels of the game and answer a + simple question. You will play another 2 levels.
    4. +
    5. Finally you will play 3 levels and answer a simple question.
    6. +
    7. You can also replay the second phase after finishing the whole process.
    8. +
    +
  • In total, the experiment takes approximately 15 minutes to complete.
  • +
  • Have Fun! +
+ +

+ + +
+
+
+
+ + + + +
+
+
+ +
+

+

Copyright © Jialin Liu

+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+

+ Questionnaire +

+
+
+ +

+

1. Have you played Super Mario Bros before?

+ + + +

+ +

+

2. Have you ever played platform games like Super Mario Bros?

+ + + +

+ +

+

3. Which following selection represents you the best in Super Mario Bros?

+ + + + +

+ + +

+

4. How often do you play games?

+ + + + + +

+ +

+

5. What is your age?

+ + + +

+ +

+

6. What is your gender?

+ + + + + +

+ +

+

7. Please choose your control for later games.

+ + + +

+ + + +
+

+
+ +
+ +
+
+ +
+ + + + + + + +
+
+
+ +
+

+

Copyright © Jialin Liu

+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+
+ +

Super Mario Bros Tutorial

+

Before proceeding to the main part of the experiment please familiarize yourself with the game.
+ You may proceed to the next phase of this survey once you are ready!

+ + Click ME to show the instruction page again. + +

If the game is not responding to your keyboard, please click on the game screen.

+
+ + + + +
+ +
+
+
Loading
+
+ +
+ +
+ + + + +
+
+ + + + +
+
+ + + +
+ +
+ +
+ + + +
+ + + +
+ + + + +
+
+
+ +
+

+

Copyright © Jialin Liu

+ +
+ +
+
+
+ + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/templates/data.js b/templates/data.js index 14f5c6d..f302de2 100644 --- a/templates/data.js +++ b/templates/data.js @@ -11,17 +11,7 @@ function getValue(){ } } } -// function PostToServer(data) { -// var httpRequest = new XMLHttpRequest();//第一步:建立所需的对象 -// httpRequest.open("POST",""); //调用AddDataToServer -// httpRequest.setRequestHeader("Content-Type", "application/json"); //设置请求头信息 -// httpRequest.onreadystatechange = function () { -// if (httpRequest.readyState == 4 && httpRequest.status == 200) { -// //alert('添加成功'); -// } -// } -// httpRequest.send(JSON.stringify(data)); //设置为发送给服务器数据 -// } + function PostToServer(url,data) { if(url == null){ $.post(window.location.href, data); @@ -59,9 +49,6 @@ function PlayLevel(level,control){ alert(obj[i].value); } } - // var radio = document.getElementsByName("gameRadio"); - // var addressID = $("input[name='sex']:checked").val(); - // alert(addressID) } From 0de883ae542cd0e72e1dbc84d92f4d24208d5fc7 Mon Sep 17 00:00:00 2001 From: bigJIU <1572204178@qq.com> Date: Mon, 3 Apr 2023 14:53:14 +0800 Subject: [PATCH 02/15] Add Level Count down --- IDManager.py | 2 ++ main.py | 30 ++++++++++++++++++++---------- templates/GamePlay.html | 17 +++++++++++++++++ templates/GameQuestion.html | 31 ++----------------------------- 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/IDManager.py b/IDManager.py index 9d6a657..3d1c971 100644 --- a/IDManager.py +++ b/IDManager.py @@ -98,6 +98,8 @@ class idManager(): def setTimes(self, ip): self.ip_time[ip] = 0 + # 1 For next step + # 0 For not next step def getTimes(self, ip): if ip not in self.ip_time.keys(): diff --git a/main.py b/main.py index 2690f86..80095c7 100644 --- a/main.py +++ b/main.py @@ -22,13 +22,16 @@ evalDataPath = "evals/" questionarePath = "data/questionare.csv" annotationPath = "data/annotation.csv" annotationPath2 = "data/annotation2.csv" +feedbackPath = "data/feedback.csv" -#id=idm.getId(request.remote_addr) + +# id=idm.getId(request.remote_addr) def getId(): if 'name' not in session: session['name'] = str(uuid.uuid4()) return session['name'] + @app.route('/') def gamewelcome(): ip = getId() @@ -55,8 +58,8 @@ def gamepreplay(): result.get("playedp"), result.get("gamestyle"), result.get("frequency"), - result.get("age")+result.get("myAge"), - result.get("gender")+result.get("myGender"), + result.get("age") + result.get("myAge"), + result.get("gender") + result.get("myGender"), ""]) idm.setControl(cid, result.get("control")) print(result.get("gamestyle")) @@ -67,7 +70,8 @@ def gamepreplay(): @app.route('/gametutorial/') def gametutorial(id): - return render_template('GameTutorial.html', tutorial=idm.addTutorial(id), next=idm.hasNextTutorial(id),maxT=idm.tutorialMax, + return render_template('GameTutorial.html', tutorial=idm.addTutorial(id), next=idm.hasNextTutorial(id), + maxT=idm.tutorialMax, control=idm.getControl(id)) @@ -85,6 +89,7 @@ def gametutorialdata(id): def gameplay(id): gamelevels = idm.getLevels(id) return render_template('GamePlay.html', gamelevels=gamelevels, control=idm.getControl(id), levelNum=2, + times=idm.getTimes(id), jump="/annotation") @@ -93,7 +98,7 @@ def getJSONData(id): if request.method == 'POST': print("POST Game") resultList = list(request.form)[0].split(",") - saveFile(replayDataPath, id + resultList[0][:-2], resultList[1:]) + saveFile(replayDataPath, id + "_" + resultList[0][:-2], resultList[1:]) return "return!" @@ -147,7 +152,7 @@ def getJSONData2(id): if request.method == 'POST': print("POST Game") resultList = list(request.form)[0].split(",") - saveFile(replayDataPath, id + resultList[0][:-2], resultList[1:]) + saveFile(replayDataPath, id+"_" + resultList[0][:-2], resultList[1:]) return "return!" @@ -174,11 +179,8 @@ def gameanno2(id): def gameannoresult2(id): if request.method == 'POST': print("result: " + id) - resultList = list(request.form)[0].split(",") levelList = idm.getRecent(getId()) - - idm.write_csv(annotationPath2, [getId(), resultList[0], resultList[1], resultList[2], levelList[0], levelList[1], levelList[2], @@ -194,10 +196,18 @@ def gameannoresult2(id): @app.route("/gameover") def over(): finish = idm.getTimes(getId()) - return render_template("GameOver.html", finish=1, stage=1) +@app.route("/gameover//feedback", methods=['POST']) +def overa(): + if request.method == 'POST': + resultList = list(request.form)[0].split(",") + idm.write_csv(feedbackPath, + [getId(), resultList[0], + ""]) + + def saveFile(path, filename, content): cp = list(map(int, content)) file_dir = os.path.join(os.getcwd(), path) diff --git a/templates/GamePlay.html b/templates/GamePlay.html index d22ab63..485ce45 100644 --- a/templates/GamePlay.html +++ b/templates/GamePlay.html @@ -187,6 +187,7 @@
+

There are 7 levels left

If the game is not responding to your keyboard, please click on the game screen.

@@ -201,6 +202,7 @@ cheerpjInit(); var divElement = document.getElementById("GameWindow"); var title = document.getElementById("Head"); + var leftLevel = document.getElementById("leftLevel") var levelNum = Number("{{levelNum}}") var levels = getLevels("{{gamelevels}}", levelNum); var levelNames = ["Level A", "Level B", "Level C", "Level D"]; @@ -215,8 +217,19 @@ console.log("GameLoad Initialize Succeed!"); document.getElementById("loading").style.visibility = 'hidden'; }) + leftNum = 0; + if(levelNum === 3) {leftNum = 2} + else { + if ("{{times}}"==1){ + leftNum = 4; + }else{ + leftNum = 6; + } + } + leftLevel.innerText = "There are " + leftNum +" levels left." + leftNum--; for (i = 0; i < levelNum - 1; i++) { console.log("Play level: %s", levels[i]) PlayLevel(levels[i], control) @@ -225,6 +238,8 @@ console.log(i) var index = levelNames.indexOf(title.innerText); title.innerText = levelNames[index + 1]; + leftLevel.innerText = "There are " + leftNum +" levels left." + leftNum--; }); } @@ -235,7 +250,9 @@ }); + function LeftNum(times, level){ + } diff --git a/templates/GameQuestion.html b/templates/GameQuestion.html index 1e60897..b301af8 100644 --- a/templates/GameQuestion.html +++ b/templates/GameQuestion.html @@ -312,23 +312,6 @@ None of above

- -

4. How often do you play games?

- - -

From 52d24998de1b946b9410175396ea9663471c861f Mon Sep 17 00:00:00 2001 From: Doveliyuchen Date: Mon, 3 Apr 2023 15:16:27 +0800 Subject: [PATCH 03/15] Update personal web Update the last page and add more info --- templates/GameOver.html | 31 +++++++++++++++++++++++++++---- templates/Web/Malta.png | Bin 0 -> 14277 bytes 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 templates/Web/Malta.png diff --git a/templates/GameOver.html b/templates/GameOver.html index 74c4e56..dce88b2 100644 --- a/templates/GameOver.html +++ b/templates/GameOver.html @@ -173,7 +173,7 @@
-
+

Thank You For Playing!!!

@@ -186,6 +186,22 @@

+ +
+
+

Do you have any feedback?

+
+
+ +

+ +
+ + +
+ + +
+
+
This page is created by Haocheng Du, Yuchen Li; game content is generated by Ziqi Wang. This project is supported by Dr. Liu and Prof. Yannakakis.
- - +

@@ -241,4 +264,4 @@ - \ No newline at end of file + diff --git a/templates/Web/Malta.png b/templates/Web/Malta.png new file mode 100644 index 0000000000000000000000000000000000000000..9890bd312fcd6d524e4bd63ecc309370fca7dc35 GIT binary patch literal 14277 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 literal 0 HcmV?d00001 From 7636bdd2d16aacb73198fe04fcc6da3dee8c9821 Mon Sep 17 00:00:00 2001 From: bigJIU <1572204178@qq.com> Date: Mon, 3 Apr 2023 18:30:28 +0800 Subject: [PATCH 04/15] Update left wording --- reps/127.0.0.1.txt | 0 templates/GamePlay.html | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 reps/127.0.0.1.txt diff --git a/reps/127.0.0.1.txt b/reps/127.0.0.1.txt deleted file mode 100644 index e69de29..0000000 diff --git a/templates/GamePlay.html b/templates/GamePlay.html index 485ce45..ac147f0 100644 --- a/templates/GamePlay.html +++ b/templates/GamePlay.html @@ -228,7 +228,7 @@ } } - leftLevel.innerText = "There are " + leftNum +" levels left." + leftLevel.innerText = leftNum +" levels left." leftNum--; for (i = 0; i < levelNum - 1; i++) { console.log("Play level: %s", levels[i]) @@ -238,7 +238,7 @@ console.log(i) var index = levelNames.indexOf(title.innerText); title.innerText = levelNames[index + 1]; - leftLevel.innerText = "There are " + leftNum +" levels left." + leftLevel.innerText = leftNum +" levels left." leftNum--; }); } From d4602283ebaaf28903c247d28bace84459c392ac Mon Sep 17 00:00:00 2001 From: Doveliyuchen Date: Tue, 4 Apr 2023 09:27:51 +0800 Subject: [PATCH 05/15] Update Update server data recieve --- .idea/.name | 1 + .idea/MarioWeb.iml | 2 +- .idea/misc.xml | 2 +- main.py | 18 ++++++++++++------ templates/GameOver.html | 37 ++++++++++++++++++++++++++++++++----- 5 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 .idea/.name diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..11a5d8e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +main.py \ No newline at end of file diff --git a/.idea/MarioWeb.iml b/.idea/MarioWeb.iml index 37901ac..4f8673c 100644 --- a/.idea/MarioWeb.iml +++ b/.idea/MarioWeb.iml @@ -5,7 +5,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index d56657a..81644ce 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/main.py b/main.py index 80095c7..8f5a5c9 100644 --- a/main.py +++ b/main.py @@ -193,21 +193,27 @@ def gameannoresult2(id): return redirect(url_for("gameplay2", id=id)) -@app.route("/gameover") +@app.route("/gameover",methods=['POST','GET']) def over(): finish = idm.getTimes(getId()) - return render_template("GameOver.html", finish=1, stage=1) - - -@app.route("/gameover//feedback", methods=['POST']) -def overa(): if request.method == 'POST': resultList = list(request.form)[0].split(",") idm.write_csv(feedbackPath, [getId(), resultList[0], ""]) + return render_template("GameOver.html", finish=1, stage=1) + +# @app.route('/feedback', methods=['POST']) +# def overa(): +# if request.method == 'POST': +# resultList = list(request.form)[0].split(",") +# idm.write_csv(feedbackPath, +# [getId(), resultList[0], +# ""]) + + # return redirect(url_for("over", id=id)) def saveFile(path, filename, content): cp = list(map(int, content)) file_dir = os.path.join(os.getcwd(), path) diff --git a/templates/GameOver.html b/templates/GameOver.html index dce88b2..187ed60 100644 --- a/templates/GameOver.html +++ b/templates/GameOver.html @@ -3,7 +3,7 @@ - + @@ -189,9 +189,10 @@

-

Do you have any feedback?

+ +
+

Do you have any feedback?


-

- +
@@ -250,7 +277,7 @@ - + From 5fca4056074271483f6ef03867196c7802ab3f40 Mon Sep 17 00:00:00 2001 From: Doveliyuchen Date: Tue, 4 Apr 2023 09:44:36 +0800 Subject: [PATCH 06/15] Update GameWelcome.html --- templates/GameWelcome.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/templates/GameWelcome.html b/templates/GameWelcome.html index 53fe4ea..2857ff2 100644 --- a/templates/GameWelcome.html +++ b/templates/GameWelcome.html @@ -289,6 +289,10 @@
+
This page is created by Haocheng Du, Yuchen Li; game content is generated by Ziqi Wang. This project is supported by Dr. Liu and Prof. Yannakakis.
+ +

+