Newer
Older
Skillsemi2023_WEB_Otaki_Nemoto / flask / testapp / views.py
from flask import render_template, request
from testapp import app
from collections import Counter
import random
import time

# ユーザーごとの点数を格納する辞書
user_score = {}

# playerの数
MAX_PLAYER = 3

# scoreを保存するデータ
data = [0] * MAX_PLAYER
#  user名を保存するデータ
user = [0] * MAX_PLAYER

# ゲーム中の選択肢を保存
choices = []

# ユーザーを識別するための番号(実際の初期値は0にする)
user_number = 0

data_count = 0

order_table = ""

@app.route("/form", methods=["GET", "POST"])
def index():
    global user_number, data_count, order_table
    if request.method == "GET":
        return render_template("testapp/index.html")
    if request.method == "POST":

        # ゲーム開始時にユーザー数を出しておき,それぞれに識別番号を振る
        if request.form.get("username"):
            # ユーザー名を取得し,ユーザー情報を登録←クラス化したほうがいいかも?
            username = request.form.get("username")
            user[user_number] = username
            print("Received name:", username, "UserNumber:", user_number)

            user_number += 1
            # クライアントサイドに識別番号を返す
            return str(user_number - 1)

        # ゲーム中に選択肢を取得し,集計する
        if request.form.get("choice"):
            if len(choices) >= MAX_PLAYER:
                choices.clear()
            choices.append(request.form.get("choice"))
            print("Received choice:", choices)

            if len(choices) >= MAX_PLAYER:  # nemoto変更
                print("集計...")

                return "WAIT"  # nemoto追記

            # 他の人が終わるまで待機(nemoto追記)
        if request.form.get("checkothers"):
            if len(choices) < MAX_PLAYER:
                return "WAIT"
            else:
                most_common_option = calculate_majority(choices)  # nemoto追記
                print("Answer:", most_common_option)
                return str(most_common_option)
            
      
        # ゲーム終了時,識別番号とスコアを受け取り,ランキング上位を返す(作成途中)
        if request.form.get("number") and request.form.get("score"):
            # 識別番号を取得
            user_number = int(request.form.get("number"))
            # スコアを取得
            score = int(request.form.get("score"))  # nemoto変更
            data[user_number] = score
            print(
                "Received number:",
                user_number,
                "\nUserName:",
                user[user_number],
                "\nScore:",
                data[user_number],
            )
            data_count += 1
            if data_count >= MAX_PLAYER:
                scores_order, user_number_order = calculate_order(data)  # nemoto追記
                print(scores_order, user_number_order)
                order_table = create_order_table(scores_order, user_number_order)
            # 戻り値でランキング上位を返す?(仮)
            return "WAIT"
        
        if request.form.get("waitResult"):
            if order_table == "":
                return "WAIT"
            else:
                return order_table
            

          
        # 必要な処理を行う(例:データベースへの書き込みなど)
        return "WAIT"


# 多数派の計算(nemoto追記)
def calculate_majority(get_data):
    counter = Counter(get_data)
    # 最も多く出現する要素を取得する
    get_most_common_option = counter.most_common(1)[0][0]
    return get_most_common_option


# ランキング上位の計算(nemoto追記)
def calculate_order(get_data):
    get_sorted_numbers_with_indices = sorted(
        enumerate(get_data), key=lambda x: x[1], reverse=True
    )
    get_scores = [item[1] for item in get_sorted_numbers_with_indices]
    get_labels = [item[0] for item in get_sorted_numbers_with_indices]
    print("スコア:" + str(get_scores))
    print("識別番号:" + str(get_labels))
    return get_scores, get_labels


def create_order_table(scores, labels):
    order_table = ""
    print(user)
    for i in range(MAX_PLAYER):
        order_table += (
            str(i) + "位  " + user[int(labels[i])] + "  " + str(scores[i]) + "pt\n"
        )

    print(order_table)
    return order_table