126 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| --[[
 | |
| List of actions, by order of priority:
 | |
|     - Complete a 3 dice combo 4-6
 | |
|     - Cancel a 3 dice combo 4-6
 | |
|     - Complete a 3 dice combo 1-3
 | |
|     - Complete a 2 dice combo 4-6
 | |
|     - Cancel a 3 dice combo 1-3
 | |
|     - Complete a 2 dice combo 1-3
 | |
|     - Cancel a 2 dice combo 4-6
 | |
|     - Cancel a 2 dice combo 1-3
 | |
| 
 | |
|     - Look at the column's sum before removing a die.
 | |
|         It if is <=15, try to keep it as is, unless you're removing a 6 (or a 5)
 | |
| ]]
 | |
| ---Returns the column indexes (1-based) with completable combos
 | |
| ---@param dice table The 2d table with dice values
 | |
| ---@param value integer The dice value to place
 | |
| ---@param len 2|3 The possible combo length
 | |
| ---@return table The columns list (1-based)
 | |
| function get_combos_to_complete(dice, value, len)
 | |
|     local ids = {}
 | |
|     for col = 1, 3 do
 | |
|         if table.count(dice[col], 0) >= 1
 | |
|             and table.count(dice[col], value) == len - 1 then
 | |
|             table.insert(ids, col)
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     return ids
 | |
| end
 | |
| 
 | |
| ---@param mine table "My" 2d table with dice values
 | |
| ---@param other table The "other" (opponent) 2d table with dice values
 | |
| ---@param value integer The dice value to place
 | |
| ---@param len 2|3 The possible combo length
 | |
| ---@return table The columns list (1-based)
 | |
| function get_combos_to_cancel(mine, other, value, len)
 | |
|     local ids = {}
 | |
|     for col = 1, 3 do
 | |
|         if table.count(mine[col], 0) >= 1
 | |
|             and table.count(other[col], value) == len - 1 then
 | |
|             table.insert(ids, col)
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     return ids
 | |
| end
 | |
| 
 | |
| function get_most_empty_cols(dice)
 | |
|     local ids = {}
 | |
| 
 | |
|     for z = 3, 1, -1 do
 | |
|         for col = 1, 3 do
 | |
|             if table.count(dice[col], 0) == z then
 | |
|                 table.insert(ids, col)
 | |
|             end
 | |
|         end
 | |
|         if #ids > 0 then return ids end
 | |
|     end
 | |
| end
 | |
| 
 | |
| ---Place the die in the best possible column
 | |
| ---@param mine table The 2d table of "my" dice
 | |
| ---@param other any The 2d table of the "other" dice
 | |
| ---@param die integer The die to place
 | |
| ---@return integer # The column where to place the die
 | |
| function ai_pick_column(mine, other, die)
 | |
|     trace("--")
 | |
|     trace("AI")
 | |
|     trace("--")
 | |
| 
 | |
|     if die >= 4 then
 | |
|         --#region Complete a 3 combo 4-5-6
 | |
|         local combos = get_combos_to_complete(mine, die, 3)
 | |
|         if #combos > 0 then
 | |
|             trace("Making a 3 combo with " .. die)
 | |
|             return math.randomitem(combos)
 | |
|         end
 | |
|         --#endregion Complete a 3 combo 4-5-6
 | |
| 
 | |
|         -- #region Cancel a 3-dice combo 4-5-6
 | |
|         combos = get_combos_to_cancel(mine, other, die, 3)
 | |
|         if #combos > 0 then
 | |
|             trace("Cancelling a 3 combo with " .. die)
 | |
|             return math.randomitem(combos)
 | |
|         end
 | |
|         --#endregion Cancel a 3-dice combo 4-5-6
 | |
| 
 | |
|         -- #region Complete a 2 combo 4-5-6
 | |
|         combos = get_combos_to_complete(mine, die, 2)
 | |
|         if #combos > 0 then
 | |
|             trace("Making a 2 combo with " .. die)
 | |
|             return math.randomitem(combos)
 | |
|         end
 | |
|         -- #endregion Complete a 2 combo 4-5-6
 | |
|     end
 | |
| 
 | |
| 
 | |
|     -- #region Complete a 3 combo 1-2-3
 | |
|     combos = get_combos_to_complete(mine, die, 3)
 | |
|     if #combos > 0 then
 | |
|         trace("Making a 3 combo with " .. die)
 | |
|         return math.randomitem(combos)
 | |
|     end
 | |
|     -- #endregion Complete a 3 combo 1-2-3
 | |
| 
 | |
|     -- #region Complete a 2 combo 1-2-3
 | |
|     combos = get_combos_to_complete(mine, die, 2)
 | |
|     if #combos > 0 then
 | |
|         trace("Making a 2 combo with " .. die)
 | |
|         return math.randomitem(combos)
 | |
|     end
 | |
|     -- #endregion Complete a 2 combo 1-2-3
 | |
| 
 | |
|     -- #region Random column
 | |
| 
 | |
|     -- TODO: if 5-6, attack the opponent.
 | |
|     -- TODO: else, chose the column with the lowest sum
 | |
|     -- TODO: it's best to AVOID attacking the opponent when his sum is <= 15
 | |
|     -- TODO: it's best to avoid canceling 1-2 values
 | |
| 
 | |
|     trace("Placing " .. die .. " at random")
 | |
|     return math.randomitem(get_most_empty_cols(mine))
 | |
|     -- #endregion Random column
 | |
| end
 |