オセロゲームのサンプル

オセロゲームのサンプル
人間 VS コンピュータ(AI)対局 7行プログラミング (C言語)

#include <stdio.h>

int put, turn, all, done, pass, count, cur, i;
// 盤状態:横9*縦10で、使用は8*8
// 0:無し 1:1player 2:2player 3:改行
// y*9+xというイメージ。0行目と9行目は番兵
int map[90] = {0};
// 盤を走査する場合、縦横斜め方向に向かうために足されるべき数
int dir[] = { -10, -9, -8, -1, 1, 8, 9, 10 };

// putに駒を置いた場合ひっくり返せる枚数をallに足す
void check() 
{
	if (map[put] == 0) {
		for (i = 0; i < 8; i++) {
			// dir[i]の方向の相手のコマの数を確認
			for (count = 0, cur = put+dir[i]; map[cur] == 3 - turn; cur += dir[i]) {
				count++;
			}
			if (count && map[cur] == turn) {
				// 1枚以上存在し、その上端が自分のコマだったら
				all += count;
				cur = put;
				if (done) {
					// doneがtrueの場合は、実際にひっくり返す
					do {
						map[cur] = turn, cur += dir[i];
					} while (map[cur] != turn);
				}
			}
		}
	}
}

// mapに対応するオセロ駒&改行
char *h = "・○●\n";

int main() {
	// 初期化
	for (i = 1, map[41] = map[49] = 2; i < 10; map[i++*9] = 3) {
		map[40] = map[50] = turn = pass = 1;
	}
	for (;; all = done = 0) { // ループのたびにallとdoneを初期化(セミコロンを1つ削除するため)
		// 盤の表示。今回のデータ構造だとこれで表示できる
		for (put = 9; put < 82; ++put) {
			check();
			printf("%.2s", &h[map[put]*2]);
		}
		if (all) {
			for (done = all = pass = put = 8; all == 8; check()) {
				// コマを置く(人は入力し、コンピュータは左上から順に)
				turn - 2 ? (scanf("%d %d", &put, &i), put+=i*9) : ++put;
			}
		} else if (pass) {
			// コマを置けないのでパス
			pass = 0;
			printf("pass");
		} else {
			break;
		}
		// 交代
		turn = 3 - turn;
	}
	return 0;
}