g | x | w | all
Bytes Lang Time Link
058Charcoal220129T091210ZNeil
180Clojure220207T185551ZKirill L
020Jelly220128T200342ZJonathan
387Python3220127T230508ZAjax1234

Charcoal, 59 58 bytes

SθWS⊞υιUMυ⭆S⌈⟦λ↧§ιμ⟧IΣE⁺υE⌊υ⭆υ§λκΣE⪪ι ∧∧‹¹Lλ№α⌊λΣE↥λ⊕§θ⌕αν

Try it online! Link is to verbose version of code. Takes as input:

  1. A string of 26 digits representing the values of the letter tiles minus 1.
  2. The previous board state, as a rectangular list of strings
  3. An empty line to delimit the two boards
  4. The new board state, as a rectangular list of strings

The two boards must be the same size rectangle. Explanation:

Sθ

Input the decremented tile values.

WS⊞υι

Input the previous board state.

UMυ⭆S⌈⟦λ↧§ιμ⟧

Input the new board state, but lowercase all letters that aren't new.

E⁺υE⌊υ⭆υ§λκ

Loop over the new board and its transpose.

ΣE⪪ι 

Map over each word and take the sum.

∧∧‹¹Lλ№α⌊λ

Only score words of at least two letters of which at least one is upper case.

ΣE↥λ⊕§θ⌕αν

Calculate the score of the word.

IΣ

Output the final total.

Clojure, 180 bytes

#(let[s(fn[x](frequencies(for[y(concat x(apply map vector x))w(partition-by #{\ }y):when(second w)]w)))b(s %2)](apply +(for[[k v](merge-with -(merge b(s %3))b)n k](*(or(% n)0)v))))

Try it online!

Anonymous function, accepts the three arguments in the order of: scoring map, board before, board after.

Jelly, 20 bytes

,ZḲÇ€€$€€Ẏ)œ-"/ẎḊƇFS

A monadic Link that accepts a pair of boards (lists of lists of characters), the first being the board's state after the turn has been played, that yields the score. The boards must fully align, using spaces to pad as necessary.

Try it online! (The header is a Link that performs the lookup of the value of a tile by its character*)
Or see the test-suite.

* Blank tiles can be incorporated by using a new character, e.g. b, too.

How?

,ZḲÇ€€$€€Ẏ)œ-"/ẎḊƇFS - Link: pair of lists of equal-length lists of characters
          )          - for each grid in the pair:
 Z                   -   tranpose
,                    -   pair the grid and its transpose
      $€€            -   for each line in each of those:
  Ḳ                  -     split at spaces
    €€               -     for each tile character in each of those:
   Ç                 -       call our tile value finding function
         Ẏ           -   tighten
              /      - reduce by:
             "       -   zip with:
           œ-        -     multiset difference
               Ẏ     - tighten
                 Ƈ   - keep only those for which:
                Ḋ    -   dequeue -> falsey for length one words
                  F  - flatten
                   S - sum

Python3, 387 bytes:

import re,itertools as I
lambda o,n:sum(sum(p[i]for i in j)for j in q(n)if all(j not in k for k in q(o))and len(j)>1)
q=lambda o:[j for k in[*map(list,I.zip_longest(*o,fillvalue=' '))]+o for j in re.findall('\w+',''.join(k))]
p={'E':1,'A':1,'I':1,'O':1,'N':1,'R':1,'T':1,'L':1,'S':1,'U':1,'D':2,'G':2,'B':3,'C':3,'M':3,'P':3,'F':4,'H':4,'V':4,'W':4,'Y':4,'K':5,'J':8,'X':8,'Q':10,'Z':10}

Try it online!