・JAVA
・対人用
・ひっくり返せないとこには置けないルール未実装
・バグ・不具合等一切責任負いません
・よかったらやってみてね

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Othello extends Applet implements MouseListener {
final int GP = 30;
final int X0 = 10;
final int Y0 = 10;
int i,j,x,y;
public void start() {
Board b = new Board();
addMouseListener(this);
}
public void paint(Graphics g) {
g.setColor(Color.green);
g.fillRect(X0-6,Y0-6,GP*8+12,GP*8+12);
g.setColor(Color.black);
for (i=0;i<=8;i++) {
x = i * GP + X0;
g.drawLine(x,Y0,x,GP*8+Y0);
y = i * GP + Y0;
g.drawLine(X0,y,GP*8+X0,y);
}
g.fillOval(GP*2+X0-2,GP*2+Y0-2,5,5);
g.fillOval(GP*2+X0-2,GP*6+Y0-2,5,5);
g.fillOval(GP*6+X0-2,GP*2+Y0-2,5,5);
g.fillOval(GP*6+X0-2,GP*6+Y0-2,5,5);
for (i=0;i<8;i++) {
for (j=0;j<8;j++) {
if (Board.grid[i][j] != 0) {
if (Board.grid[i][j] > 0) {
g.setColor(Color.white);
} else {
g.setColor(Color.black);
}
g.fillOval(GP*i+X0+4,GP*j+Y0+4,23,23);
}
}
}
//g.setColor(Color.green);
//g.fillRect(GP*7+X0,GP*8+Y0+6,36,36);
if (Board.flag < 0) {
g.setColor(Color.black);
g.fillOval(GP*7+X0+4,GP*8+Y0+14,23,23);
} else {
g.setColor(Color.white);
g.fillOval(GP*7+X0+4,GP*8+Y0+14,23,23);
g.setColor(Color.black);
g.drawOval(GP*7+X0+4,GP*8+Y0+14,23,23);
}
}
// implements MouseListener するクラスは以下の5つのメソッドが必要
public void mousePressed(MouseEvent e) {
i = e.getX();
j = e.getY();
i -= X0;
j -= Y0;
if (i%GP>5&&i%GP<GP-5&&j%GP>5&&j%GP<GP-5) {
i /= GP;
j /= GP;
//System.out.println("Pressed at ("+i+","+j+")");
if (Board.check(i,j) == 0) {
Board.place(i,j);
Board.flip(i,j);
repaint();
}
}
}
public void mouseReleased(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
class Board {
public static int grid[][] = new int[8][8];
public static int flag=-1;
int i,j;
public Board() { //コンストラクタBoard 0が空,1が白,-1が黒,左上が(0,0)として初期配置を行う
for (i=0;i<8;i++) {
for (j=0;j<8;j++) {
grid[i][j] = 0;
}
}
grid[3][3] = grid[4][4] = 1;
grid[3][4] = grid[4][3] = -1;
}
static int check(int i, int j) {
if (grid[i][j] != 0) {
System.out.printf("%s","\007");
System.out.println("already occupied");
return -1;
}
return 0;
}
static void place(int i, int j) { // クラスメソッド place 石を置き、置く順番を交代するメソッド
Board.grid[i][j] = flag;
flag *= -1;
/* //0,1,-1で石の状態をテキストで表示する
for (j=0;j<8;j++) {
for (i=0;i<8;i++) {
if (Board.grid[i][j] < 0) {
System.out.print(" "+Board.grid[i][j]);
} else {
System.out.print(" "+Board.grid[i][j]);
}
}
System.out.println();
}*/
}
static void flip(int i, int j) { //クラスメソッドflip はさんだ石をひっくり返すメソッド
int c = 0;
// 上について
for (int n=1; j-n >= 0 ; n++){
if(grid[i][j-n] == flag){ //上が違う色ならカウンタ増やす
c++;
}else{
if(c==0){ //カウンタ0で違う色でないなら終わり
break;
}else{
if(grid[i][j-n] == 0){ //カウンタ0でなくても空なら終わり
break;
}else{
for(; c>0; c--){//はさまれている分だけ石をひっくり返す
grid[i][j-c] *= -1;
}
}
}
}
}
c=0;//上終わり カウンタは初期化
// 右上について
for (int n=1; j-n >= 0 && i+n <=7 ; n++){
if(grid[i+n][j-n] == flag){ //右上が違う色ならカウンタ増やす
c++;
}else{
if(c==0){ //カウンタ0で違う色でないなら終わり
break;
}else{
if(grid[i+n][j-n] == 0){ //カウンタ0でなくても空なら終わり
break;
}else{
for(; c>0; c--){//はさまれている分だけ石をひっくり返す
grid[i+c][j-c] *= -1;
}
}
}
}
}
c=0;//右上終わり
// 右について
for (int n=1; i+n <=7 ; n++){
if(grid[i+n][j] == flag){ //右が違う色ならカウンタ増やす
c++;
}else{
if(c==0){ //カウンタ0で違う色でないなら終わり
break;
}else{
if(grid[i+n][j] == 0){ //カウンタ0でなくても空なら終わり
break;
}else{
for(; c>0; c--){//はさまれている分だけ石をひっくり返す
grid[i+c][j] *= -1;
}
}
}
}
}
c=0;//右終わり
// 右下について
for (int n=1; j+n <= 7 && i+n <=7 ; n++){
if(grid[i+n][j+n] == flag){ //右下が違う色ならカウンタ増やす
c++;
}else{
if(c==0){ //カウンタ0で違う色でないなら終わり
break;
}else{
if(grid[i+n][j+n] == 0){ //カウンタ0でなくても空なら終わり
break;
}else{
for(; c>0; c--){//はさまれている分だけ石をひっくり返す
grid[i+c][j+c] *= -1;
}
}
}
}
}
c=0;//右下終わり
// 下について
for (int n=1; j+n <= 7 ; n++){
if(grid[i][j+n] == flag){ //下が違う色ならカウンタ増やす
c++;
}else{
if(c==0){ //カウンタ0で違う色でないなら終わり
break;
}else{
if(grid[i][j+n] == 0){ //カウンタ0でなくても空なら終わり
break;
}else{
for(; c>0; c--){//はさまれている分だけ石をひっくり返す
grid[i][j+c] *= -1;
}
}
}
}
}
c=0;//下終わり
// 左下について
for (int n=1; i-n >= 0 && j+n <=7 ; n++){
if(grid[i-n][j+n] == flag){ //左下が違う色ならカウンタ増やす
c++;
}else{
if(c==0){ //カウンタ0で違う色でないなら終わり
break;
}else{
if(grid[i-n][j+n] == 0){ //カウンタ0でなくても空なら終わり
break;
}else{
for(; c>0; c--){//はさまれている分だけ石をひっくり返す
grid[i-c][j+c] *= -1;
}
}
}
}
}
c=0;//左下終わり
// 左について
for (int n=1; i-n >=0 ; n++){
if(grid[i-n][j] == flag){ //左が違う色ならカウンタ増やす
c++;
}else{
if(c==0){ //カウンタ0で違う色でないなら終わり
break;
}else{
if(grid[i-n][j] == 0){ //カウンタ0でなくても空なら終わり
break;
}else{
for(; c>0; c--){//はさまれている分だけ石をひっくり返す
grid[i-c][j] *= -1;
}
}
}
}
}
c=0;//左終わり
// 左上について
for (int n=1; j-n >= 0 && i-n >=0 ; n++){
if(grid[i-n][j-n] == flag){ //左上が違う色ならカウンタ増やす
c++;
}else{
if(c==0){ //カウンタ0で違う色でないなら終わり
break;
}else{
if(grid[i-n][j-n] == 0){ //カウンタ0でなくても空なら終わり
break;
}else{
for(; c>0; c--){//はさまれている分だけ石をひっくり返す
grid[i-c][j-c] *= -1;
}
}
}
}
}
c=0;//左上終わり
}
}