簡単なオセロ
ざーっと書いて、まだテストもろくにしてないので、バグだらけだと思います
一応アップしておきます
//簡単なオセロ(プレイヤーが、正確に石を置く想定) #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); }