Powered by SmartDoc

ソフトウェア概論A/B (2016/09/30)
Ver. 1.0

2016年9月30日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/2016/soft/soft.html
ソフトウェア概論 A/B2016年9月30日 の資料

目次

講義資料

当日の OHP 資料

講義で利用するサンプルプログラム

Download : sample-001.c ( utf8 版 )

sample-001.c
/*
 * 2016/09/30 sample-001.c
 */

/*
 *  curses hello
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-001.exe sample-001.c -lncursesw
 *		実行
 *			sample-001
 */

#include <stdio.h>
#include <ncursesw/ncurses.h>	/* ncursesw を利用する場合 */

/*
 *	curses_hello()
 */

void curses_hello( void ) {

  initscr();	   /* curses の利用開始 */

  move ( 10, 30 );	/* カーソルの移動 ( Y, X の順である事に注意 ) */
  addstr ( "Hello, Curses" );	/* 文字列の表示 */

  getch();		/* 文字の入力を待つ */

  endwin();	   		/* curses の利用終了 */

}

/*
 *	main
 *
 */

int main( int argc, char *argv[] )
{

	curses_hello();

	return 0;
}
sample-001.c の実行結果
$ ./sample-001.exe








                          Hello, Curses








$

Download : sample-002.c ( utf8 版 )

sample-002.c
/*
 * 2016/09/30 sample-002.c
 */

/*
 *  スカッシュゲーム ( Ver 0.01 )
 *		キーボードによって、ラケットを移動する
 *			'h'	左に移動
 *			'l'	右に移動
 *			'q'	終了
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-002.exe sample-002.c -lncursesw
 *		実行
 *			sample-002
 */

#include <stdio.h>
#include <ncursesw/ncurses.h>	/* ncursesw を利用する場合 */

/*
 *	main
 */

int main(int argc, char *argv[]) {
  int racket_x = 35;	/* ラケットの x 座標 */
  int racket_y = 12;	/* ラケットの y 座標 */
  int ch = ' ';		/* キーボードからの入力 */

  initscr();	/* curses を利用開始 */

  noecho();

  while ( ch != 'q' ) {		/* キーボードから 'q' が入るまで繰り返す */

	 move ( racket_y, racket_x );	/* ラケットを書く */
	 addstr ( "********" );

	 ch = getch();	/* 入力を待つ */

	 move ( racket_y, racket_x );	/* ラケットを消す */
	 addstr ( "        " );

	 switch ( ch ) {
	 case 'h':
	 	racket_x = racket_x - 1;
		break;
	 case 'l':
		racket_x = racket_x + 1;
		break;
	 }

  }

  endwin();	/* curses を利用終了 */

  return 0;
}
sample-002.c の実行結果
$ ./sample-002.exe













                                      ********



$ 

Download : sample-003.c ( utf8 版 )

sample-003.c
/*
 * 2016/09/30 sample-003.c
 */

/*
 *  スカッシュゲーム ( Ver 0.02 )
 *		ボールも一緒に移動
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-003.exe sample-003.c -lncursesw
 *		実行
 *			sample-003
 */

#include <stdio.h>
#include <ncursesw/ncurses.h>	/* ncursesw を利用する場合 */

/*
 *	main
 */

int main(int argc, char *argv[]) {
  int racket_x = 35;	/* ラケットの x 座標 */
  int racket_y = 19;	/* ラケットの y 座標 */

  int ball_x = 35;	/* ボールの x 座標 */
  int ball_y = 12;	/* ボールの y 座標 */
  int ball_dx = 0;	/* ボールの x 速度 */
  int ball_dy = 1;	/* ボールの y 速度 */

  int ch = ' ';		/* キーボードからの入力 */

  initscr();	/* curses を利用開始 */

  noecho();

  while ( ch != 'q' ) {		/* キーボードから 'q' が入るまで繰り返す */

	 move ( racket_y, racket_x );	/* ボール書き込む */
	 addstr ( "********" );
	 move ( ball_y, ball_x );	/* ボール書き込む */
	 addch ( '*' );

	 ch = getch();	/* 入力をまつ */

	 move ( racket_y, racket_x );
	 addstr ( "        " );
	 move ( ball_y, ball_x );
	 addch ( ' ' );

	 ball_x = ball_x + ball_dx;
	 ball_y = ball_y + ball_dy;

	 switch ( ch ) {
	 case 'h':
		racket_x = racket_x - 1;
		break;
	 case 'l':
		racket_x = racket_x + 1;
		break;
	 }

  }

  endwin();	/* curses を利用終了 */

  return 0;
}
sample-003.c の実行結果
$ ./sample-003.exe







                              *






                           ********


$ 

Download : sample-004.c ( utf8 版 )

sample-004.c
/*
 * 2016/09/30 sample-004.c
 */

/*
 *  スカッシュゲーム ( Ver 0.03 )
 *		ボールは、キーボードの入力を待たずに勝手に移動
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-004.exe sample-004.c -lncursesw
 *		実行
 *			sample-004
 */

#include <stdio.h>
#include <ncursesw/ncurses.h>	/* ncursesw を利用する場合 */

/*
 *	main
 */

int main(int argc, char *argv[]) {
  int racket_x = 35;	/* ラケットの x 座標 */
  int racket_y = 19;	/* ラケットの y 座標 */

  int ball_x = 35;	/* ボールの x 座標 */
  int ball_y = 12;	/* ボールの y 座標 */
  int ball_dx = 0;	/* ボールの x 速度 */
  int ball_dy = 1;	/* ボールの y 速度 */

  int ch = ' ';		/* キーボードからの入力 */

  initscr();	/* curses を利用開始 */

  noecho();
  timeout(0);	/* キーボードを待つ時間 (0 にしたので待たない) */

  while ( ch != 'q' ) {
	usleep ( 1000000 );	/* ボールの移動の時間 ( 1000000 micro sec = 1sec ) */

	 move ( racket_y, racket_x );	/* ボール書き込む */
	 addstr ( "********" );
	 move ( ball_y, ball_x );	/* ボール書き込む */
	 addch ( '*' );

	 ch = getch();	/* 入力をチェック (入力がなくても次に行く) */

	 move ( racket_y, racket_x );
	 addstr ( "        " );
	 move ( ball_y, ball_x );
	 addch ( ' ' );

	 ball_x = ball_x + ball_dx;
	 ball_y = ball_y + ball_dy;

	 switch ( ch ) {
	 case 'h':
		racket_x = racket_x - 1;
		break;
	 case 'l':
		racket_x = racket_x + 1;
		break;
	 }

  }

  endwin();	/* curses を利用終了 */

  return 0;
}
sample-004.c の実行結果
$ ./sample-003.exe







                              *






                           ********


$ 

Download : sample-005.c ( utf8 版 )

sample-005.c
/*
 * 2016/09/30 sample-005.c
 */

/*
 *  スカッシュゲーム ( Ver 0.04 )
 *		ボールの移動と、キーボードの入力を分離
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-005.exe sample-005.c -lncursesw
 *		実行
 *			sample-005
 */

#include <stdio.h>
#include <ncursesw/ncurses.h>	/* ncursesw を利用する場合 */

/*
 *	main
 */

int main(int argc, char *argv[]) {
  int racket_x = 35;	/* ラケットの x 座標 */
  int racket_y = 19;	/* ラケットの y 座標 */

  int ball_x = 35;	/* ボールの x 座標 */
  int ball_y = 12;	/* ボールの y 座標 */
  int ball_dx = 0;	/* ボールの x 速度 */
  int ball_dy = 1;	/* ボールの y 速度 */

  int ball_count = 0;	/* ボールの待ち時間 */

  int ch = ' ';		/* キーボードからの入力 */

  initscr();	/* curses を利用開始 */

  noecho();
  timeout(0);	/* キーボードを待つ時間 (0 にしたので待たない) */

  /* ボールを書く */

  move ( ball_y, ball_x );
  addch ( '*' );

  /* ラケットを書く */

  move ( racket_y, racket_x );
  addstr ( "********" );

  while ( ch != 'q' ) {
 	usleep ( 10000 );	/* 移動の時間 ( 10000 micro sec = 10 mili sec ) */

	ball_count = ball_count + 1;	/* ボールの待ち時間を増やす */

	if ( ball_count > 100 ) {		/* ボールの待ち時間が 100 を越えた */
		ball_count = 0;				/* カウントをリセット */

		move ( ball_y, ball_x );	/* ボールを消す */
		addch ( ' ' );

		/* ボールを移動 */
		ball_x = ball_x + ball_dx;
		ball_y = ball_y + ball_dy;

		move ( ball_y, ball_x );	/* ボールを書く */
		addch ( '*' );

	}

	ch = getch();	/* 入力をチェック (入力がなくても次に行く) */

	switch ( ch ) {
	case 'h':
		// break;
	case 'l':		/* ch が 'h' か 'l' の時 */

		move ( racket_y, racket_x );	/* ラケットを消す */
		addstr ( "        " );

		if ( ch == 'h' ) {				/* 入力が 'h' なら */
			racket_x = racket_x - 1;	/* 左に移動 */
		} else {						/* そうでなければ ('l' なので) */
			racket_x = racket_x + 1;	/* 右に移動 */
		}

		move ( racket_y, racket_x );	/* ラケットを書く */
		addstr ( "********" );
		break;
	}

  }

  endwin();	/* curses を利用終了 */

  return 0;
}
sample-005.c の実行結果
$ ./sample-003.exe







                              *






                           ********


$ 

Download : sample-006.c ( utf8 版 )

sample-006.c
/*
 * 2016/09/30 sample-006.c
 */

/*
 *  スカッシュゲーム ( Ver 0.05 )
 *		衝突処理
 *			ボールと壁
 *			ボールとラケット
 *
 * 利用方法
 *		コンパイル
 *			cc -I ~/c/include -o sample-006.exe sample-006.c -lncursesw
 *		実行
 *			sample-006
 */

#include <stdio.h>
#include <ncursesw/ncurses.h>	/* ncursesw を利用する場合 */

/*
 *	main
 */

int main(int argc, char *argv[]) {
  int racket_x = 35;	/* ラケットの x 座標 */
  int racket_y = 19;	/* ラケットの y 座標 */

  int ball_x = 35;	/* ボールの x 座標 */
  int ball_y = 12;	/* ボールの y 座標 */
  int ball_dx = 1;	/* ボールの x 速度 */
  int ball_dy = 1;	/* ボールの y 速度 */

  int ball_count = 0;	/* ボールの待ち時間 */

  int ch = ' ';		/* キーボードからの入力 */

  initscr();	/* curses を利用開始 */

  noecho();
  timeout(0);	/* キーボードを待つ時間 (0 にしたので待たない) */

  /* ボールを書く */

  move ( ball_y, ball_x );
  addch ( '*' );

  /* ラケットを書く */

  move ( racket_y, racket_x );
  addstr ( "********" );

  while ( ch != 'q' ) {
 	usleep ( 1000 );	/* 移動の時間 ( 1000 micro sec = 1 mili sec ) */

	ball_count = ball_count + 1;	/* ボールの待ち時間を増やす */

	if ( ball_count > 100 ) {		/* ボールの待ち時間が 100 を越えた */
		ball_count = 0;				/* カウントをリセット */

		move ( ball_y, ball_x );	/* ボールを消す */
		addch ( ' ' );

		/* ボールを移動 */
		ball_x = ball_x + ball_dx;
		ball_y = ball_y + ball_dy;

		move ( ball_y, ball_x );	/* ボールを書く */
		addch ( '*' );

		if ( ball_x < 1 ) {			/* ボールが左端にきた */
			ball_dx = 1;			/* ボールの向きを右向きにする */
		}

		if ( ball_x > 70 ) {		/* ボールが右端にきた */
			ball_dx = -1;			/* ボールの向きを左向きにする */
		}

		if ( ball_y < 1 ) {			/* ボールが上端にきた */
			ball_dy = 1;			/* ボールの向きを下向きにする */
		}

		if ( ball_y > 20 ) {		/* ボールが下端にきた */
			ball_dy = -1;			/* ボールの向きを上向きにする */
		}

		if ( ball_y == racket_y ) {	/* ボールがラケットの高さで */
			if ( racket_x <= ball_x ) {	/* ボールがラケットの左端より右で */
				if ( ball_x <= racket_x + 7 ) {	/* ボールがラケットの右端より左なら */
					/* ラケットとボールが衝突したので.. */
					ball_dy = -1;			/* ボールの向きを上向きにする */
				}
			}
		}
	}

	ch = getch();	/* 入力をチェック (入力がなくても次に行く) */

	switch ( ch ) {
	case 'h':
		// break;
	case 'l':		/* ch が 'h' か 'l' の時 */

		move ( racket_y, racket_x );	/* ラケットを消す */
		addstr ( "        " );

		if ( ch == 'h' ) {				/* 入力が 'h' なら */
		   if ( racket_x > 1 ) {		/* まだ左端でなければ */
		   	  racket_x = racket_x - 1;	/* 左に移動 */
		   }
		} else {						/* そうでなければ ('l' なので) */
		   if ( racket_x + 7 < 70 ) {	/* まだ右端でなければ */
		   	  racket_x = racket_x + 1;	/* 右に移動 */
		   }
		}

		move ( racket_y, racket_x );	/* ラケットを書く */
		addstr ( "********" );
		break;
	}

  }

  endwin();	/* curses を利用終了 */

  return 0;
}
sample-006.c の実行結果
$ ./sample-003.exe







                              *






                           ********


$ 

講議中に作成したプログラム

Links

関連 Link