Javaプログラミング学習サイト ゆるゆるプログラミング

2019/03/18 公開

・市松模様(テキスト版)

テキストで市松模様を表現する方法を紹介します。ここで紹介するプログラムで出力するテキストの表示は、黒色は'●'、白色は'○'で表現します。

以下は、テキストで市松模様を表現するJavaソースコードで、横の文字数(列数)と、縦の文字数(行数)を指定して模様を表示します。

TextPattern_Ichimatsu1.java ← クリックしてダウンロードページに移動
001:    public class TextPattern_Ichimatsu1 {
002:    	public static void main( String[] args ) {
003:    		// 変数宣言
004:    		int w, h;	// サイズ
005:    
006:    		// 入力した引数が2以上かを調べる
007:    		if ( 2 > args.length ) {
008:    			// 入力した引数が2未満の場合、使用方法を表示する
009:    			System.out.println( 
010:    				"TextPattern_Ichimatsu1 [幅] [高]" );
011:    			return;
012:    		}
013:    
014:    		try {
015:    			// 引数を変換し、画像の幅と高さをwとhに代入
016:    			w =  Integer.valueOf( args[ 0 ] );
017:    			h =  Integer.valueOf( args[ 1 ] );
018:    		}
019:    		catch( NumberFormatException ne )
020:    		{
021:    			System.out.println( "引数が不正です" );
022:    			return;
023:    		}
024:    
025:    		// 市松模様テキストの作成
026:    		for ( int y = 0; y < h; ++ y ) {
027:    			for ( int x = 0; x < w; ++ x ) {
028:    				// 黒か白かを判定
029:    				if ( 0 == ( ( x + y ) % 2 ) )
030:    					System.out.print( "●" );
031:    				else
032:    					System.out.print( "○" );
033:    			}
034:    			// 改行
035:    			System.out.println();
036:    		}
037:    	}
038:    }

TextPattern_Ichimatsu1の実行例

java TextPattern_Ichimatsu1 20 10

出力結果

●○●○●○●○●○●○●○●○●○●○
○●○●○●○●○●○●○●○●○●○●
●○●○●○●○●○●○●○●○●○●○
○●○●○●○●○●○●○●○●○●○●
●○●○●○●○●○●○●○●○●○●○
○●○●○●○●○●○●○●○●○●○●
●○●○●○●○●○●○●○●○●○●○
○●○●○●○●○●○●○●○●○●○●
●○●○●○●○●○●○●○●○●○●○
○●○●○●○●○●○●○●○●○●○●

ここからは、このJavaソースコードを上から順番に解説していきます。

001:    public class TextPattern_Ichimatsu1 {

クラス名を、TextPattern_Ichimatsu1としています。

002:    	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

003:    		// 変数宣言
004:    		int w, h;	// サイズ

このプログラムで使う変数を宣言しています。

006:    		// 入力した引数が2以上かを調べる
007:    		if ( 2 > args.length ) {
008:    			// 入力した引数が2未満の場合、使用方法を表示する
009:    			System.out.println( 
010:    				"TextPattern_Ichimatsu1 [幅] [高]" );
011:    			return;
012:    		}

2つ以上の引数が与えられたかをチェックし、2つ未満の場合に、使い方のメッセージを表示し、returnによってmainメソッドを抜けています。

014:    		try {
015:    			// 引数を変換し、画像の幅と高さをwとhに代入
016:    			w =  Integer.valueOf( args[ 0 ] );
017:    			h =  Integer.valueOf( args[ 1 ] );
018:    		}
019:    		catch( NumberFormatException ne )
020:    		{
021:    			System.out.println( "引数が不正です" );
022:    			return;
023:    		}

与えられた引数をそれぞれ、作成する幅(横方向のの文字数)/高さ(縦方向のの文字数)を格納する変数に代入しています。引数はString型なので、Integerクラスを使ってint型に変換しています。

025:    		// 市松模様テキストの作成
026:    		for ( int y = 0; y < h; ++ y ) {
027:    			for ( int x = 0; x < w; ++ x ) {
028:    				// 黒か白かを判定
029:    				if ( 0 == ( ( x + y ) % 2 ) )
030:    					System.out.print( "●" );
031:    				else
032:    					System.out.print( "○" );
033:    			}
034:    			// 改行
035:    			System.out.println();
036:    		}

テキストの座標(x,y)を参照する2重ループをつくり、(x,y)から黒色か白色かを判定します。判定で確定した色に対応した文字を改行しないで表示します(System.out.printを使用)。そして、変数xのfor文を抜けた後にSystem.out.println()改行しています。

次に、黒色か白色かを判定する方法について説明します。

1行の中で、黒と白は交互に表れるので変数xを2で割った余りが0の時に黒('●')、1の時に白('○')とすれば、以下のように黒と白が交互に表示されます。

●○●○●○●○●○●○●○●○●○●○

ただし、この処理だけでは変数yの値に関係なく、同じ模様を表示するので縦縞模様になってしまいます。

●○●○●○●○●○●○●○●○●○●○
●○●○●○●○●○●○●○●○●○●○
●○●○●○●○●○●○●○●○●○●○
●○●○●○●○●○●○●○●○●○●○
●○●○●○●○●○●○●○●○●○●○

奇数行(y=0,2,4,6,...)は黒から始まり、偶数行(y=1,3,5,7,...)は白から始まるようにするためにはどうすればよいでしょうか?(変数yは0から始まるので、y=0が1行目となり奇数行となります)

(x+y)を2で割った余りが0の時に黒('●')、1の時に白('○')とすれば行の始めの色を黒白交互にすることができます。理由は以下の通りです。

変数xのfor文の中では、変数yは同じ値です。さらに、変数yはfor文で1つずつ値が増えているので交互に偶数奇数の値になります。

よって、判定式(0==(x+y)%2)は、1行ごとに(0==(x+偶数)%2)と(0==(x+奇数)%2)になります。例えば、y=0(1行目)のときの判定式は(0==(x+0)%2)、y=1(2行目)のときの判定式は(0==(x+1)%2)、y=2(3行目)のときの判定式は(0==(x+2)%2)と、y=3(4行目)のときの判定式は(0==(x+3)%2)になります。

さらにx=0のとき判定式は(0==(0+0)%2)、y=1(2行目)のときの判定式は(0==(0+1)%2)、y=2(3行目)のときの判定式は(0==(0+2)%2)と、y=3(4行目)のときの判定式は(0==(0+3)%2)なり、x=0でy=0,2の時はtrue、y=1,3の時はfalseとなる判定式であることがわかります。

この判定式により開始色が交互に変えられるので市松模様を作成することができます。以下が表示される市松模様の例です。

●○●○●○●○●○●○●○●○●○●○
○●○●○●○●○●○●○●○●○●○●
●○●○●○●○●○●○●○●○●○●○
○●○●○●○●○●○●○●○●○●○●
●○●○●○●○●○●○●○●○●○●○

以上です。

■関連コンテンツ

模様の描画 いろいろな模様の描画方法を紹介
値のコンソール表示 print()、println()とは?
円を描く(テキスト版) テキストを円を描く
市松模様の画像作成方法を紹介-画像

市松模様

白と黒の市松模様画像を作成する方法を解説しています。

繰り返し処理に使用するfor文について解説-画像

for文

繰り返し処理に使用するfor文をJavaのソースコードを使って説明しています。

剰余(余り)を計算した結果を表示するプログラムについて解説-画像

剰余(余り)計算

剰余(余り)をを計算するプログラムの紹介と、その結果を表示する方法を解説

三角形を描く(テキスト版) その1-画像

三角形を描く(テキスト版) その1

for文を使ってテキストの直角三角形を表現する方法を解説しています。底辺が下になる直角三角形です。

■新着情報

2021.08.04 書式指定でコンソール出力 printf()とは?

■広告

 

 

 

 

 

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2021/6/18 14:32時点)
感想(6件)

 

 

 

Topへ