ゆるゆるプログラミング

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

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

以下は、テキストで市松模様を表現する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:    				"Pattern_Ichimatsu [幅] [高]" );
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:    				"Pattern_Ichimatsu [幅] [高]" );
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)を参照するループをつくり、(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となる判定式であることがわかります。

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

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

■関連コンテンツ

模様の描画 いろいろな模様の描画方法を紹介

■新着情報

2019.06.14 円模様1 円の縦横整列模様の画像作成方法を紹介
2019.05.24 ニュートン法で平方根 その3 ニュートン法で平方根(メソッド化)
2019.05.23 ニュートン法で平方根 その2 ニュートン法で平方根(数値微分)
2019.05.22 ニュートン法 ニュートン法について
2019.05.22 ニュートン法で平方根 ニュートン法で平方根を計算

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

 

 

 

 

 

 

 

Topへ