diff --git a/src/game/genetics/allele.hpp b/src/game/genetics/allele.hpp
new file mode 100644
index 0000000..e39ed80
--- /dev/null
+++ b/src/game/genetics/allele.hpp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2020 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#ifndef ANTKEEPER_ALLELE_HPP
+#define ANTKEEPER_ALLELE_HPP
+
+namespace dna
+{
+
+/// Enumerates allele types.
+enum class allele: bool
+{
+ /// Indicates an allele is recessive.
+ recessive = false,
+
+ /// Indicates an allele is dominant.
+ dominant = true
+};
+
+} // namespace dna
+
+#endif // ANTKEEPER_ALLELE_HPP
diff --git a/src/game/genetics/gene.hpp b/src/game/genetics/gene.hpp
new file mode 100644
index 0000000..0de648e
--- /dev/null
+++ b/src/game/genetics/gene.hpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2020 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#ifndef ANTKEEPER_GENE_HPP
+#define ANTKEEPER_GENE_HPP
+
+#include "allele.hpp"
+
+namespace dna
+{
+
+/// A gene with two alleles.
+typedef std::array gene;
+
+} // namespace dna
+
+#endif // ANTKEEPER_GENE_HPP
diff --git a/src/game/genetics/zygosity.hpp b/src/game/genetics/zygosity.hpp
new file mode 100644
index 0000000..549edca
--- /dev/null
+++ b/src/game/genetics/zygosity.hpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2020 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#ifndef ANTKEEPER_ZYGOSITY_HPP
+#define ANTKEEPER_ZYGOSITY_HPP
+
+#include "gene.hpp"
+
+namespace dna
+{
+
+/// A homozygous recessive gene.
+static constexpr gene homozygous_recessive = {allele::recessive, allele::recessive};
+
+/// A homozygous dominant gene.
+static constexpr gene homozygous_dominant = {allele::recessive, allele::recessive};
+
+/// Returns `true` if gene @p x is heterozygous, `false` otherwise.
+bool is_heterozygous(const gene& x);
+
+/// Returns `true` if gene @p x is homozygous, `false` otherwise.
+bool is_homozygous(const gene& x);
+
+/// Returns `true` if gene @p x is homozygous recessive, `false` otherwise.
+bool is_homozygous_recessive(const gene& x);
+
+/// Returns `true` if gene @p x is homozygous dominant, `false` otherwise.
+bool is_homozygous_dominant(const gene& x);
+
+inline bool is_heterozygous(const gene& x)
+{
+ return x[0] != x[1];
+}
+
+inline bool is_homozygous(const gene& x)
+{
+ return x[0] == x[1];
+}
+
+inline bool is_homozygous_recessive(const gene& x)
+{
+ return x == homozygous_recessive;
+}
+
+inline bool is_homozygous_dominant(const gene& x)
+{
+ return x == homozygous_dominant;
+}
+
+} // namespace dna
+
+#endif // ANTKEEPER_ZYGOSITY_HPP