読者です 読者をやめる 読者になる 読者になる

つけじょにーのすぱげていコード

主に、競技プログラミング、セキュリティのお勉強の際に書いたすぱげていコードを書き込みます

簡単なオセロ

ざーっと書いて、まだテストもろくにしてないので、バグだらけだと思います
一応アップしておきます

//簡単なオセロ(プレイヤーが、正確に石を置く想定)
#include <bits/stdc++.h>
#define MAX_W 8
#define MAX_H 8
using namespace std;
string board[MAX_W]; //盤面 e...empty(空) w...white(白) b...black(黒)
//上、右上、右、右下、下、左下、左、左上
//0  1    2   3    4  5    6  7
int fdx[] = {0, 1, 1, 1, 0, -1, -1, -1}; //x軸方向
int fdy[] = {1, 1, 0, -1, -1, -1, 0, 1}; //y軸方向
char side[] = {'W', 'B'};

//初期化
void init() {
    for(int r = 0; r < MAX_H; r++) {
        for(int c = 0; c < MAX_W; c++) {
            board[r][c] = 'e';
        }
    }
    board[3][3] = side[0];board[4][4] = side[0];
    board[3][4] = side[1];board[4][3] = side[1];
}

//処理すべきか否か
bool judge(int x, int y, int dir, char whichSide) { //始点、方向、白か黒か
    x += fdx[dir]; y += fdy[dir]; //すぐ隣なら処理は必要なし
    while(true) {
        x += fdx[dir]; y += fdy[dir];
        if((x < 0 || x >= MAX_W) || (y < 0 || y >= MAX_H)) break;
        if(board[y][x] == whichSide) {
            return(true); //処理せよ
        }
    }
    return(false); //処理するな
}

//盤面を出力
void print() {
    puts("-------------------------");
    for(int r = 0; r < MAX_H; r++) {
        for(int c = 0; c < MAX_W; c++) {
            printf("%c |", board[r][c]);
        }
        putchar('\n');
        puts("-------------------------");
    }
}

int count() {
    int black = 0;
    for(int r = 0; r < MAX_H; r++) {
        for(int c = 0; c < MAX_W; c++) {
            if(board[r][c] == side[1]) black++; //黒なら
        }
    }
    return(black);
}

//勝敗判定
void commit() {
    int black = count(), white = 64 - black;
    puts("結果発表");
    printf("白:%d\n黒:%d\n", white, black);
    if(white > black) printf("白の勝利!");
    else              printf("黒の勝利!");
}

void solve(int x, int y, char whichSide) {
    board[y][x] = whichSide;
    for(int r = 0; r < 8; r++) {
        if(judge(x, y, r, whichSide)) {
            x += fdx[r]; y += fdy[r];
            while(board[y][x] != whichSide) {
                board[y][x] = whichSide;
                x += fdx[r]; y += fdy[r];
            }
        }
    }
    print();
}

int main(void) {
    init();
    int which = 0;
    int x, y;
    print();
    while(cin >> x >> y, !(count() == 0 || count() == 64)) {
        solve(x, y, side[(which++)%2]);
    }
    commit();
    return(0);
}