Nella stagione 1997-1998, esordisce in campo professionistico con la Reggiana in serie A. Nella sua prima stagione non gioca mai ed in quello stesso campionato vede la retrocessione della sua squadra in serie B, ma Zini rimane con la Reggiana nel campionato cadetto per altre due stagioni, collezionando 7 presenze nella stagione 1997-98 e ben 25 nella successiva. Passa successivamente all'Atalanta nel 1999-2000. Il club nerazzurro viene promosso in serie A quella stessa stagione, in cui Zini scende in campo 4 volte.
Pistoiese
Nel gennaio 2001, non trovando spazio a Bergamo, si trasferisce alla Pistoiese in prestito, all'epoca in serie B, dove colleziona 20 presenze e mette a segno una rete nel primo campionato. La stagione successiva la squadra arancione precipita in serie C1, ma il difensore viene acquistato e scende in campo 32 volte segnando due gol.
Vicissitudini e trasferimenti
Dopo l'avventura nella Pistoiese inizia per il difensore un periodo caratterizzato da numerosi prestiti e cambi di squadra. Nel 2002-2003 passa infatti di nuovo all'Atalanta, ma non scende mai in campo, per cui passa dapprima all'Ascoli, ottenendo 14 presenze e successivamente al Rimini, ottenendone 30. Torna alla Pistoiese nel 2004-2005, sempre in C1, come al Rimini, e colleziona 28 presenze. Si trasferisce l'anno successivo a Catanzaro, in serie B, dove colleziona 15 presenze, salvo essere pretato alla Sambenedettese, in serie C1, a gennaio; 10 presenze per lui. Rientra l'anno successivo al Catanzaro, che era nel frattempo scivolato in C2, e ottiene 29 presenze.
Infine, nella stagione 2007-2008 torna alla sua squadra d'origine, la Reggiana, dove collezione 34 presenze condite da 4 realizzazioni il primo anno, contribuendo a riportare gli Emiliani in C1. L'anno dopo, 2008-2009, è ancora un elemento fondamentale della prima squadra, con 30 presenze e 3 goal, e sfiora la promozione in B, sfumata nella semifinale dei play-off contro la Pro Patria, capace di rimontare due volte una situazione di iniziale sfavore. Nella stagione 2010-2011 diventa capitano della Reggiana, e lo sarà per tre stagioni.
Nell'estate 2013, lasciata la Reggiana, si trasferisce alla Correggese neopromossa in Serie D[2].
Nell'estate del 2014 accetta di svolgere il doppio ruolo di allenatore-giocatore nella Riese, squadra di Rio Saliceto[3].