Shortest Gomoku (5 in a row) implementation
Jelly, 54 bytes

Ḋ,Z,ŒD$ŒrFs2ḢƇ&lt;5Ȧ
0x⁹s⁴-;N1¦Ṅ©+Ɠœị®Ḋ¤$¿ṪṬṭ0x$Ʋ¹NƭƊƊ$Ç¿


Try it online!

A full program that reads input on stdin. For each loop through it prints the current player (1 or -1) and the 16x16 grid. Moves are input on stdin as a Python array (e.g. [3,2]) with or without the surrounding square brackets. The only validation done is to make sure that the relevant cell is empty. When there are 5 (or more) in a row, the program ends and prints out the winner and final grid. 

If checking for a valid move can be omitted, 10 bytes can be saved:

Jelly, 44 bytes

Ḋ,Z,ŒD$ŒrFs2ḢƇ&lt;5Ȧ
0x⁹s⁴-;N1¦Ṅ+ƓṪṬṭ0x$¹Nƭ¤ƲÇ¿


Try it online!

Conversely, if the w/b designation in the spec is strict, that costs 15 bytes:

Jelly, 69 bytes

ị“wb ”Ḣ
Ḋ,Z,ŒD$ŒrFs2ḢƇ&lt;5Ȧ
0x⁹s⁴-;N1¦Ñ;”&gt;ṄṛƲ©+Ɠœị®Ḋ¤$¿ṪṬṭ0x$Ʋ¹NƭƊƊ$Ç¿Ñ


Try it online!