반응형
변수 집합을 임시 테이블 데이터로 채우기
저는 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
반응형
'programing' 카테고리의 다른 글
Redis - 클러스터를 사용하여 데이터 손실 방지(가십 프로토콜 사용) (0) | 2023.07.22 |
---|---|
스프링에서 주석을 통해 생성자에 매개변수 주입 (0) | 2023.07.22 |
쿼리를 사용하여 에 삽입하고 기본값을 추가합니다. (0) | 2023.07.22 |
Jackson이 Spring Boot에서 레이지 로드 특성을 생략하도록 구성 (0) | 2023.07.22 |
Python Panda 데이터 프레임(값별 또는 참조별) (0) | 2023.07.22 |