2016-07-02 12 views
0

我正在開發一個類似Risiko!的遊戲的桌面應用程序,它基於一些數據庫程序。SQL QUERY:如何在表中爲不同的行分配不同的值,以便在另一個表中分配不同的行?

我需要爲每個玩家分配一系列不相等的,分配給其他玩家的行。

我已經試過這樣的事情,但不工作:

`create or replace PROCEDURE "giveterritory" 
    (idpartita NUMBER,nr_partecipanti number) 
    is 

begin 

DECLARE 

CURSOR cur_file IS 

SELECT * 
FROM Player 
WHERE idgame = Player.idgame ; 

var_cur cur_file%ROWTYPE; 

cont number ; 
nr_territories_gioc_prec number ; 
G1_Terr int ; 
G2_Terr int ; 
G3_Terr int ; 
G1_ID number; 
G2_ID number; 
G3_ID number; 
begin 

cont:=0 ; 

for var_cur in cur_file 

loop 

cont := cont + 1 ; 

    update territory 
    set Player_owner = var_cur.id_Player 
    where ROWNUM = MOD(MOD (number_RANDOM(),42) ,ROWNUM); 
G1_Terr := var_cur.number_territories_tot ; -- mi salvo i territories del primo Player 
G1_ID := var_cur.id_Player ; 
end if ; 
    if (cont=2) then 


    update territory 
    set Player_owner = var_cur.id_Player 
    where ROWNUM = MOD(MOD (number_RANDOM(),42 -G1_Terr) , ROWNUM) and id_territory NOT IN (select Player_owner from territory where ; 

    G2_Terr := var_cur.number_territories_tot ;  
    end if ; 
if (cont=3) then 


    update territory 
    set Player_owner = var_cur.id_Player 
    where ROWNUM <= 42 - G1_Terr - G2_Terr; 
    --where ROWNUM <= 42 - var_cur.number_territories_tot * 2 ; 
G3_Terr := var_cur.number_territories_tot ; 
end if ; 
end loop; 
end; 

end;` 

number_random代碼:

 create or replace FUNCTION "NUMBER_RANDOM" 
     return NUMBER 
     is 
     numbrndm int; 
     begin 

     select dbms_random.value(1,99999999) into numbrndm 
     from dual; 
    return numbrndm; 
    end; 
+2

你的問題是什麼?樣本數據和期望的結果將有所幫助。 –

+0

有很多方法可以對事物進行隨機化處理,但發佈結構和一些示例數據會有所幫助。那麼另一個問題是,你真的想要隨機或更多的循環賽,以便你的地區是平衡的? – Matt

+0

平衡和隨機 –

回答

0

如果我理解正確的,你想分配給每個玩家隨機設置的區域?

如果是這樣,請按照隨機順序對領土進行排序並將其分配給玩家循環賽。這是一個MERGE聲明,應該這樣做。對於任何小的語法錯誤,我表示歉意:我現在不在Oracle數據庫之前。

MERGE INTO territory t 
USING (
WITH players AS (SELECT rownum player#, id_player 
        FROM player 
        WHERE idgame=:idgame), 
players_count AS (SELECT count(*) players_count FROM players) 
-- Get the id_player for each assignment 
SELECT assignedt.id_territory, p.id_player 
FROM 
(
    -- Assign the randomly-ordered territories to players in round-robin format 
    SELECT randt.id_territory, 
    mod(rownum, pc.players_count)+1 player# 
    FROM (
    -- Query the territories in a random order 
    SELECT t.id_territory 
    FROM territory t 
    ORDER BY dbms_random.random) randt, players_count pc 
    -- Optional: 
    -- ... add a where clause to limit rownum <= some number to make 
    -- ... sure each player receives an even number of territories. 
    -- ... You'd need the count of territories to do that. 
) assignedt inner join players p on p.player# = assignedt.player# 
) u 
ON (u.id_territory = t.id_territory) 
WHEN MATCHED THEN UPDATE SET t.id_player = u.id_player; 
0

我把你的SQL的隨機數列中選擇每一行。然後你可以直接在SQL中用隨機數字來訂購你的記錄集。

對玩家和地區名單都這樣做。

這個例子應該適用於任何數量的領土和玩家。如果領土不平分,那麼隨機哪個球員會得到一個額外的領土。

我們將按照隨機順序遍歷地區列表一次。我們將逐步瀏覽玩家列表,直到完成,然後重新載入玩家列表。這需要多次發生。

可能需要修復此語法或邏輯。我沒有一個Oracle實例來測試它。

CREATE OR REPLACE PROCEDURE giveterritory (pID_GAME PLS_INTEGER) IS 
    CURSOR c_player IS 
     SELECT id_player, dbms_random.value() rnd 
     FROM players 
     WHERE id_game = pID_GAME 
     ORDER BY 2 desc; 
    -- 
    CURSOR c_territory IS 
     SELECT id_territory, dbms_random.value() rnd 
     FROM territories 
     WHERE id_game = pID_GAME 
     FOR UPDATE of id_player 
     ORDER BY 2 desc; 
    -- 
    l_player_row c_player%ROWTYPE; 
    l_territory_row c_territory%ROWTYPE; 
BEGIN 
    OPEN c_player; 
    FETCH c_player into l_player_row; 
    -- 
    FOR r in c_territory 
    LOOP 
     UPDATE territories 
     SET id_player = l_player_row.id_player 
     WHERE CURRENT OF c_territory; 
     -- 
     FETCH c_player INTO l_player_row; 
     IF c_player%NOTFOUND THEN 
      CLOSE c_player; 
      OPEN c_player; 
      FETCH c_player INTO l_player_row; 
     END IF; 
    END LOOP; 
END; 
+0

它不起作用,它將每個領土分配給最後的玩家,也將不屬於當前遊戲的區域編輯爲 –

+0

。別客氣。 –

+0

你是個美麗的人!非常感謝,它的工作原理! –

相關問題