C言語で制作したオセロゲームの概要【保存版】

## はじめに

このコードは私が大学にて学びながら制作したものになります。この記事ではソースコードの話ではなくではなく大まかな仕様について説明します。 

追記：この記事を書いたのは2021年頃です。

## 実行環境・動作環境の構築

### 使用しているパソコン
MacBook Pro 16インチ(intel)の初期スペック

### 実行時のOSのバージョン
macOS Big Sur バージョン11.1（無闇にアップデートしない方がいいです。最新のバージョンでは動作しなくなったりすることがたまにがあります）

### コンパイルまでに行ったこと（macの場合）
・[Xcode](https://apps.apple.com/jp/app/xcode/id497799835?mt=12)のインストール（コンパイラー）
・[Virtual Studio Code](https://code.visualstudio.com/download)の（エディター）
　・C言語拡張機能のインストール
　・日本語パックのインストール

・[XQuartz](https://blog.hatena.ne.jp/red_blog/business1389.hatenablog.com/edit?entry=26006613693803808)のインストール（X Window Systemのインストール）
　・macOS Big Surの初期の頃ににX Window Systemがはいっていなかったのでインストールする必要がありました。
　・加えてMacとLinuxでOSが異なるのでインストール方法も異なります。Linuxの方は下記のEGGXソースパッケージのインストール方法に記載されています。
　・X Window Systemとは何ぞやと思われた方はこちらの方の[記事](https://wa3.i-3-i.info/word13660.html)を見ると理解しやすいと思います。


・[EGGXソースパッケージ](https://www.ir.isas.jaxa.jp/~cyamauch/eggx_procall/index.ja.html)のインストール
　・これはオセロの盤面の描写に必要なライブラリになります。
　・インストールの方法は上記のリンクより確認ください。



結論としてはコンパイラーなどは他にも様々ありますので個々の環境構築を行ってください。C言語の動作環境とEGGXをコンパイルできるとこまでできれば私のオセロゲームは動作します。 

## オセロゲームの概要

### 物理処理と論理処理
このオセロゲームのコードの内の関数は物理処理と論理処理を行う関数に分けられています。物理処理は盤面や石の描写などを行っています。
処理によって関数を分けているのはEGGXのライブラリ以外で描写を行ったときに書き換えを簡単に行えるようにするためです。

### 動作例
<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/fe7e4e0a-3ec5-c4bd-e017-8a60745a4f5c.png">
左上部に白石と黒石の盤面上の数を表示しています。

<img width="480"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/b51049fc-5fc7-2410-8596-c9dd0bac892c.png">
先攻は黒石から始まります。

<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/4dadc0f2-b5f8-6b97-cd8b-7edb0b9c01ad.png">
マスのひとつひとつに00から始まり77までの数が割り振られています。石を置く場合はそのマスごとの数字を入力することで石を置くことができます。また、石を置くことができるマスにのみ石を置くことができます。
最初の盤面ではこのような感じになります。

<img width="600"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/3f3df909-f535-d719-699f-6c1d92ce2667.png">
バツのマスに石を置こうとすると上記のような表示が出ます。

<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/1d122067-707d-50c5-c5ad-0201834f9840.png">
すでに置かれた石にも接していない離れた位置に石を置こうとすると上記のような表示が出ます。

<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/628c9096-2f8a-d131-2812-690de7ae0b42.png">
石を置けるマスがなくなったら上記のような表示が出ます。
ターンが交代します。

#### 勝敗について
オセロでは盤面を埋めることで終了するのが普通ですが盤面を埋めずに終了するパターンがあります。どちらの色であっても片方の石の色を盤面上から消し去ることが可能です。（実際にゲームで起きることはないと思いますが一応専用の処理があります）

##### 通常の終了処理
<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/e707aee1-6299-c20f-e986-3ccaa221207b.png">

<img width="650"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/322df534-0846-dded-f277-d58b1e44f1cc.png">
通常の終了処理はこのような感じです。終了時点で各色の石の数を表示し、Enterでプログラムを終了します。

##### 盤面を埋めずに相手を詰ませる

<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/a499f7ab-2b78-9478-da9f-ef100eb0cfe0.png">

<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/e46ca8a2-687f-c039-f494-cb80831ade56.png">
このような盤面で終了するパターンが存在します。その時の為の条件部を用意し終了するようにしています。

<img width="650"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/7c5abc81-c7e6-88dd-0870-41595e9663be.png">

<img width="650"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/189533ad-faf3-5ddc-7736-74acf280e3a5.png">
条件分岐で最終的には通常の終わり方と同じ処理を行うようにしています。


<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/b4f44dfe-e1bf-0ddf-3134-d179e680f548.png">

<img width="650"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327727/c6564302-62ee-f5f1-64c0-745e5d24a3fe.png">
引き分けも滅多にありませんが専用の条件分岐を作成しています。




## 具体的なソースコード

[C言語で制作したオセロゲームのソースコード【保存版】](https://qiita.com/red-0803/items/bc50bd88b3d3a3acb421)

## 最後に

一応、バグなどはないと確認していますが、万が一でも見落としを発見された方はコメントお願いします。
質問などはしていただければ、可能な範囲で答えます。