summaryrefslogtreecommitdiff
path: root/src/games
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-07-07 19:01:33 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-07-07 19:01:33 +0900
commit865fd25af1cb2d9d1fd9752795f36482226d36a7 (patch)
tree75045ec1b717ef4a5708aff1c85443427a1a7376 /src/games
parent:v: (diff)
downloadmisskey-865fd25af1cb2d9d1fd9752795f36482226d36a7.tar.gz
misskey-865fd25af1cb2d9d1fd9752795f36482226d36a7.tar.bz2
misskey-865fd25af1cb2d9d1fd9752795f36482226d36a7.zip
Refactorijg
Diffstat (limited to 'src/games')
-rw-r--r--src/games/reversi/core.ts342
-rw-r--r--src/games/reversi/maps.ts911
2 files changed, 1253 insertions, 0 deletions
diff --git a/src/games/reversi/core.ts b/src/games/reversi/core.ts
new file mode 100644
index 0000000000..92b7c3799c
--- /dev/null
+++ b/src/games/reversi/core.ts
@@ -0,0 +1,342 @@
+// MISSKEY REVERSI ENGINE
+
+/**
+ * true ... 黒
+ * false ... 白
+ */
+export type Color = boolean;
+const BLACK = true;
+const WHITE = false;
+
+export type MapPixel = 'null' | 'empty';
+
+export type Options = {
+ isLlotheo: boolean;
+ canPutEverywhere: boolean;
+ loopedBoard: boolean;
+};
+
+export type Undo = {
+ /**
+ * 色
+ */
+ color: Color;
+
+ /**
+ * どこに打ったか
+ */
+ pos: number;
+
+ /**
+ * 反転した石の位置の配列
+ */
+ effects: number[];
+
+ /**
+ * ターン
+ */
+ turn: Color;
+};
+
+/**
+ * リバーシエンジン
+ */
+export default class Reversi {
+ public map: MapPixel[];
+ public mapWidth: number;
+ public mapHeight: number;
+ public board: Color[];
+ public turn: Color = BLACK;
+ public opts: Options;
+
+ public prevPos = -1;
+ public prevColor: Color = null;
+
+ private logs: Undo[] = [];
+
+ /**
+ * ゲームを初期化します
+ */
+ constructor(map: string[], opts: Options) {
+ //#region binds
+ this.put = this.put.bind(this);
+ //#endregion
+
+ //#region Options
+ this.opts = opts;
+ if (this.opts.isLlotheo == null) this.opts.isLlotheo = false;
+ if (this.opts.canPutEverywhere == null) this.opts.canPutEverywhere = false;
+ if (this.opts.loopedBoard == null) this.opts.loopedBoard = false;
+ //#endregion
+
+ //#region Parse map data
+ this.mapWidth = map[0].length;
+ this.mapHeight = map.length;
+ const mapData = map.join('');
+
+ this.board = mapData.split('').map(d => {
+ if (d == '-') return null;
+ if (d == 'b') return BLACK;
+ if (d == 'w') return WHITE;
+ return undefined;
+ });
+
+ this.map = mapData.split('').map(d => {
+ if (d == '-' || d == 'b' || d == 'w') return 'empty';
+ return 'null';
+ });
+ //#endregion
+
+ // ゲームが始まった時点で片方の色の石しかないか、始まった時点で勝敗が決定するようなマップの場合がある
+ if (this.canPutSomewhere(BLACK).length == 0) {
+ if (this.canPutSomewhere(WHITE).length == 0) {
+ this.turn = null;
+ } else {
+ this.turn = WHITE;
+ }
+ }
+ }
+
+ /**
+ * 黒石の数
+ */
+ public get blackCount() {
+ return this.board.filter(x => x === BLACK).length;
+ }
+
+ /**
+ * 白石の数
+ */
+ public get whiteCount() {
+ return this.board.filter(x => x === WHITE).length;
+ }
+
+ /**
+ * 黒石の比率
+ */
+ public get blackP() {
+ if (this.blackCount == 0 && this.whiteCount == 0) return 0;
+ return this.blackCount / (this.blackCount + this.whiteCount);
+ }
+
+ /**
+ * 白石の比率
+ */
+ public get whiteP() {
+ if (this.blackCount == 0 && this.whiteCount == 0) return 0;
+ return this.whiteCount / (this.blackCount + this.whiteCount);
+ }
+
+ public transformPosToXy(pos: number): number[] {
+ const x = pos % this.mapWidth;
+ const y = Math.floor(pos / this.mapWidth);
+ return [x, y];
+ }
+
+ public transformXyToPos(x: number, y: number): number {
+ return x + (y * this.mapWidth);
+ }
+
+ /**
+ * 指定のマスに石を打ちます
+ * @param color 石の色
+ * @param pos 位置
+ */
+ public put(color: Color, pos: number) {
+ this.prevPos = pos;
+ this.prevColor = color;
+
+ this.board[pos] = color;
+
+ // 反転させられる石を取得
+ const effects = this.effects(color, pos);
+
+ // 反転させる
+ for (const pos of effects) {
+ this.board[pos] = color;
+ }
+
+ const turn = this.turn;
+
+ this.logs.push({
+ color,
+ pos,
+ effects,
+ turn
+ });
+
+ this.calcTurn();
+ }
+
+ private calcTurn() {
+ // ターン計算
+ if (this.canPutSomewhere(!this.prevColor).length > 0) {
+ this.turn = !this.prevColor;
+ } else if (this.canPutSomewhere(this.prevColor).length > 0) {
+ this.turn = this.prevColor;
+ } else {
+ this.turn = null;
+ }
+ }
+
+ public undo() {
+ const undo = this.logs.pop();
+ this.prevColor = undo.color;
+ this.prevPos = undo.pos;
+ this.board[undo.pos] = null;
+ for (const pos of undo.effects) {
+ const color = this.board[pos];
+ this.board[pos] = !color;
+ }
+ this.turn = undo.turn;
+ }
+
+ /**
+ * 指定した位置のマップデータのマスを取得します
+ * @param pos 位置
+ */
+ public mapDataGet(pos: number): MapPixel {
+ const [x, y] = this.transformPosToXy(pos);
+ if (x < 0 || y < 0 || x >= this.mapWidth || y >= this.mapHeight) return 'null';
+ return this.map[pos];
+ }
+
+ /**
+ * 打つことができる場所を取得します
+ */
+ public canPutSomewhere(color: Color): number[] {
+ const result: number[] = [];
+
+ this.board.forEach((x, i) => {
+ if (this.canPut(color, i)) result.push(i);
+ });
+
+ return result;
+ }
+
+ /**
+ * 指定のマスに石を打つことができるかどうかを取得します
+ * @param color 自分の色
+ * @param pos 位置
+ */
+ public canPut(color: Color, pos: number): boolean {
+ // 既に石が置いてある場所には打てない
+ if (this.board[pos] !== null) return false;
+
+ if (this.opts.canPutEverywhere) {
+ // 挟んでなくても置けるモード
+ return this.mapDataGet(pos) == 'empty';
+ } else {
+ // 相手の石を1つでも反転させられるか
+ return this.effects(color, pos).length !== 0;
+ }
+ }
+
+ /**
+ * 指定のマスに石を置いた時の、反転させられる石を取得します
+ * @param color 自分の色
+ * @param pos 位置
+ */
+ public effects(color: Color, pos: number): number[] {
+ const enemyColor = !color;
+
+ // ひっくり返せる石(の位置)リスト
+ let stones: number[] = [];
+
+ const initPos = pos;
+
+ // 走査
+ const iterate = (fn: (i: number) => number[]) => {
+ let i = 1;
+ const found = [];
+
+ while (true) {
+ let [x, y] = fn(i);
+
+ // 座標が指し示す位置がボード外に出たとき
+ if (this.opts.loopedBoard) {
+ if (x < 0 ) x = this.mapWidth - ((-x) % this.mapWidth);
+ if (y < 0 ) y = this.mapHeight - ((-y) % this.mapHeight);
+ if (x >= this.mapWidth ) x = x % this.mapWidth;
+ if (y >= this.mapHeight) y = y % this.mapHeight;
+
+ // for debug
+ //if (x < 0 || y < 0 || x >= this.mapWidth || y >= this.mapHeight) {
+ // console.log(x, y);
+ //}
+
+ // 一周して自分に帰ってきたら
+ if (this.transformXyToPos(x, y) == initPos) {
+ // ↓のコメントアウトを外すと、「現時点で自分の石が隣接していないが、
+ // そこに置いたとするとループして最終的に挟んだことになる」というケースを有効化します。(Test4のマップで違いが分かります)
+ // このケースを有効にした方が良いのか無効にした方が良いのか判断がつかなかったためとりあえず無効としておきます
+ // (あと無効な方がゲームとしておもしろそうだった)
+ stones = stones.concat(found);
+ break;
+ }
+ } else {
+ if (x == -1 || y == -1 || x == this.mapWidth || y == this.mapHeight) break;
+ }
+
+ const pos = this.transformXyToPos(x, y);
+
+ //#region 「配置不能」マスに当たった場合走査終了
+ const pixel = this.mapDataGet(pos);
+ if (pixel == 'null') break;
+ //#endregion
+
+ // 石取得
+ const stone = this.board[pos];
+
+ // 石が置かれていないマスなら走査終了
+ if (stone === null) break;
+
+ // 相手の石なら「ひっくり返せるかもリスト」に入れておく
+ if (stone === enemyColor) found.push(pos);
+
+ // 自分の石なら「ひっくり返せるかもリスト」を「ひっくり返せるリスト」に入れ、走査終了
+ if (stone === color) {
+ stones = stones.concat(found);
+ break;
+ }
+
+ i++;
+ }
+ };
+
+ const [x, y] = this.transformPosToXy(pos);
+
+ iterate(i => [x , y - i]); // 上
+ iterate(i => [x + i, y - i]); // 右上
+ iterate(i => [x + i, y ]); // 右
+ iterate(i => [x + i, y + i]); // 右下
+ iterate(i => [x , y + i]); // 下
+ iterate(i => [x - i, y + i]); // 左下
+ iterate(i => [x - i, y ]); // 左
+ iterate(i => [x - i, y - i]); // 左上
+
+ return stones;
+ }
+
+ /**
+ * ゲームが終了したか否か
+ */
+ public get isEnded(): boolean {
+ return this.turn === null;
+ }
+
+ /**
+ * ゲームの勝者 (null = 引き分け)
+ */
+ public get winner(): Color {
+ if (!this.isEnded) return undefined;
+
+ if (this.blackCount == this.whiteCount) return null;
+
+ if (this.opts.isLlotheo) {
+ return this.blackCount > this.whiteCount ? WHITE : BLACK;
+ } else {
+ return this.blackCount > this.whiteCount ? BLACK : WHITE;
+ }
+ }
+}
diff --git a/src/games/reversi/maps.ts b/src/games/reversi/maps.ts
new file mode 100644
index 0000000000..f55cb1d516
--- /dev/null
+++ b/src/games/reversi/maps.ts
@@ -0,0 +1,911 @@
+/**
+ * 組み込みマップ定義
+ *
+ * データ値:
+ * (スペース) ... マス無し
+ * - ... マス
+ * b ... 初期配置される黒石
+ * w ... 初期配置される白石
+ */
+
+export type Map = {
+ name?: string;
+ category?: string;
+ author?: string;
+ data: string[];
+};
+
+export const fourfour: Map = {
+ name: '4x4',
+ category: '4x4',
+ data: [
+ '----',
+ '-wb-',
+ '-bw-',
+ '----'
+ ]
+};
+
+export const sixsix: Map = {
+ name: '6x6',
+ category: '6x6',
+ data: [
+ '------',
+ '------',
+ '--wb--',
+ '--bw--',
+ '------',
+ '------'
+ ]
+};
+
+export const roundedSixsix: Map = {
+ name: '6x6 rounded',
+ category: '6x6',
+ author: 'syuilo',
+ data: [
+ ' ---- ',
+ '------',
+ '--wb--',
+ '--bw--',
+ '------',
+ ' ---- '
+ ]
+};
+
+export const roundedSixsix2: Map = {
+ name: '6x6 rounded 2',
+ category: '6x6',
+ author: 'syuilo',
+ data: [
+ ' -- ',
+ ' ---- ',
+ '--wb--',
+ '--bw--',
+ ' ---- ',
+ ' -- '
+ ]
+};
+
+export const eighteight: Map = {
+ name: '8x8',
+ category: '8x8',
+ data: [
+ '--------',
+ '--------',
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------',
+ '--------',
+ '--------'
+ ]
+};
+
+export const eighteightH1: Map = {
+ name: '8x8 handicap 1',
+ category: '8x8',
+ data: [
+ 'b-------',
+ '--------',
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------',
+ '--------',
+ '--------'
+ ]
+};
+
+export const eighteightH2: Map = {
+ name: '8x8 handicap 2',
+ category: '8x8',
+ data: [
+ 'b-------',
+ '--------',
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------',
+ '--------',
+ '-------b'
+ ]
+};
+
+export const eighteightH3: Map = {
+ name: '8x8 handicap 3',
+ category: '8x8',
+ data: [
+ 'b------b',
+ '--------',
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------',
+ '--------',
+ '-------b'
+ ]
+};
+
+export const eighteightH4: Map = {
+ name: '8x8 handicap 4',
+ category: '8x8',
+ data: [
+ 'b------b',
+ '--------',
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------',
+ '--------',
+ 'b------b'
+ ]
+};
+
+export const eighteightH12: Map = {
+ name: '8x8 handicap 12',
+ category: '8x8',
+ data: [
+ 'bb----bb',
+ 'b------b',
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------',
+ 'b------b',
+ 'bb----bb'
+ ]
+};
+
+export const eighteightH16: Map = {
+ name: '8x8 handicap 16',
+ category: '8x8',
+ data: [
+ 'bbb---bb',
+ 'b------b',
+ '-------b',
+ '---wb---',
+ '---bw---',
+ 'b-------',
+ 'b------b',
+ 'bb---bbb'
+ ]
+};
+
+export const eighteightH20: Map = {
+ name: '8x8 handicap 20',
+ category: '8x8',
+ data: [
+ 'bbb--bbb',
+ 'b------b',
+ 'b------b',
+ '---wb---',
+ '---bw---',
+ 'b------b',
+ 'b------b',
+ 'bbb---bb'
+ ]
+};
+
+export const eighteightH28: Map = {
+ name: '8x8 handicap 28',
+ category: '8x8',
+ data: [
+ 'bbbbbbbb',
+ 'b------b',
+ 'b------b',
+ 'b--wb--b',
+ 'b--bw--b',
+ 'b------b',
+ 'b------b',
+ 'bbbbbbbb'
+ ]
+};
+
+export const roundedEighteight: Map = {
+ name: '8x8 rounded',
+ category: '8x8',
+ author: 'syuilo',
+ data: [
+ ' ------ ',
+ '--------',
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------',
+ '--------',
+ ' ------ '
+ ]
+};
+
+export const roundedEighteight2: Map = {
+ name: '8x8 rounded 2',
+ category: '8x8',
+ author: 'syuilo',
+ data: [
+ ' ---- ',
+ ' ------ ',
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------',
+ ' ------ ',
+ ' ---- '
+ ]
+};
+
+export const roundedEighteight3: Map = {
+ name: '8x8 rounded 3',
+ category: '8x8',
+ author: 'syuilo',
+ data: [
+ ' -- ',
+ ' ---- ',
+ ' ------ ',
+ '---wb---',
+ '---bw---',
+ ' ------ ',
+ ' ---- ',
+ ' -- '
+ ]
+};
+
+export const eighteightWithNotch: Map = {
+ name: '8x8 with notch',
+ category: '8x8',
+ author: 'syuilo',
+ data: [
+ '--- ---',
+ '--------',
+ '--------',
+ ' --wb-- ',
+ ' --bw-- ',
+ '--------',
+ '--------',
+ '--- ---'
+ ]
+};
+
+export const eighteightWithSomeHoles: Map = {
+ name: '8x8 with some holes',
+ category: '8x8',
+ author: 'syuilo',
+ data: [
+ '--- ----',
+ '----- --',
+ '-- -----',
+ '---wb---',
+ '---bw- -',
+ ' -------',
+ '--- ----',
+ '--------'
+ ]
+};
+
+export const circle: Map = {
+ name: 'Circle',
+ category: '8x8',
+ author: 'syuilo',
+ data: [
+ ' -- ',
+ ' ------ ',
+ ' ------ ',
+ '---wb---',
+ '---bw---',
+ ' ------ ',
+ ' ------ ',
+ ' -- '
+ ]
+};
+
+export const smile: Map = {
+ name: 'Smile',
+ category: '8x8',
+ author: 'syuilo',
+ data: [
+ ' ------ ',
+ '--------',
+ '-- -- --',
+ '---wb---',
+ '-- bw --',
+ '--- ---',
+ '--------',
+ ' ------ '
+ ]
+};
+
+export const window: Map = {
+ name: 'Window',
+ category: '8x8',
+ author: 'syuilo',
+ data: [
+ '--------',
+ '- -- -',
+ '- -- -',
+ '---wb---',
+ '---bw---',
+ '- -- -',
+ '- -- -',
+ '--------'
+ ]
+};
+
+export const reserved: Map = {
+ name: 'Reserved',
+ category: '8x8',
+ author: 'Aya',
+ data: [
+ 'w------b',
+ '--------',
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------',
+ '--------',
+ 'b------w'
+ ]
+};
+
+export const x: Map = {
+ name: 'X',
+ category: '8x8',
+ author: 'Aya',
+ data: [
+ 'w------b',
+ '-w----b-',
+ '--w--b--',
+ '---wb---',
+ '---bw---',
+ '--b--w--',
+ '-b----w-',
+ 'b------w'
+ ]
+};
+
+export const parallel: Map = {
+ name: 'Parallel',
+ category: '8x8',
+ author: 'Aya',
+ data: [
+ '--------',
+ '--------',
+ '--------',
+ '---bb---',
+ '---ww---',
+ '--------',
+ '--------',
+ '--------'
+ ]
+};
+
+export const lackOfBlack: Map = {
+ name: 'Lack of Black',
+ category: '8x8',
+ data: [
+ '--------',
+ '--------',
+ '--------',
+ '---w----',
+ '---bw---',
+ '--------',
+ '--------',
+ '--------'
+ ]
+};
+
+export const squareParty: Map = {
+ name: 'Square Party',
+ category: '8x8',
+ author: 'syuilo',
+ data: [
+ '--------',
+ '-wwwbbb-',
+ '-w-wb-b-',
+ '-wwwbbb-',
+ '-bbbwww-',
+ '-b-bw-w-',
+ '-bbbwww-',
+ '--------'
+ ]
+};
+
+export const minesweeper: Map = {
+ name: 'Minesweeper',
+ category: '8x8',
+ author: 'syuilo',
+ data: [
+ 'b-b--w-w',
+ '-w-wb-b-',
+ 'w-b--w-b',
+ '-b-wb-w-',
+ '-w-bw-b-',
+ 'b-w--b-w',
+ '-b-bw-w-',
+ 'w-w--b-b'
+ ]
+};
+
+export const tenthtenth: Map = {
+ name: '10x10',
+ category: '10x10',
+ data: [
+ '----------',
+ '----------',
+ '----------',
+ '----------',
+ '----wb----',
+ '----bw----',
+ '----------',
+ '----------',
+ '----------',
+ '----------'
+ ]
+};
+
+export const hole: Map = {
+ name: 'The Hole',
+ category: '10x10',
+ author: 'syuilo',
+ data: [
+ '----------',
+ '----------',
+ '--wb--wb--',
+ '--bw--bw--',
+ '---- ----',
+ '---- ----',
+ '--wb--wb--',
+ '--bw--bw--',
+ '----------',
+ '----------'
+ ]
+};
+
+export const grid: Map = {
+ name: 'Grid',
+ category: '10x10',
+ author: 'syuilo',
+ data: [
+ '----------',
+ '- - -- - -',
+ '----------',
+ '- - -- - -',
+ '----wb----',
+ '----bw----',
+ '- - -- - -',
+ '----------',
+ '- - -- - -',
+ '----------'
+ ]
+};
+
+export const cross: Map = {
+ name: 'Cross',
+ category: '10x10',
+ author: 'Aya',
+ data: [
+ ' ---- ',
+ ' ---- ',
+ ' ---- ',
+ '----------',
+ '----wb----',
+ '----bw----',
+ '----------',
+ ' ---- ',
+ ' ---- ',
+ ' ---- '
+ ]
+};
+
+export const charX: Map = {
+ name: 'Char X',
+ category: '10x10',
+ author: 'syuilo',
+ data: [
+ '--- ---',
+ '---- ----',
+ '----------',
+ ' -------- ',
+ ' --wb-- ',
+ ' --bw-- ',
+ ' -------- ',
+ '----------',
+ '---- ----',
+ '--- ---'
+ ]
+};
+
+export const charY: Map = {
+ name: 'Char Y',
+ category: '10x10',
+ author: 'syuilo',
+ data: [
+ '--- ---',
+ '---- ----',
+ '----------',
+ ' -------- ',
+ ' --wb-- ',
+ ' --bw-- ',
+ ' ------ ',
+ ' ------ ',
+ ' ------ ',
+ ' ------ '
+ ]
+};
+
+export const walls: Map = {
+ name: 'Walls',
+ category: '10x10',
+ author: 'Aya',
+ data: [
+ ' bbbbbbbb ',
+ 'w--------w',
+ 'w--------w',
+ 'w--------w',
+ 'w---wb---w',
+ 'w---bw---w',
+ 'w--------w',
+ 'w--------w',
+ 'w--------w',
+ ' bbbbbbbb '
+ ]
+};
+
+export const cpu: Map = {
+ name: 'CPU',
+ category: '10x10',
+ author: 'syuilo',
+ data: [
+ ' b b b b ',
+ 'w--------w',
+ ' -------- ',
+ 'w--------w',
+ ' ---wb--- ',
+ ' ---bw--- ',
+ 'w--------w',
+ ' -------- ',
+ 'w--------w',
+ ' b b b b '
+ ]
+};
+
+export const checker: Map = {
+ name: 'Checker',
+ category: '10x10',
+ author: 'Aya',
+ data: [
+ '----------',
+ '----------',
+ '----------',
+ '---wbwb---',
+ '---bwbw---',
+ '---wbwb---',
+ '---bwbw---',
+ '----------',
+ '----------',
+ '----------'
+ ]
+};
+
+export const japaneseCurry: Map = {
+ name: 'Japanese curry',
+ category: '10x10',
+ author: 'syuilo',
+ data: [
+ 'w-b-b-b-b-',
+ '-w-b-b-b-b',
+ 'w-w-b-b-b-',
+ '-w-w-b-b-b',
+ 'w-w-wwb-b-',
+ '-w-wbb-b-b',
+ 'w-w-w-b-b-',
+ '-w-w-w-b-b',
+ 'w-w-w-w-b-',
+ '-w-w-w-w-b'
+ ]
+};
+
+export const mosaic: Map = {
+ name: 'Mosaic',
+ category: '10x10',
+ author: 'syuilo',
+ data: [
+ '- - - - - ',
+ ' - - - - -',
+ '- - - - - ',
+ ' - w w - -',
+ '- - b b - ',
+ ' - w w - -',
+ '- - b b - ',
+ ' - - - - -',
+ '- - - - - ',
+ ' - - - - -',
+ ]
+};
+
+export const arena: Map = {
+ name: 'Arena',
+ category: '10x10',
+ author: 'syuilo',
+ data: [
+ '- - -- - -',
+ ' - - - - ',
+ '- ------ -',
+ ' -------- ',
+ '- --wb-- -',
+ '- --bw-- -',
+ ' -------- ',
+ '- ------ -',
+ ' - - - - ',
+ '- - -- - -'
+ ]
+};
+
+export const reactor: Map = {
+ name: 'Reactor',
+ category: '10x10',
+ author: 'syuilo',
+ data: [
+ '-w------b-',
+ 'b- - - -w',
+ '- --wb-- -',
+ '---b w---',
+ '- b wb w -',
+ '- w bw b -',
+ '---w b---',
+ '- --bw-- -',
+ 'w- - - -b',
+ '-b------w-'
+ ]
+};
+
+export const sixeight: Map = {
+ name: '6x8',
+ category: 'Special',
+ data: [
+ '------',
+ '------',
+ '------',
+ '--wb--',
+ '--bw--',
+ '------',
+ '------',
+ '------'
+ ]
+};
+
+export const spark: Map = {
+ name: 'Spark',
+ category: 'Special',
+ author: 'syuilo',
+ data: [
+ ' - - ',
+ '----------',
+ ' -------- ',
+ ' -------- ',
+ ' ---wb--- ',
+ ' ---bw--- ',
+ ' -------- ',
+ ' -------- ',
+ '----------',
+ ' - - '
+ ]
+};
+
+export const islands: Map = {
+ name: 'Islands',
+ category: 'Special',
+ author: 'syuilo',
+ data: [
+ '-------- ',
+ '---wb--- ',
+ '---bw--- ',
+ '-------- ',
+ ' - - ',
+ ' - - ',
+ ' --------',
+ ' --------',
+ ' --------',
+ ' --------'
+ ]
+};
+
+export const galaxy: Map = {
+ name: 'Galaxy',
+ category: 'Special',
+ author: 'syuilo',
+ data: [
+ ' ------ ',
+ ' --www--- ',
+ ' ------w--- ',
+ '---bbb--w---',
+ '--b---b-w-b-',
+ '-b--wwb-w-b-',
+ '-b-w-bww--b-',
+ '-b-w-b---b--',
+ '---w--bbb---',
+ ' ---w------ ',
+ ' ---www-- ',
+ ' ------ '
+ ]
+};
+
+export const triangle: Map = {
+ name: 'Triangle',
+ category: 'Special',
+ author: 'syuilo',
+ data: [
+ ' -- ',
+ ' -- ',
+ ' ---- ',
+ ' ---- ',
+ ' --wb-- ',
+ ' --bw-- ',
+ ' -------- ',
+ ' -------- ',
+ '----------',
+ '----------'
+ ]
+};
+
+export const iphonex: Map = {
+ name: 'iPhone X',
+ category: 'Special',
+ author: 'syuilo',
+ data: [
+ ' -- -- ',
+ '--------',
+ '--------',
+ '--------',
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------',
+ '--------',
+ '--------',
+ '--------',
+ ' ------ '
+ ]
+};
+
+export const dealWithIt: Map = {
+ name: 'Deal with it!',
+ category: 'Special',
+ author: 'syuilo',
+ data: [
+ '------------',
+ '--w-b-------',
+ ' --b-w------',
+ ' --w-b---- ',
+ ' ------- '
+ ]
+};
+
+export const experiment: Map = {
+ name: 'Let\'s experiment',
+ category: 'Special',
+ author: 'syuilo',
+ data: [
+ ' ------------ ',
+ '------wb------',
+ '------bw------',
+ '--------------',
+ ' - - ',
+ '------ ------',
+ 'bbbbbb wwwwww',
+ 'bbbbbb wwwwww',
+ 'bbbbbb wwwwww',
+ 'bbbbbb wwwwww',
+ 'wwwwww bbbbbb'
+ ]
+};
+
+export const bigBoard: Map = {
+ name: 'Big board',
+ category: 'Special',
+ data: [
+ '----------------',
+ '----------------',
+ '----------------',
+ '----------------',
+ '----------------',
+ '----------------',
+ '----------------',
+ '-------wb-------',
+ '-------bw-------',
+ '----------------',
+ '----------------',
+ '----------------',
+ '----------------',
+ '----------------',
+ '----------------',
+ '----------------'
+ ]
+};
+
+export const twoBoard: Map = {
+ name: 'Two board',
+ category: 'Special',
+ author: 'Aya',
+ data: [
+ '-------- --------',
+ '-------- --------',
+ '-------- --------',
+ '---wb--- ---wb---',
+ '---bw--- ---bw---',
+ '-------- --------',
+ '-------- --------',
+ '-------- --------'
+ ]
+};
+
+export const test1: Map = {
+ name: 'Test1',
+ category: 'Test',
+ data: [
+ '--------',
+ '---wb---',
+ '---bw---',
+ '--------'
+ ]
+};
+
+export const test2: Map = {
+ name: 'Test2',
+ category: 'Test',
+ data: [
+ '------',
+ '------',
+ '-b--w-',
+ '-w--b-',
+ '-w--b-'
+ ]
+};
+
+export const test3: Map = {
+ name: 'Test3',
+ category: 'Test',
+ data: [
+ '-w-',
+ '--w',
+ 'w--',
+ '-w-',
+ '--w',
+ 'w--',
+ '-w-',
+ '--w',
+ 'w--',
+ '-w-',
+ '---',
+ 'b--',
+ ]
+};
+
+export const test4: Map = {
+ name: 'Test4',
+ category: 'Test',
+ data: [
+ '-w--b-',
+ '-w--b-',
+ '------',
+ '-w--b-',
+ '-w--b-'
+ ]
+};
+
+// https://misskey.xyz/reversi/5aaabf7fe126e10b5216ea09 64
+export const test5: Map = {
+ name: 'Test5',
+ category: 'Test',
+ data: [
+ '--wwwwww--',
+ '--wwwbwwww',
+ '-bwwbwbwww',
+ '-bwwwbwbww',
+ '-bwwbwbwbw',
+ '-bwbwbwb-w',
+ 'bwbwwbbb-w',
+ 'w-wbbbbb--',
+ '--w-b-w---',
+ '----------'
+ ]
+};