(Java/FX ) Java CD Java version Java VC++ Python Ruby Java Java Eclipse Java Java 3 Java for Everyone 2 10 Java Midi Java JavaFX Shape Canvas C

Similar documents
GIMP import javafx.application.application; import javafx.scene.scene; import javafx.scene.canvas.canvas; import javafx.scene.canvas.graphicscontext;

K227 Java 2

Python2 Python3 Python 2.7 Python 3.6 Python2 Python3 Python 2.7 Python3.6 Python Python Anaconda Python Anaconda Python

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

// ステージを設定します stage.setscene(scene); stage.settitle(" キャンバス "); // ステージを表示します stage.show(); public static void main(string[] args) launch(args); キャンバス

I java A

新・明解Java入門

オブジェクト指向言語 Java 博士 ( 情報理工学 ) 小林貴訓博士 ( 工学 ) Htoo Htoo 共著工学博士大澤裕 コロナ社 コロナ社

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

8 if switch for while do while 2

r1.dvi

HCI プログラミング 8 回目ボタン チェックボックス ラジオボタン 今日の講義で学ぶ内容 ボタンとアクションイベント ボタンのカスタマイズ チェックボックスとラジオボタン ボタンとアクションイベント 1 ボタンを配置してみましょう ボタンは ラベルと同じようにフォントやその色 画像の貼り付けなど

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

: : : TSTank 2

ALG ppt

untitled

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1


r02.dvi

ohp02.dvi

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

Java演習(4) -- 変数と型 --

問題1 以下に示すプログラムは、次の処理をするプログラムである

Java updated

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

2 1 Web Java Android Java 1.2 6) Java Java 7) 6) Java Java (Swing, JavaFX) (JDBC) 7) OS 1.3 Java Java

Object MenuComponent MenuBar MenuItem Menu CheckboxMenuItem

Java (5) 1 Lesson 3: x 2 +4x +5 f(x) =x 2 +4x +5 x f(10) x Java , 3.0,..., 10.0, 1.0, 2.0,... flow rate (m**3/s) "flow

Thread

ALG ppt

MyEventHandler actionhandler = new MyEventHandler(); m.addeventhandler(actionevent.any, actionhandler); // レイアウト BorderPane を生成 / 設定します BorderPane bp

ALG2012-F.ppt

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

オブジェクト指向プログラミング・同演習 5月21日演習課題

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

明解Javaによるアルゴリズムとデータ構造

IE6 2 BMI chapter1 Java 6 chapter2 Java 7 chapter3 for if 8 chapter4 : BMI 9 chapter5 Java GUI 10 chapter6 11 chapter7 BMI 12 chap

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

2 static final int DO NOTHING ON CLOSE static final int HIDE ON CLOSE static final int DISPOSE ON CLOSE static final int EXIT ON CLOSE void setvisible

Java学習教材

Java言語 第1回

問題1 以下に示すプログラムは、次の処理をするプログラムである

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

ohp07.dvi


2.2 Java C main Java main 2 C 6 C Java 3 C Java ( ) G101Hello.java G101Hello main G101Hello.java /* G101Hello */ class G101Hello { /* main */ public s


1: Preference Display 1 package sample. pref ; 2 3 import android. app. Activity ; 4 import android. content. Intent ; 5 import android. content. Shar

Java講座

アルゴリズムとデータ構造1

Assignment9_1.java

解きながら学ぶJava入門編

untitled

¥×¥í¥°¥é¥ß¥ó¥°±é½¬I Exercise on Programming I [1zh] ` `%%%`#`&12_`__~~~ alse

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

public class MyFrame { private JPanel panel1; private JPanel panel2; private JPanel panel3; private JPanel panel4; private JLabel label1; private JTex

Programming-C-9.key

tkk0408nari

JavaプログラミングⅠ

,,,,., C Java,,.,,.,., ,,.,, i

10K pdf

2

Microsoft Word - keisankigairon.ch doc

226

Java (7) Lesson = (1) 1 m 3 /s m 2 5 m 2 4 m 2 1 m 3 m 1 m 0.5 m 3 /ms 0.3 m 3 /ms 0.6 m 3 /ms 1 1 3

2

Q&A集

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

r3.dvi

haskell.gby

(Eclipse\202\305\212w\202\324Java2\215\374.pdf)

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

Java Java Java Java Java 4 p * *** ***** *** * Unix p a,b,c,d 100,200,250,500 a*b = a*b+c = a*b+c*d = (a+b)*(c+d) = 225

55 7 Java C Java TCP/IP TCP/IP TCP TCP_RO.java import java.net.*; import java.io.*; public class TCP_RO { public static void main(string[] a

6 p.1 6 Java GUI GUI paintcomponent GUI mouseclicked, keypressed, actionperformed mouseclicked paintcomponent thread, 1 GUI 6.0.2, mutlithread C

< F2D B838A835882CC8CF68EAE2E6A7464>

アルゴリズムとデータ構造1

新・明解Javaで学ぶアルゴリズムとデータ構造

プログラミングA

ALG2012-A.ppt

データ構造とアルゴリズム論

1 Java Java GUI , 2 2 jlabel1 jlabel2 jlabel3 jtextfield1 jtextfield2 jtextfield3 jbutton1 jtextfield1 jtextfield2 jtextfield3

JavaプログラミングⅠ

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

目 次 Java GUI 3 1 概要 クラス構成 ソースコード例 課題...7 i

デジタル表現論・第4回

ALG2012-C.ppt

< F2D834F838C A815B A CC>

GUIプログラムⅤ

アプレットの作成

GEC-Java

JAVA とテンプレート

オブジェクト脳のつくり方

. IDE JIVE[1][] Eclipse Java ( 1) Java Platform Debugger Architecture [5] 3. Eclipse GUI JIVE 3.1 Eclipse ( ) 1 JIVE Java [3] IDE c 016 Information Pr

ALG ppt

untitled

JavaプログラミングⅠ

Transcription:

(Java/FX ) Java CD Java version 10.0.1 Java VC++ Python Ruby Java Java Eclipse Java Java 3 Java for Everyone 2 10 Java Midi Java JavaFX Shape Canvas Canvas Eclipse Eclipse M... 1

javafx e(fx)clipse 3.0.0 Eclipse JavaFX 2

Java Eclispe Sudoku import javafx.application.application; public class Sudoku extends Application { public static void main(string... args) { } Sudoku Application Application import Sudoku public class Sudoku extends Application { Canvas canvas; int board_size = 500; @Override public void start(stage pstage) { Pane root = new Pane(); canvas = new Canvas(board_size, board_size); root.getchildren().add(canvas); drawcanvas(); Scene scene = new Scene(root); pstage.settitle(" "); pstage.setscene(scene); pstage.show(); void drawcanvas() { public static void main(string... args) { launch(args); } Canvas canvas canvas board_size start(stage pstage) start(stage pstage) Python Ruby canvas = new Canvas(board_size, board_size); drawcanvas() 3

void drawcanvas() { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; GraphicsContext gc = canvas.getgraphicscontext2d(); gc.setstroke(color.blue); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(2); gc.strokeline(w, h+i*s, w+9*s, h+i*s); else { gc.setlinewidth(1); gc.strokeline(w, h+i*s, w+9*s, h+i*s); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(2); gc.strokeline(w+i*s, h, w+i*s, h+9*s); else { gc.setlinewidth(1); gc.strokeline(w+i*s, h, w+i*s, h+9*s); import javafx.application.application; import javafx.scene.scene; import javafx.scene.canvas.canvas; import javafx.scene.canvas.graphicscontext; import javafx.scene.layout.pane; import javafx.scene.paint.color; import javafx.stage.stage; public class Sudoku extends Application { Canvas canvas; int board_size = 500; @Override public void start(stage pstage) { Pane root = new Pane(); 4

canvas = new Canvas(board_size, board_size); root.getchildren().add(canvas); drawcanvas(); Scene scene = new Scene(root); pstage.settitle(" "); pstage.setscene(scene); pstage.show(); void drawcanvas() { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; GraphicsContext gc = canvas.getgraphicscontext2d(); gc.setstroke(color.blue); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(2); gc.strokeline(w, h+i*s, w+9*s, h+i*s); else { gc.setlinewidth(1); gc.strokeline(w, h+i*s, w+9*s, h+i*s); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(2); gc.strokeline(w+i*s, h, w+i*s, h+9*s); else { gc.setlinewidth(1); gc.strokeline(w+i*s, h, w+i*s, h+9*s); public static void main(string... args) { launch(args); } 5

import javafx.application.application; import javafx.scene.scene; import javafx.scene.canvas.canvas; import javafx.scene.canvas.graphicscontext; import javafx.scene.layout.pane; import javafx.scene.paint.color; import javafx.stage.stage; import javafx.application.application; import Eclipse drawcanvas() int i = 1, j = 1; int n = 9; gc.setfont(new Font("courier", 50)); gc.setstroke(color.black); gc.settextalign(textalignment.center); 6

gc.filltext(string.valueof(n), w+(i+0.5)*s, h+(j+0.9)*s); i = 8; j = 8; n = 5; gc.setfont(new Font(" ", 40)); gc.settextalign(textalignment.left); gc.stroketext(string.valueof(n), w+(i+0.1)*s, h+(j+0.9)*s); gc.stroketext(string.valueof(n), w+(i+0.1)*s, h+(j+0.9)*s); gc.stroketext() gc.settextalign(textalignment.left); gc.settextalign(textalignment.center); y 7

gc.setfont(new Font("courier", 50)); gc.setstroke(color.black); ban ban int[][] ban = { {0,1,0,0,0,0,9,0,3}, {0,9,0,0,0,7,0,0,0}, {0,0,0,0,0,0,0,7,1}, {6,0,9,0,0,0,0,0,0}, {0,0,7,6,0,0,0,0,0}, {2,0,0,8,0,5,0,0,0}, {0,0,4,0,0,8,0,0,0}, {0,3,0,0,2,0,0,0,0}, {0,0,8,5,3,0,0,9,4}}; 2 drawcanvas() gc.setfont(new Font("courier", 50)); gc.setstroke(color.black); gc.settextalign(textalignment.center); for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ban[j][i] >0) { gc.filltext(string.valueof(ban[j][i]), w+(i+0.5)*s, h+(j+0.9)*s); import javafx.application.application; import javafx.scene.scene; import javafx.scene.canvas.canvas; import javafx.scene.canvas.graphicscontext; import javafx.scene.layout.pane; import javafx.scene.paint.color; import javafx.scene.text.font; import javafx.scene.text.textalignment; import javafx.stage.stage; public class Sudoku extends Application { Canvas canvas; int board_size = 500; 8

int[][] ban = { {0,1,0,0,0,0,9,0,3}, {0,9,0,0,0,7,0,0,0}, {0,0,0,0,0,0,0,7,1}, {6,0,9,0,0,0,0,0,0}, {0,0,7,6,0,0,0,0,0}, {2,0,0,8,0,5,0,0,0}, {0,0,4,0,0,8,0,0,0}, {0,3,0,0,2,0,0,0,0}, {0,0,8,5,3,0,0,9,4}}; @Override public void start(stage pstage) { Pane root = new Pane(); canvas = new Canvas(board_size, board_size); root.getchildren().add(canvas); drawcanvas(); Scene scene = new Scene(root); pstage.settitle(" "); pstage.setscene(scene); pstage.show(); void drawcanvas() { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; GraphicsContext gc = canvas.getgraphicscontext2d(); gc.setstroke(color.blue); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(3); gc.strokeline(w, h+i*s, w+9*s, h+i*s); else { gc.setlinewidth(1); gc.strokeline(w, h+i*s, w+9*s, h+i*s); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(3); 9

gc.strokeline(w+i*s, h, w+i*s, h+9*s); else { gc.setlinewidth(1); gc.strokeline(w+i*s, h, w+i*s, h+9*s); gc.setfont(new Font("courier", 50)); gc.setstroke(color.black); gc.settextalign(textalignment.center); for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ban[j][i] >0) { gc.filltext(string.valueof(ban[j][i]), w+(i+0.5)*s, h+(j+0.9)*s); public static void main(string... args) { launch(args); } if (i % 3 == 0) { gc.setlinewidth(3); gc.strokeline(w, h+i*s, w+9*s, h+i*s); else { gc.setlinewidth(1); gc.strokeline(w, h+i*s, w+9*s, h+i*s); 10

start(stage pstage) public void start(stage pstage) { MenuBar bar = new MenuBar(); Menu m1 = new Menu("Sample"); MenuItem sample1 = new MenuItem("Sample1"); MenuItem sample2 = new MenuItem("Sample2"); m1.getitems().addall(sample1, sample2); bar.getmenus().add(m1); VBox root = new VBox(); canvas = new Canvas(board_size, board_size); root.getchildren().addall(bar, canvas); drawcanvas(); Scene scene = new Scene(root); pstage.settitle(" "); pstage.setscene(scene); pstage.show(); 11

Pane root = new Pane(); VBox root = new VBox(); start(stage pstage) sample1.setonaction((event)->{ ban = ban1; drawcanvas(); ); sample2.setonaction((event)->{ ban = ban2; drawcanvas(); ); Sudoku 12

int[][] ban = { {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0} ; int[][] ban1 = { {0,1,0,0,0,0,9,0,3}, {0,9,0,0,0,7,0,0,0}, {0,0,0,0,0,0,0,7,1}, {6,0,9,0,0,0,0,0,0}, {0,0,7,6,0,0,0,0,0}, {2,0,0,8,0,5,0,0,0}, {0,0,4,0,0,8,0,0,0}, {0,3,0,0,2,0,0,0,0}, {0,0,8,5,3,0,0,9,4} ; int[][] ban2 = { {0,0,0,0,0,6,2,0,1}, {0,0,0,0,4,0,3,7,0}, {0,0,3,0,9,2,0,0,6}, {4,0,5,0,0,0,0,6,0}, {0,0,0,0,7,0,0,0,0}, {0,2,0,0,0,0,4,0,5}, {9,0,0,4,5,0,1,0,0}, {0,5,4,0,2,0,0,0,0}, {7,0,1,9,0,0,0,0,0} ; drawcanvas() 2 gc.clearrect(0, 0, board_size, board_size); import javafx.application.application; import javafx.scene.scene; import javafx.scene.canvas.canvas; import javafx.scene.canvas.graphicscontext; 13

import javafx.scene.control.menu; import javafx.scene.control.menubar; import javafx.scene.control.menuitem; import javafx.scene.layout.vbox; import javafx.scene.paint.color; import javafx.scene.text.font; import javafx.scene.text.textalignment; import javafx.stage.stage; public class Sudoku extends Application { Canvas canvas; int board_size = 500; int[][] ban = { {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0} ; int[][] ban1 = { {0,1,0,0,0,0,9,0,3}, {0,9,0,0,0,7,0,0,0}, {0,0,0,0,0,0,0,7,1}, {6,0,9,0,0,0,0,0,0}, {0,0,7,6,0,0,0,0,0}, {2,0,0,8,0,5,0,0,0}, {0,0,4,0,0,8,0,0,0}, {0,3,0,0,2,0,0,0,0}, {0,0,8,5,3,0,0,9,4} ; int[][] ban2 = { {0,0,0,0,0,6,2,0,1}, {0,0,0,0,4,0,3,7,0}, {0,0,3,0,9,2,0,0,6}, {4,0,5,0,0,0,0,6,0}, {0,0,0,0,7,0,0,0,0}, {0,2,0,0,0,0,4,0,5}, {9,0,0,4,5,0,1,0,0}, {0,5,4,0,2,0,0,0,0}, 14

{7,0,1,9,0,0,0,0,0} ; @Override public void start(stage pstage) { MenuBar bar = new MenuBar(); Menu m1 = new Menu("Sample"); MenuItem sample1 = new MenuItem("Sample1"); MenuItem sample2 = new MenuItem("Sample2"); m1.getitems().addall(sample1, sample2); bar.getmenus().add(m1); VBox root = new VBox(); canvas = new Canvas(board_size, board_size); root.getchildren().addall(bar, canvas); drawcanvas(); Scene scene = new Scene(root); pstage.settitle(" "); pstage.setscene(scene); pstage.show(); sample1.setonaction((event)->{ ban = ban1; drawcanvas(); ); sample2.setonaction((event)->{ ban = ban2; drawcanvas(); ); void drawcanvas() { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; GraphicsContext gc = canvas.getgraphicscontext2d(); gc.clearrect(0, 0, board_size, board_size); gc.setstroke(color.blue); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(3); gc.strokeline(w, h+i*s, w+9*s, h+i*s); else { 15

gc.setlinewidth(1); gc.strokeline(w, h+i*s, w+9*s, h+i*s); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(3); gc.strokeline(w+i*s, h, w+i*s, h+9*s); else { gc.setlinewidth(1); gc.strokeline(w+i*s, h, w+i*s, h+9*s); gc.setfont(new Font("courier", 50)); gc.setstroke(color.black); gc.settextalign(textalignment.center); for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ban[j][i] >0) { gc.filltext(string.valueof(ban[j][i]), w+(i+0.5)*s, h+(j+0.9)*s); public static void main(string... args) { launch(args); } 16

Sample1 Sample2 17

start(stage pstage) RadioButton rb1 = new RadioButton("Ban"); RadioButton rb2 = new RadioButton("Ans"); ToggleGroup group = new ToggleGroup(); rb1.settogglegroup(group);; rb2.settogglegroup(group);; rb1.setselected(true);; root.getchildren().addall(bar, canvas, rb1, rb2); 18

start(stage pstage) canvas.setonmouseclicked((event)->{ buttonpressed(event.getx(), event.gety()); ); Sudoku buttonpressed(double x, double y) void buttonpressed(double x, double y) { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; int i = (int) Math.floor((x - w) / s); int j = (int) Math.floor((y - h) / s); int n = 7; if (i >= 0 && i < 9 && j >= 0 && j < 9) { gc.setfont(new Font("courier", 50)); gc.setstroke(color.black); gc.settextalign(textalignment.center); gc.filltext(string.valueof(n), w+(i+0.5)*s, h+(j+0.9)*s); 19

gc drawcanvas() Sudoku GraphicsContext gc; drawcanvas() gc = canvas.getgraphicscontext2d(); import javafx.application.application; import javafx.scene.scene; import javafx.scene.canvas.canvas; import javafx.scene.canvas.graphicscontext; import javafx.scene.control.menu; import javafx.scene.control.menubar; import javafx.scene.control.menuitem; import javafx.scene.control.radiobutton; import javafx.scene.control.togglegroup; import javafx.scene.layout.vbox; import javafx.scene.paint.color; import javafx.scene.text.font; import javafx.scene.text.textalignment; import javafx.stage.stage; public class Sudoku extends Application { Canvas canvas; GraphicsContext gc; int board_size = 500; int[][] ban = { {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0} ; int[][] ban1 = { {0,1,0,0,0,0,9,0,3}, {0,9,0,0,0,7,0,0,0}, {0,0,0,0,0,0,0,7,1}, {6,0,9,0,0,0,0,0,0}, 20

{0,0,7,6,0,0,0,0,0}, {2,0,0,8,0,5,0,0,0}, {0,0,4,0,0,8,0,0,0}, {0,3,0,0,2,0,0,0,0}, {0,0,8,5,3,0,0,9,4} ; int[][] ban2 = { {0,0,0,0,0,6,2,0,1}, {0,0,0,0,4,0,3,7,0}, {0,0,3,0,9,2,0,0,6}, {4,0,5,0,0,0,0,6,0}, {0,0,0,0,7,0,0,0,0}, {0,2,0,0,0,0,4,0,5}, {9,0,0,4,5,0,1,0,0}, {0,5,4,0,2,0,0,0,0}, {7,0,1,9,0,0,0,0,0} ; @Override public void start(stage pstage) { MenuBar bar = new MenuBar(); Menu m1 = new Menu("Sample"); MenuItem sample1 = new MenuItem("Sample1"); MenuItem sample2 = new MenuItem("Sample2"); m1.getitems().addall(sample1, sample2); bar.getmenus().add(m1); RadioButton rb1 = new RadioButton("Ban"); RadioButton rb2 = new RadioButton("Ans"); ToggleGroup group = new ToggleGroup(); rb1.settogglegroup(group);; rb2.settogglegroup(group);; rb1.setselected(true);; VBox root = new VBox(); canvas = new Canvas(board_size, board_size); root.getchildren().addall(bar, canvas, rb1, rb2); drawcanvas(); Scene scene = new Scene(root); pstage.settitle(" "); pstage.setscene(scene); pstage.show(); sample1.setonaction((event)->{ ban = ban1; 21

drawcanvas(); ); sample2.setonaction((event)->{ ban = ban2; drawcanvas(); } ); canvas.setonmouseclicked((event)->{ buttonpressed(event.getx(), event.gety()); ); void buttonpressed(double x, double y) { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; int i = (int) Math.floor((x - w) / s); int j = (int) Math.floor((y - h) / s); int n = 7; if (i >= 0 && i < 9 && j >= 0 && j < 9) { gc.setfont(new Font("courier", 50)); gc.setstroke(color.black); gc.settextalign(textalignment.center); gc.filltext(string.valueof(n), w+(i+0.5)*s, h+(j+0.9)*s); void drawcanvas() { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; gc = canvas.getgraphicscontext2d(); gc.clearrect(0, 0, board_size, board_size); gc.setstroke(color.blue); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(3); gc.strokeline(w, h+i*s, w+9*s, h+i*s); else { gc.setlinewidth(1); gc.strokeline(w, h+i*s, w+9*s, h+i*s); 22

for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(3); gc.strokeline(w+i*s, h, w+i*s, h+9*s); else { gc.setlinewidth(1); gc.strokeline(w+i*s, h, w+i*s, h+9*s); gc.setfont(new Font("courier", 50)); gc.setstroke(color.black); gc.settextalign(textalignment.center); for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ban[j][i] >0) { gc.filltext(string.valueof(ban[j][i]), w+(i+0.5)*s, h+(j+0.9)*s); public static void main(string... args) { launch(args); } 23

buttonpressed(double x, double y) void buttonpressed(double x, double y) { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; int i = (int) Math.floor((x - w) / s); int j = (int) Math.floor((y - h) / s); if (i >= 0 && i < 9 && j >= 0 && j < 9) { String str = "123456789"; TextInputDialog dlg = new TextInputDialog(str); str = dlg.showandwait().orelse(""); if (str!= "") { int n = Integer.parseInt(str); ban[j][i] = n; drawcanvas(); 24

OK ans[][] Sudoku Sudoku int[][] ans = new int[9][9];; RadioButton rb1; RadioButton rb2; start(stage pstage) 25

rb1 = new RadioButton("Ban"); rb2 = new RadioButton("Ans"); sample1.setonaction() sample1.setonaction() sample1.setonaction((event)->{ ban = ban1; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { ans[j][i] = ban[j][i]; drawcanvas(); ); sample2.setonaction((event)->{ ban = ban2; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { ans[j][i] = ban[j][i]; drawcanvas(); ); buttonpressed(double x, double y) void buttonpressed(double x, double y) { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; int i = (int) Math.floor((x - w) / s); int j = (int) Math.floor((y - h) / s); if (i >= 0 && i < 9 && j >= 0 && j < 9) { String str = "123456789"; TextInputDialog dlg = new TextInputDialog(str); str = dlg.showandwait().orelse(""); if (str!= "") { int n = Integer.parseInt(str); if (rb1.isselected()) { ban[j][i] = n; ans[j][i] = n; else { ans[j][i] = n; 26

drawcanvas(); drawcanvas() void drawcanvas() { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; gc = canvas.getgraphicscontext2d(); gc.clearrect(0, 0, board_size, board_size); gc.setstroke(color.blue); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(3); gc.strokeline(w, h+i*s, w+9*s, h+i*s); else { gc.setlinewidth(1); gc.strokeline(w, h+i*s, w+9*s, h+i*s); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(3); gc.strokeline(w+i*s, h, w+i*s, h+9*s); else { gc.setlinewidth(1); gc.strokeline(w+i*s, h, w+i*s, h+9*s); gc.setfont(new Font("courier", 50)); gc.settextalign(textalignment.center); for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ban[j][i] >0) { gc.setfill(color.blue); gc.filltext(string.valueof(ban[j][i]), w+(i+0.5)*s, h+(j+0.9)*s); else if (ans[j][i] > 0) { gc.setfill(color.red); 27

gc.filltext(string.valueof(ans[j][i]), w+(i+0.5)*s, h+(j+0.9)*s); filltext() gc.setfill(color.blue); ban ans VC++ MenuBar bar = new MenuBar(); Menu m2 = new Menu("File"); MenuItem savemenu = new MenuItem("Save"); MenuItem openmenu = new MenuItem("Open"); m2.getitems().addall(savemenu, openmenu); Menu m1 = new Menu("Sample"); MenuItem sample1 = new MenuItem("Sample1"); MenuItem sample2 = new MenuItem("Sample2"); 28

m1.getitems().addall(sample1, sample2); bar.getmenus().addall(m2, m1); savemenu.setonaction((event)->{ try { FileChooser fc = new FileChooser(); File sf = fc.showsavedialog(pstage); if (sf!= null) { FileWriter fileout = new FileWriter(sf); for (int j=0; j<9; j++) { String str = ""; for (int i=0; i<9; i++) { str += String.valueOf(ban[j][i])+ " "; fileout.write(str + "\n"); for (int j=0; j<9; j++) { String str = ""; for (int i=0; i<9; i++) { str += String.valueOf(ans[j][i])+ " "; fileout.write(str + "\n"); fileout.close(); catch(exception e) {}; ); openmenu.setonaction((event)->{ try { FileChooser fc = new FileChooser(); File sf = fc.showopendialog(pstage); if (sf!= null) { FileReader filein = new FileReader(sf); BufferedReader buf = new BufferedReader(filein); String data; int row = 0; while ((data = buf.readline())!= null) { String[] sa = data.split(" "); if (row < 9) { for (int i=0; i<9; i++) { 29

ban[row][i] = Integer.parseInt(sa[i]); else { for (int i=0; i<9; i++) { ans[row-9][i] = Integer.parseInt(sa[i]); row++; filein.close(); catch(exception e) {}; drawcanvas(); ); 30

ban[][] ans[][] Open 31

1 9 Java Python Ruby set boolean[][][] hint[j][i][n] = true if n is candidate, = false if n is not candidate Sudoku boolean[][][] hint = new boolean[9][9][10]; 101 n 9 sample1.setonaction((event)->{ ban = ban1; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { ans[j][i] = ban[j][i]; sethint(); drawcanvas(); ); sample2.setonaction((event)->{ 32

ban = ban2; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { ans[j][i] = ban[j][i]; sethint(); drawcanvas(); ); sethint(); openmenu.setonaction((event)->{ try { FileChooser fc = new FileChooser(); File sf = fc.showopendialog(pstage); if (sf!= null) { FileReader filein = new FileReader(sf); BufferedReader buf = new BufferedReader(filein); String data; int row = 0; while ((data = buf.readline())!= null) { String[] sa = data.split(" "); if (row < 9) { for (int i=0; i<9; i++) { ban[row][i] = Integer.parseInt(sa[i]); else { for (int i=0; i<9; i++) { ans[row-9][i] = Integer.parseInt(sa[i]); row++; filein.close(); catch(exception e) {}; sethint(); drawcanvas(); ); 33

sethint(); sethint() void sethint() { int[][][] box = new int[9][9][2]; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { int m = j / 3 * 3 + i / 3; int n = j % 3 * 3 + i % 3; box[m][n][0] = j; box[m][n][1] = i; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { for (int n=1; n<=9; n++) { boolean flag = true; for (int k=0; k<9; k++) { if (ans[j][k]==n) { flag = false; break; for (int k=0; k<9; k++) { if (ans[k][i]==n) { flag = false; break; int m = j / 3 * 3 + i / 3; for (int k=0; k<9; k++) { if (ans[box[m][k][0]][box[m][k][1]]==n) { flag = false; break; hint[j][i][n] = flag; 34

void buttonpressed(double x, double y) { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; int i = (int) Math.floor((x - w) / s); int j = (int) Math.floor((y - h) / s); if (i >= 0 && i < 9 && j >= 0 && j < 9) { String str = "123456789"; TextInputDialog dlg = new TextInputDialog(str); str = dlg.showandwait().orelse(""); if (str!= "") { int n = Integer.parseInt(str); if (rb1.isselected()) { ban[j][i] = n; ans[j][i] = n; else { ans[j][i] = n; sethint(); drawcanvas(); sethint(); drawcanvas() gc.setfont(new Font("courier", 12)); gc.settextalign(textalignment.center); gc.setfill(color.black); for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ans[j][i] == 0) { for (int n=1; n<=9; n++) { if (hint[j][i][n]) { int r = (int) ((j+((n-1)/3*2+1.5)/6.0)*s); int l = (int) ((i+((n-1)%3*2+1)/6.0)*s); gc.filltext(string.valueof(n), w+l, h+r); 35

void drawcanvas() { int k = 9; int s = board_size / (k+2); int w = (board_size-s*9)/2; int h = (board_size-s*9)/2; gc = canvas.getgraphicscontext2d(); gc.clearrect(0, 0, board_size, board_size); gc.setstroke(color.blue); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(3); gc.strokeline(w, h+i*s, w+9*s, h+i*s); else { gc.setlinewidth(1); gc.strokeline(w, h+i*s, w+9*s, h+i*s); for (int i=0; i<=9; i++) { if (i % 3 == 0) { gc.setlinewidth(3); gc.strokeline(w+i*s, h, w+i*s, h+9*s); else { gc.setlinewidth(1); gc.strokeline(w+i*s, h, w+i*s, h+9*s); gc.setfont(new Font("courier", 50)); gc.settextalign(textalignment.center); for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ban[j][i] >0) { gc.setfill(color.blue); gc.filltext(string.valueof(ban[j][i]), w+(i+0.5)*s, h+(j+0.9)*s); else if (ans[j][i] > 0) { gc.setfill(color.red); gc.filltext(string.valueof(ans[j][i]), w+(i+0.5)*s, h+(j+0.9)*s); 36

gc.setfont(new Font("courier", 12)); gc.settextalign(textalignment.center); gc.setfill(color.black); for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ans[j][i] == 0) { for (int n=1; n<=9; n++) { if (hint[j][i][n]) { int r = (int) ((j+((n-1)/3*2+1.5)/6.0)*s); int l = (int) ((i+((n-1)%3*2+1)/6.0)*s); gc.filltext(string.valueof(n), w+l, h+r); 37

Sample1 1 9 1 (One-choice: A cell that contains only one candidate value) 1 (5,1) 38

1 (One-choice: A cell that contains only one candidate value) 7 7 1 (One-place: A region(row, column, or block) that has only one cell available for a given number) 39

start(stage pstage) Button b1 = new Button(" 1 "); Button b2 = new Button(" 1 "); HBox hb = new HBox(); hb.getchildren().addall(b1, b2); root.getchildren().addall(bar, canvas, rb1, rb2, hb); 40

b1.setonaction((event) -> { setuniquesell(); ); start(stage pstage) setuniquesell() boolean setuniquesell() { boolean FLAG = false; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ans[j][i] > 0) continue; int count = 0; int index = -1; for (int n=1; n<=9; n++) { if (hint[j][i][n]) { count++; index = n; 41

if (count == 1) { ans[j][i] = index; FLAG = true; sethint(); drawcanvas(); return FLAG; boolean setuniquesell() void setuniquesell() Sample1 1 1 b2.setonaction((event) -> { setsinglecand(); ); 42

start(stage pstage) setsinglecand() boolean setsinglecand() { boolean F = false; int[][][] box = new int[9][9][2]; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { int m = j / 3 * 3 + i / 3; int n = j % 3 * 3 + i % 3; box[m][n][0] = j; box[m][n][1] = i; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ans[j][i] > 0) continue; for (int n=1; n<=9; n++) { if (!hint[j][i][n]) continue; boolean flag = true; for (int k=0; k<9; k++) { if (k == i ans[j][k]>0) continue; if (hint[j][k][n]) { flag = false; break; if (flag) { ans[j][i] = n; F = true; sethint(); drawcanvas(); return F; flag = true; for (int k=0; k<9; k++) { if (k == j ans[k][i]>0) continue; if (hint[k][i][n]) { flag = false; break; if (flag) { ans[j][i] = n; 43

F = true; sethint(); drawcanvas(); return F; int m = j / 3 * 3 + i / 3; int p = j % 3 * 3 + i % 3; flag = true; for (int k=0; k<9; k++) { if (k == p ans[box[m][k][0]][box[m][k][1]]>0) continue; if (hint[box[m][k][0]][box[m][k][1]][n]) { flag = false; break; if (flag) { ans[j][i] = n; F = true; sethint(); drawcanvas(); return F; sethint(); drawcanvas(); return F; Sample1 1 44

Sample2 1 45

Button b3 = new Button(" "); start(stage pstage) hb.getchildren().addall(b1, b2, b3); regularplay() void regularplay() { boolean F= false; do { do { F = setuniquesell(); while (F); F = setsinglecand(); while (F); b3.setonaction((event) -> { regularplay(); drawcanvas(); ); 46

Sample2 Button b4 = new Button(" "); start(stage pstage) hb.getchildren().addall(b1, b2, b3, b4); 47

completep() boolean completep() { for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ans[j][i] == 0) { return false; for (int j=0; j<9; j++) { for (int n=1; n<=9; n++) { boolean flag = false; for (int i=0; i<9; i++) { if (ans[j][i] == n) { flag = true; break; if (!flag) return false; 48

for (int i=0; i<9; i++) { for (int n=1; n<=9; n++) { boolean flag = false; for (int j=0; j<9; j++) { if (ans[j][i] == n) { flag = true; break; if (!flag) return false; int[][][] box = new int[9][9][2]; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { int m = j / 3 * 3 + i / 3; int n = j % 3 * 3 + i % 3; box[m][n][0] = j; box[m][n][1] = i; for (int k=0; k<9; k++) { for (int n=1; n<=9; n++) { boolean flag = false; for (int i=0; i<9; i++) { if (ans[box[k][i][0]][box[k][i][1]] == n) { flag = true; break; if (!flag) return false; return true; losingp() boolean losingp() { sethint(); for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { 49

boolean flag = false; for (int n=1; n<=9; n++) { if (hint[j][i][n]) { flag = true; break; if (!flag) return true; for (int j=0; j<9; j++) { int[] P = {0,0,0,0,0,0,0,0,0,0}; for (int i=0; i<9; i++) { P[ans[j][i]] = P[ans[j][i]]+1; for (int n=1; n<=9; n++) { if (P[n] > 1) return true; for (int i=0; i<9; i++) { int[] P = {0,0,0,0,0,0,0,0,0,0}; for (int j=0; j<9; j++) { P[ans[j][i]] = P[ans[j][i]]+1; for (int n=1; n<=9; n++) { if (P[n] > 1) return true; int[][][] box = new int[9][9][2]; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { int m = j / 3 * 3 + i / 3; int n = j % 3 * 3 + i % 3; box[m][n][0] = j; box[m][n][1] = i; for (int k=0; k<9; k++) { int[] P = {0,0,0,0,0,0,0,0,0,0}; for (int i=0; i<9; i++) { P[ans[box[k][i][0]][box[k][i][1]]] = 50

P[ans[box[k][i][0]][box[k][i][1]]]+1; for (int n=1; n<=9; n++) { if (P[n] > 1) return true; return false; b4.setonaction((event) -> { solver(); drawcanvas(); ); solver() boolean solver() { if (losingp()) { return false; if (completep()) return true; int jj = -1, ii = -1; boolean flag = false; out: for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ans[j][i] == 0) { jj = j; ii = i; flag = true; break out; if (flag) { sethint(); boolean[] S = new boolean[10]; for (int n=1; n<=9; n++) S[n] = hint[jj][ii][n]; for (int n=1; n<=9; n++) { if (S[n]) { 51

ans[jj][ii] = n; if (solver()) return true; ans[jj][ii] = 0; return false; solver() boolean solver() { regularplay(); if (losingp()) { return false; if (completep()) return true; int jj = -1, ii = -1; boolean flag = false; 52

out: for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { if (ans[j][i] == 0) { jj = j; ii = i; flag = true; break out; if (flag) { int[][] tempans = new int[9][9]; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { tempans[j][i] = ans[j][i]; sethint(); boolean[] S = new boolean[10]; for (int n=1; n<=9; n++) S[n] = hint[jj][ii][n]; for (int n=1; n<=9; n++) { if (S[n]) { ans[jj][ii] = n; if (solver()) return true; for (int j=0; j<9; j++) { for (int i=0; i<9; i++) { ans[j][i] = tempans[j][i]; ans[jj][ii] = 0; return false; 53

VC++ Python Java VC++ VC++ JavaFX Java 3 Java Java Python Ruby andoroid Kotlin Python Ruby Java 1 10 30 300 Giulio Zambon Sudoku Programming with C Apress VC++ box[][][] 54