// REVERSI OMAE vs. TOSHIE // Copyright (c) 2000-2011 Toshie Misu // All rights reserved. import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.Date; public class reversi extends Applet implements Runnable { private static final long serialVersionUID = 1L; MediaTracker mt; public int bd[][]; public double pts[][][]; public double AAA = 1.0; public double BBB = 5.0; Thread thread; public int III = 2; public int SZ = 32; public int SZ2 = 24; public int SZ4 = 4; public int XXX = -1; public int YYY = -1; public int STAT = -1; public Color dyellow; public int cid = 2; public int EVC = -2; public int EVU = -2; Font font, font2; public void init() { String param; int i, j; resize(SZ*8+101, SZ*8+1); font = new Font("Helvetica", Font.PLAIN, 14); font2 = new Font("Helvetica", Font.PLAIN, 18); enableEvents(AWTEvent.MOUSE_EVENT_MASK); dyellow = new Color(150, 150, 0); bd = new int[8][8]; for(j = 0; j < 8; j++) for(i = 0; i < 8; i++) bd[j][i] = 0; bd[3][3] = bd[4][4] = 1; bd[3][4] = bd[4][3] = 2; pts = new double[2][4][4]; param = getParameter("PT00"); if(param != null) pts[0][0][0] = new Double(param).doubleValue(); else pts[0][0][0] = 20.0; param = getParameter("PT01"); if(param != null) pts[0][0][1] = pts[0][1][0] = new Double(param).doubleValue(); else pts[0][0][1] = pts[0][1][0] = -10.0; param = getParameter("PT02"); if(param != null) pts[0][0][2] = pts[0][2][0] = new Double(param).doubleValue(); else pts[0][0][2] = pts[0][2][0] = 10.0; param = getParameter("PT11"); if(param != null) pts[0][1][1] = new Double(param).doubleValue(); else pts[0][1][1] = -10.0; param = getParameter("PT03"); if(param != null) pts[0][0][3] = pts[0][3][0] = new Double(param).doubleValue(); else pts[0][0][3] = pts[0][3][0] = 5.0; param = getParameter("PT12"); if(param != null) pts[0][1][2] = pts[0][2][1] = new Double(param).doubleValue(); else pts[0][1][2] = pts[0][2][1] = -3.0; param = getParameter("PT13"); if(param != null) pts[0][1][3] = pts[0][3][1] = new Double(param).doubleValue(); else pts[0][1][3] = pts[0][3][1] = -3.0; param = getParameter("PT22"); if(param != null) pts[0][2][2] = new Double(param).doubleValue(); else pts[0][2][2] = 0.0; param = getParameter("PT23"); if(param != null) pts[0][2][3] = pts[0][3][2] = new Double(param).doubleValue(); else pts[0][2][3] = pts[0][3][2] = 0.0; param = getParameter("PT33"); if(param != null) pts[0][3][3] = new Double(param).doubleValue(); else pts[0][3][3] = 0.0; pts[1][0][0] = pts[0][0][0]; pts[1][0][1] = pts[1][1][0] = pts[0][0][1]; pts[1][0][2] = pts[1][2][0] = pts[0][0][2]; pts[1][1][1] = pts[0][1][1]; pts[1][0][3] = pts[1][3][0] = pts[0][0][3]; pts[1][1][2] = pts[1][2][1] = pts[0][1][2]; pts[1][1][3] = pts[1][3][1] = pts[0][1][3]; pts[1][2][2] = pts[0][2][2]; pts[1][2][3] = pts[1][3][2] = pts[0][2][3]; pts[1][3][3] = pts[0][3][3]; param = getParameter("GET0"); if(param != null) AAA = new Double(param).doubleValue(); else AAA = 1.0; param = getParameter("GET1"); if(param != null) BBB = new Double(param).doubleValue(); else BBB = 5.0; } public int direcx(int x, int y, int d, int k) { switch(d) { case 0: return x + k; case 1: return x + k; case 2: return x; case 3: return x - k; case 4: return x - k; case 5: return x - k; case 6: return x; case 7: return x + k; } return -1; } public int direcy(int x, int y, int d, int k) { switch(d) { case 0: return y; case 1: return y + k; case 2: return y + k; case 3: return y + k; case 4: return y; case 5: return y - k; case 6: return y - k; case 7: return y - k; } return -1; } public int reverse(int b[][], int id, int x, int y) { int d, k, ii, jj, kk, i, j; int cnt = 0; if(b[y][x] != 0) return 0; for(d = 0; d < 8; d++) { for(k = 1; k < 8; k++) { ii = direcx(x, y, d, k); jj = direcy(x, y, d, k); if(ii < 0 || ii >= 8 || jj < 0 || jj >= 8) break; if(b[jj][ii] == 0) break; if(b[jj][ii] == id) { for(kk = 0; kk < k; kk++) { i = direcx(x, y, d, kk); j = direcy(x, y, d, kk); b[j][i] = id; } cnt += k - 1; break; } } } if(cnt == 0) { b[y][x] = 0; return 0; } return cnt + 1; } public double eval(int b[][], int id) { int xx, yy, i, j; double ev = 0.0; for(j = 0; j < 8; j++) { for(i = 0; i < 8; i++) { xx = (i < 4) ? i : (7 - i); yy = (j < 4) ? j : (7 - j); if(b[j][i] == id) ev += pts[III][yy][xx]; if(b[j][i] == 3 - id) ev -= pts[III][yy][xx]; } } return ev; } public int count(int b[][], int id, int x, int y) { int d, k, ii, jj; int cnt = 0; if(b[y][x] != 0) return 0; for(d = 0; d < 8; d++) { for(k = 1; k < 8; k++) { ii = direcx(x, y, d, k); jj = direcy(x, y, d, k); if(ii < 0 || ii >= 8 || jj < 0 || jj >= 8) break; if(b[jj][ii] == 0) break; if(b[jj][ii] == id) { cnt += k - 1; break; } } } if(cnt == 0) return 0; return cnt + 1; } public int space(int bd[][]) { int i, j, c; c = 0; for(j = 0; j < 8; j++) { for(i = 0; i < 8; i++) { if(bd[j][i] == 0) c++; } } return c; } public int search(int b[][], int id, int dp) { int i, j, mx = -1, my = -1, t; double ev, mev = -1000000.0; int bb[][], hm, hr; int evl, tevl; hr = space(b); bb = new int[8][8]; if(dp == 0) { for(j = 0; j < 8; j++) { for(i = 0; i < 8; i++) { for(t = 0; t < 64; t++) bb[t/8][t%8] = b[t/8][t%8]; if((hm = reverse(bb, id, i, j)) == 0) continue; ev = eval(bb, id) + (AAA * hr / 60.0 + BBB * (1.0 - hr / 60.0)) * hm; if(ev > mev) { mev = ev; mx = i; my = j; } } } if(mx == -1 || my == -1) return -1; evl = mx + my * 8; return evl; } for(j = 0; j < 8; j++) { for(i = 0; i < 8; i++) { for(t = 0; t < 64; t++) bb[t/8][t%8] = b[t/8][t%8]; if((hm = reverse(bb, id, i, j)) == 0) continue; tevl = search(bb, 3 - id, dp - 1); if(tevl != -1) reverse(bb, 3 - id, tevl % 8, tevl / 8); ev = eval(bb, id) + (AAA * hr / 60.0 + BBB * (1.0 - hr / 60.0)) * hm; if(ev > mev) { mev = ev; mx = i; my = j; } } } if(mx == -1 || my == -1) return -1; evl = mx + my * 8; return evl; } public int ispass(int bd[][], int id) { int i, j, c; for(j = 0; j < 8; j++) { for(i = 0; i < 8; i++) { c = count(bd, id, i, j); if(c > 0) { return 0; } } } return 1; } public void start() { if(thread == null) { thread = new Thread(this); thread.start(); } } public void stop() { if(thread != null) { thread = null; } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { int i, j; int b, w; g.setFont(font); g.setColor(dyellow); g.fillRect(8*SZ+1, 0, 100, 8*SZ+1); switch(III) { case 0: g.setColor(Color.black); g.fillOval(8*SZ+11, SZ4, SZ2, SZ2); break; case 1: g.setColor(Color.white); g.fillOval(8*SZ+11, SZ4, SZ2, SZ2); break; } if(III == cid - 1) { g.setColor(Color.pink); g.drawString("としえの番", 8*(SZ+1)+6, 45); } if(III == 2 - cid && (EVU >= 0 || EVU == -1)) { g.setColor(Color.pink); if(EVU == -1) { // g.drawString("置けないね!", 8*(SZ+1)+6, 125); } else if(EVU < 40) { } else if(EVU < 50) { g.drawString("あっ", 8*(SZ+1)+6, 125); } else if(EVU < 60) { g.drawString("ああ", 8*(SZ+1)+6, 125); } else if(EVU < 80) { g.drawString("何すんの!", 8*(SZ+1)+6, 125); } else if(EVU < 100) { g.drawString("KY!!", 8*(SZ+1)+6, 125); } else if(EVU < 120) { g.drawString("あ〜あ", 8*(SZ+1)+6, 125); } else { g.drawString("ひっどい", 8*(SZ+1)+6, 125); } } EVU = -2; if(III == 2 - cid) { g.setColor(Color.pink); g.drawString("おまえの番", 8*(SZ+1)+6, 45); } if(III == cid - 1 && (EVC >= 0 || EVC == -1)) { g.setColor(Color.pink); if(EVC == -1) { } else if(EVC < 40) { } else if(EVC < 50) { g.drawString("♪", 8*(SZ+1)+6, 125); } else if(EVC < 60) { g.drawString("(^_^)", 8*(SZ+1)+6, 125); } else if(EVC < 80) { g.drawString("くすっw", 8*(SZ+1)+6, 125); } else if(EVC < 100) { g.drawString("おらおら", 8*(SZ+1)+6, 125); } else if(EVC < 120) { g.drawString("はははっ♪", 8*(SZ+1)+6, 125); } else { g.drawString("よっしゃ", 8*(SZ+1)+6, 125); } } EVC = -2; if(III == 2) { g.setColor(Color.pink); g.drawString("先攻なら黒石を", 8*(SZ+1)-5, 35); g.drawString("後攻なら白石を", 8*(SZ+1)-5, 55); g.drawString("お触り", 8*(SZ+1)-5, 75); g.drawString(" くださいませ", 8*(SZ+1)-5, 95); g.drawString("ご主人様♪♪", 8*(SZ+1)-5, 115); } if(III == 3) { g.setColor(Color.yellow); g.drawString("もういっちょ!", 8*SZ+6, 5*SZ-2); } b = w = 0; for(j = 0; j < 8; j++) { for(i = 0; i < 8; i++) { g.setColor(dyellow); g.fillRect(i*SZ+1, j*SZ+1, SZ-1, SZ-1); g.setColor(Color.black); g.drawLine(i*SZ, j*SZ, i*SZ+SZ-1, j*SZ); g.drawLine(i*SZ, j*SZ+1, i*SZ, j*SZ+SZ-1); if(i == XXX && j == YYY) { if(III == 0) g.setColor(Color.red); else g.setColor(Color.cyan); g.fillOval(i*SZ+SZ4, j*SZ+SZ4, SZ2, SZ2); } else { switch(bd[j][i]) { case 1: g.setColor(Color.black); g.fillOval(i*SZ+SZ4, j*SZ+SZ4, SZ2, SZ2); b++; break; case 2: g.setColor(Color.white); g.fillOval(i*SZ+SZ4, j*SZ+SZ4, SZ2, SZ2); w++; break; default: break; } } } } if(III == 3) { g.setFont(font); g.setColor(Color.pink); if((b < w && cid == 1) || (b > w && cid == 2)) { g.drawString("おまえの勝ち", 8*(SZ+1)+2, 100); } else if((b > w && cid == 1) || (b < w && cid == 2)) { g.drawString("としえの勝ち", 8*(SZ+1)+2, 100); } else { g.drawString("引き分け", 8*(SZ+1)+14, 100); } } g.setColor(Color.black); g.drawLine(8*SZ, 0, 8*SZ, 8*SZ); g.drawLine(0, 8*SZ, 8*SZ-1, 8*SZ); if(III < 2 || III == 3) { g.setFont(font); g.setColor(Color.black); if(cid == 1) g.drawString("●としえ:", 8*SZ+6, 7*SZ+8); if(cid == 2) g.drawString("●おまえ:", 8*SZ+6, 7*SZ+8); g.drawString(""+((b < 10) ? "0" : "")+b, 8*SZ+77, 7*SZ+8); g.setColor(Color.white); if(cid == 1) g.drawString("●おまえ:", 8*SZ+6, 8*SZ-4); if(cid == 2) g.drawString("●としえ:", 8*SZ+6, 8*SZ-4); g.drawString(""+((w < 10) ? "0" : "")+w, 8*SZ+77, 8*SZ-4); } } public void processMouseEvent(MouseEvent e) { int i, j; if(e.getID() == MouseEvent.MOUSE_CLICKED) { if(STAT != -1 && STAT != -3 && STAT != -4) return; i = e.getX() / SZ; j = e.getY() / SZ; if(STAT == -4) { if(i >= 8 && j == 4) { STAT = 0; return; } return; } if(i < 0 || i >= 8 || j < 0 || j >= 8) { return; } if(STAT == -1 && count(bd, III + 1, i, j) <= 0) { return; } if(STAT == -3 && (i < 3 || i >= 5 || j < 3 || j >= 5)) { return; } STAT = i + j * 8; return; } return; } public void run() { int i, j, k, id, evl, ps = 0, ex; int endf = 0; do { endf = ex = 0; repaint(); STAT = -3; while(STAT == -3) { try { Thread.sleep(100); } catch(InterruptedException e) { break; } } if(STAT == 28 || STAT == 35) cid = 1; else cid = 2; STAT = -2; for(k = 0; k < 64; k++) { for(id = 1; id < 3; id++) { III = id - 1; repaint(); try { Thread.sleep(200); } catch(InterruptedException e) { break; } EVC = -2; EVU = -2; if(id == cid) { EVC = evl = search(bd, id, 3); if(evl == -1) { if(ps == 1) { endf = 1; break; } ps = 1; continue; } else ps = 0; } else { if(ispass(bd, id) == 1) { if(ps == 1) { endf = 1; break; } ps = 1; EVU = -1; continue; } else ps = 0; STAT = -1; while(STAT == -1) { try { Thread.sleep(100); } catch(InterruptedException e) { break; } } evl = STAT; STAT = -2; } EVU = evl; XXX = evl % 8; YYY = evl / 8; repaint(); try { Thread.sleep(500); } catch(InterruptedException e) { break; } XXX = YYY = -1; reverse(bd, id, evl % 8, evl / 8); } if(endf == 1) break; } III = 3; repaint(); STAT = -4; while(STAT == -4) { try { Thread.sleep(100); } catch(InterruptedException e) { break; } } if(STAT == 1) ex = 1; else ex = 0; STAT = -2; III = 2; for(j = 0; j < 8; j++) for(i = 0; i < 8; i++) bd[j][i] = 0; bd[3][3] = bd[4][4] = 1; bd[3][4] = bd[4][3] = 2; } while(ex == 0); } }