使用临时 table 数据填充一组变量
Populate a set of variables with temporary table data
我开始创建一个 MySQL 程序来模拟 Risk 中的攻击和防御骰子游戏!游戏。该程序将攻击者和防御者的军队数量(由骰子表示)作为输入参数,然后掷骰子和 returns 在战斗中幸存的军队数量。
攻击方和防御方各自打出自己的骰子,然后按降序排列,然后逐对比较,将具有最高值的攻击骰子与具有最高值的防御骰子进行比较,然后对其他骰子进行相同的操作(如果可用)。
我通过将结果放在两个临时表中对骰子进行排序,然后使用 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;
对防御骰子变量做同样的事情。
我开始创建一个 MySQL 程序来模拟 Risk 中的攻击和防御骰子游戏!游戏。该程序将攻击者和防御者的军队数量(由骰子表示)作为输入参数,然后掷骰子和 returns 在战斗中幸存的军队数量。
攻击方和防御方各自打出自己的骰子,然后按降序排列,然后逐对比较,将具有最高值的攻击骰子与具有最高值的防御骰子进行比较,然后对其他骰子进行相同的操作(如果可用)。
我通过将结果放在两个临时表中对骰子进行排序,然后使用 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;
对防御骰子变量做同样的事情。