Database Setup ============== The Minesweeper game will use a combination of session cookies and database operations to store important information. Let's begin by getting the database file ready. Start With an Outline --------------------- Before we write any code, we need to think about what data the game needs in order to work. In particular, we want to identify the information to save in the game's database. There are LOTS of possibilities! However, for our basic game, we want to start small. We can always refine the database structure later! Consider the data that needs to *persist*. For example, if a user leaves the game in the middle of play and comes back later, what needs to go into the database to keep a record of their progress? For starters, our database should save: #. Information about each mine hidden on the board. This includes a primary key value as well as a location (row letter plus column number). #. Information about each individual cell on the board. This includes a primary key, the cell's location, the number of mines in surrounding cells, whether the user has clicked the cell, and whether the cell contains a mine. This outline suggests 2 tables for the database - one for a list of mines, and another for the cells on the game board. ``db_setup.py`` --------------- Use the tools in Visual Studio code to create a new Python file at the same level as ``main.py``. Call the new file ``db_setup.py``. This will be a separate program, and its only job is to create the database file and add two tables. Follow along with the video to build this program. .. admonition:: Tip The video player automatically sets the resolution. However, this choice might not be good enough to clearly see all of the text. If the code looks blurry on your screen, click the gear icon in the video controls and increase the resolution to the maximum value. .. raw:: html
.. admonition:: Note For our basic game, we might not use all of the columns in the tables yet. However, they could be useful later, so there's no harm in adding them now. Video Summary ------------- .. admonition:: Tip Don't try to code ``db_setup.py`` using only the summary! The clip contains information and specific code instructions that you really shouldn't skip. The text by itself doesn't provide enough detail on its own. It's a *SUMMARY* and not a *GMESD* (Give-Me-Every-Single-Detail). #. After creating the ``game.db`` database file, add two new tables: ``mines`` and ``board``. The first table stores an ID number and location for each mine created in the game. The second table stores information about each cell on the game board. #. Adding ``DROP TABLE`` commands at the top of the file lets us quickly remove and recreate the two tables. This is useful if we need to make a fresh start. #. The ``mines`` table includes two columns: ``mine_id`` and ``coordinates``. ``mine_id`` is the primary key, and its data type must be ``INTEGER`` instead of ``INT``. (For some reason, using the ``INT`` syntax doesn't automatically increment the primary key values). ``coordinates`` is of type ``TEXT`` and will store values like ``C9`` or ``E2``. #. The ``board`` table includes columns for ``cell_id`` (the primary key), ``coordinates``, ``surr_mines`` (surrounding mines), ``guessed`` and ``mine_id``. ``cell_id``, ``surr_mines``, and ``mine_id`` are integers. ``coordinates`` is a text data type, and ``guessed`` is a boolean. #. No rows need to be added to the ``mines`` table at this time. However, the ``board`` table *does* require some information. #. A pair of nested loops create a string value for the coordinates of each cell on the board. #. The loops also execute a SQL query to insert new rows into the ``board`` table. Each new row includes a string for ``coordinates`` and the value ``False`` for the ``guessed`` column. #. Note the unused row and column labels (``X, Y, 0``, and ``11``). There is a reason for these extra labels, but we won't explore that until the :ref:`end of the chapter `.