programing

변수 집합을 임시 테이블 데이터로 채우기

padding 2023. 7. 22. 09:30
반응형

변수 집합을 임시 테이블 데이터로 채우기

저는 Risk! 게임에서 공격과 방어의 주사위 플레이를 시뮬레이션하기 위한 MySQL 프로시저를 만들기 시작했습니다.이 절차는 공격자와 수비자의 군대 수(다이스로 표시됨)를 입력 인수로 취한 다음 다이스를 재생하고 전투에서 살아남은 군대 수를 반환합니다.공격자와 수비자는 각자의 주사위를 가지고 플레이한 다음 내림차순으로 순서를 정하고, 가장 높은 값을 가진 공격 주사위와 가장 높은 값을 가진 방어 주사위를 커플별로 비교한 다음, 가능한 경우 다른 주사위와 동일하게 합니다.저는 두 개의 임시 테이블에 결과를 넣은 다음 다음 다음과 같이 정렬하여 주사위를 정렬했습니다.ALTER TABLE attack_table, ORDER BY dice, DESC하지만 지금은 변수를 다시 채우는 방법을 모르겠습니다.

var_dice_1_attack
var_dice_2_attack
var_dice_3_attack
var_dice_1_defense
var_dice_2_defense
var_dice_3_defense

코드는

CREATE PROCEDURE IF NOT EXISTS `risk`.`play_dices`(INOUT attack INT, INOUT defense INT)
BEGIN
    DECLARE var_dice_1_attack INT;
    DECLARE var_dice_2_attack INT;
    DECLARE var_dice_3_attack INT;
    DECLARE var_dice_1_defense INT;
    DECLARE var_dice_2_defense INT;
    DECLARE var_dice_3_defense INT;
    
    CREATE TEMPORARY TABLE attack_table (dice INT NOT NULL);
    CREATE TEMPORARY TABLE defense_table (dice INT NOT NULL);
    
    -- FLOOR(RAND() * (<max> - <min> + 1)) + <min>
    -- generates a number between <min> and <max> inclusive 
    CASE attack
        WHEN '1' THEN
            SET var_dice_1_attack = FLOOR(RAND() * 6) + 1;
            INSERT INTO attack_table (dice) VALUE (var_dice_1_attack);
        WHEN '2' THEN
            SET var_dice_1_attack = FLOOR(RAND() * 6) + 1;
            SET var_dice_2_attack = FLOOR(RAND() * 6) + 1;
            INSERT INTO attack_table (dice) VALUE (var_dice_1_attack);
            INSERT INTO attack_table (dice) VALUE (var_dice_2_attack);
        WHEN '3' THEN
            SET var_dice_1_attack = FLOOR(RAND() * 6) + 1;
            SET var_dice_2_attack = FLOOR(RAND() * 6) + 1;
            SET var_dice_3_attack = FLOOR(RAND() * 6) + 1;
            INSERT INTO attack_table (dice) VALUE (var_dice_1_attack);
            INSERT INTO attack_table (dice) VALUE (var_dice_2_attack);
            INSERT INTO attack_table (dice) VALUE (var_dice_3_attack);
    END CASE;
    
    ALTER TABLE attack_table, ORDER BY dice, DESC;
    
    CASE defense
        WHEN '1' THEN
            SET var_dice_1_defense = FLOOR(RAND() * 6) + 1;
            INSERT INTO defense_table (dice) VALUE (var_dice_1_defense);
        WHEN '2' THEN
            SET var_dice_1_defense = FLOOR(RAND() * 6) + 1;
            SET var_dice_2_defense = FLOOR(RAND() * 6) + 1;
            INSERT INTO defense_table (dice) VALUE (var_dice_1_defense);
            INSERT INTO defense_table (dice) VALUE (var_dice_2_defense);
        WHEN '3' THEN
            SET var_dice_1_defense = FLOOR(RAND() * 6) + 1;
            SET var_dice_2_defense = FLOOR(RAND() * 6) + 1;
            SET var_dice_3_defense = FLOOR(RAND() * 6) + 1;
            INSERT INTO defense_table (dice) VALUE (var_dice_1_defense);
            INSERT INTO defense_table (dice) VALUE (var_dice_2_defense);
            INSERT INTO defense_table (dice) VALUE (var_dice_3_defense);
    END CASE;
    
    ALTER TABLE defense_table, ORDER BY dice, DESC;

정보 완전성을 위해 공격과 방어 다이사이의 비교를 실행하는 코드도 공격합니다.

IF (var_dice_1_attack IS NOT NULL) AND (var_dice_1_defense IS NOT NULL) THEN
    IF var_dice_1_attack > var_dice_1_defense THEN
        SET defense = defense - 1;
        IF defense < 0 THEN
            signal sqlstate '45003' set message_text = "Error, number of defense armies is negative";
        END IF;
    ELSEIF var_dice_1_attack <= var_dice_1_defense THEN
        SET attack = attack - 1;
        IF attack < 0 THEN
            signal sqlstate '45003' set message_text = "Error, number of attack armies is negative";
        END IF;
    END IF;
END IF;
IF (var_dice_2_attack IS NOT NULL) AND (var_dice_2_defense IS NOT NULL) THEN
    IF var_dice_2_attack > var_dice_2_defense THEN
        SET defense = defense - 1;
        IF defense < 0 THEN
            signal sqlstate '45003' set message_text = "Error, number of defense armies is negative";
        END IF;
    ELSEIF var_dice_2_attack <= var_dice_2_defense THEN
        SET attack = attack - 1;
        IF attack < 0 THEN
            signal sqlstate '45003' set message_text = "Error, number of attack armies is negative";
        END IF;
    END IF;
END IF;
IF (var_dice_3_attack IS NOT NULL) AND (var_dice_3_defense IS NOT NULL) THEN
    IF var_dice_3_attack > var_dice_3_defense THEN
        SET defense = defense - 1;
        IF defense < 0 THEN
            signal sqlstate '45003' set message_text = "Error, number of defense armies is negative";
        END IF;
    ELSEIF var_dice_3_attack <= var_dice_3_defense THEN
        SET attack = attack - 1;
        IF attack < 0 THEN
            signal sqlstate '45003' set message_text = "Error, number of attack armies is negative";
        END IF;
    END IF;
END IF;

DROP TEMPORARY TABLE attack_table;
DROP TEMPORARY TABLE defense_table;

END

다음 작업을 수행한 후 추가할 수 있습니다.ALTER TABLE ... ORDER BY dice DESC;:

    ALTER TABLE attack_table ORDER BY dice DESC;

CASE attack
    WHEN '1' THEN
        SET var_dice_1_attack = (SELECT dice FROM attack_table  limit 1);
    WHEN '2' THEN
        SET var_dice_1_attack = (SELECT dice FROM attack_table  limit 1);
        SET var_dice_2_attack = (SELECT dice FROM attack_table  limit 1,1);
    WHEN '3' THEN
        SET var_dice_1_attack = (SELECT dice FROM attack_table  limit 1);
        SET var_dice_2_attack = (SELECT dice FROM attack_table  limit 1,1);
        SET var_dice_3_attack = (SELECT dice FROM attack_table  limit 2,1);
END CASE;

그리고 방어 주사위 변수에 대해서도 동일한 작업을 수행합니다.

만지작거리다

언급URL : https://stackoverflow.com/questions/63743255/populate-a-set-of-variables-with-temporary-table-data

반응형