1. Store an array of structs/classes instead of an array of integers. Every struct can contain a series of variables, including the index to the sprite, but also other properties like a boolean that tells a cell's collision condition.
2. Create a virtual camera. In this case that can simply be a pair of x, y coordinates. When you draw the playing field from bottom to top, you add these coordinates to an array indexing offset.
e.g.: for(y = 0; y < 25; ++y) for(x = 0; x < 25; ++x) cells[x + camera.x][y + camera.y].drawAt(x, y);
When moving the mouse cursor over the edge of the playing field, you can slowly increase/decrease the camera's .xy values.