Download : sample-001.c ( utf8 版 )
/* * 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.exe Hello, Curses $
Download : sample-002.c ( utf8 版 )
/* * 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.exe ******** $
Download : sample-003.c ( utf8 版 )
/* * 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.exe * ******** $
Download : sample-004.c ( utf8 版 )
/* * 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-003.exe * ******** $
Download : sample-005.c ( utf8 版 )
/* * 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-003.exe * ******** $
Download : sample-006.c ( utf8 版 )
/* * 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-003.exe * ******** $
/* * CDATE FILENAME * * キーボードから一文字入力し、その文字によって異る国の挨拶をする */ #include <stdio.h> /* * hello ( char contry ) * char contry : 国を表す一文字 * j : 日本 * e : 英語 * c : 中国 * f : フランス語 * g : ドイツ語 */ void hello ( char cmd ) { switch ( cmd ) { case 'j': /* 'j' の時は、日本語にする */ printf ( "こんにちは\n" ); break; case 'e': /* 'e' の時は、英語にする */ printf ( "Good Afternoon\n" ); break; case 'c': /* 'c' の時は、中国語にする */ printf ( "ニイハオ\n" ); break; case 'f': /* 'f' の時は、フランス語にする */ printf ( "Bonjour\n" ); break; /* ** この部分を完成させなさい */ printf ( "Guten tag\n" ); break; default: /* どれでもなければ.. */ printf ( "???\n" ); break; } } /* * main */ int main( void ) { printf ( "国を表す文字を入力してください\n" ); printf ( "\tj\t日本\n" ); printf ( "\te\t英語\n" ); printf ( "\tc\t中国\n" ); printf ( "\tf\tフランス\n" ); printf ( "\tg\tドイツ\n" ); hello ( getchar() ); /* getchar() で文字を入力し、それに対応する結果を出す */ return 0; }
/* * 課題 CNAME-02 * * 20160923 20160923-02-QQQQ.c * * 0 〜 99 の偶数を出力する * 0, 2, 4, 6, ..., 98 */ #include <stdio.h> /* * for 文を利用して、0 から 99 の偶数の数値 (そのニ) i が 0 〜 99 の間の偶数だけを動くようにし、毎回 i を出す */ int main(int ac, char *av[] ) { int i; /* for 文の制御変数 */ /* 「i++」 は、ほぼ、「i=i+1」 と同じ */ for ( i = 0; i < 100; i = i + 2 ) { /* i++ だと i = 0, 1, 2, .. */ /* 0, 1, 2, 3, ... */ /* ○○とすれば i = 0, 2, 4, .. */ printf ( "%d\n", i ); /* i を出力 */ } return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { int i = 0; /* 「繰り返す条件」が成立(真)の間、「繰り返す命令」を繰り返す */ while ( i < 10 /* 繰り返す条件 */ ) { /* 繰り返す命令 */ printf ( "i=%d\n", i ); i = i + 1; } /* i = 0 ? 9 の間の 10 回 printf を実行する */ /* その時、i の値は 0 ? 9 と毎回変化するので, 表示されるのは、「i=0」、「i=1」、...、「i=9」と表示される */ /* while 文を使う時の注意 1.「繰り返す条件」の部分は、後から、変化してくれないと困る 式の中に、「変数」を含める 2. その「変数」を、「繰り返す命令」の中で、代入を使って、 値を変更し、「いつかは、条件が成立しなくなるようにする」必要がある remark 再帰でも同じような制限があった事を思い出そう 「wihle は、常に再帰に書き直せる」ので、while の注意が、 そのまま、書き換えた再帰に適用される 逆は簡単ではない 一般に、while よりは再帰の方が高機能(表現力が高い) */ return 0; }
#include<stdio.h> int main(int argc, char *argv[] ) { int i; scanf ( "%d", &i ); /* i に、標準入力(普通はキーボード)から 整数値を入力し、その値を、変数 i に 代入する */ printf ( "%d", i ); /* i の値を標準出力(普通は、画面)に、 i の値である整数値を表示する */ /* printf と scanf は、書式指定 (%X) の部分を共有している scanf は printf の入力版 printf ( "i=%d\n", i ); scanf ( "i=%d\n", &i ); */ scanf ( "i=%d\n", &i ); /* この形も可能だが、「利用禁止」する */ /* キーボードから 「i=999[改行]」とすると、i に 999 が入る */ /* じゃあ、いきなり「999」とすると、何がおきるか ? */ /* "i" が見当たらないので、それから先進まなくなる */ /* まんがいち、間違えると、それっきり入力ができなくなる */ /* [安全のために] scanf による変数への値の入力は 1. 一つの変数に関して、一回呼び出す 2. 最初の文字列は、その値を取り出すための書式指定だけにする */ printf ( "i=%d\n", i ); /* %d 整数値 %c 文字 %lf 浮動小数点数 !! ptintf の時は、「%f」で、違う */ return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { int i; i = 0; /* i に初期値代入 */ while ( i < 10 ) { /* i の値をチェックしている */ printf ( "i = %d\n", i ); i = i + 1; /* i の値を更新している */ } /* i=0 i=1 .. i=9 と出力する */ return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { int i; /* i の初期化 i のチェック i の更新 */ for ( i = 0; i < 10; i = i + 1 ) { printf ( "i = %d\n", i ); } /* i=0 i=1 .. i=9 と出力する */ /* for 文は、簡単に while 文に書き換えられる for ( <初期化式>; <継続条件式>; <再初期化式> ) { <繰返し文> } => <初期化式> while ( <継続条件式> ) { <繰返し文> <再初期化式> } 例: for ( i = 0; i < 10; i = i + 1 ) { printf ( "i = %d\n", i ); } => i = 0; while ( i < 10 ) { printf ( "i = %d\n", i ); i = i + 1; } 逆 while (<繰り返し条件>) { <繰り返し文> } => for ( ; <繰り返し条件>; ) { <繰り返し文> } */ return 0; }
#include <stdio.h> /* キーボードから、10 個の整数値を入力して、 その総和を出力するプログラム これは、繰り返しのプログラムになる while/for [再帰] を利用する -> for 文 繰り返し部分は for ( i = 0; i < 10; i = i + 1 ) { -- 10 回繰り返す } となり、全体は 何かをする for ( i = 0; i < 10; i = i + 1 ) { 何かをする } 何かをする 以下の作業を行うための準備 for ( i = 0; i < 10; i = i + 1 ) { 数値を入力する それらを足し合わせる } 結果を出力 int i; int total; int number; --- 利用する変数は、宣言する必要がある total = 0; --- なにも入力されない状態では、「そこまでの合計」は 0 となる for ( i = 0; i < 10; i = i + 1 ) { printf ( "%d 番目の整数値を入力してください : ", i + 1 ); scanf ( "%d", &number ); --- 入力された個々の値は、変数 number に保存する total = total + number; --- これまでの合計が total に入っているして、 --- これに、新しく入力された値を加えることにより、 --- その数を含めた、合計が total に入る } printf ( "10 個の整数の合計は %d です。\n", total ); -- total という変数に、合計が入っていると想定する */ int main(int argc, char *argv[] ) { int i; int total; int number; total = 0; for ( i = 0; i < 10; i = i + 1 ) { printf ( "%d 番目の整数値を入力してください : ", i + 1 ); scanf ( "%d", &number ); total = total + number; /* 蓄積を行う */ } printf ( "10 個の整数の合計は %d です。\n", total ); return 0; }
#include <stdio.h> int main(int argc, char *argv[]) { int trump; printf ( "トランプの数 ( 1 ? 13 ) を入力してください : " ); scanf ( "%d", &trump ); /* トランプの数値が 1 ? 10 場合は、そのまま その代わりに、11 の時は J, 12 には Q, 13 の時には K を 出力したい (それいがいの場合は '?' ) */ /* if でやるとどうなるか ? */ if ( trump == 1 ) { printf ( "1\n" ); } else if ( trump == 2 ) { printf ( "2\n" ); /* 途中省略 3 ? 8 */ } else if ( trump == 9 ) { printf ( "9\n" ); } else if ( trump == 10 ) { printf ( "10\n" ); } else if ( trump == 11 ) { printf ( "J\n" ); } else if ( trump == 12 ) { printf ( "Q\n" ); } else if ( trump == 13 ) { printf ( "K\n" ); } else { printf ( "?\n" ); } return 0; }
#include <stdio.h> int main(int argc, char *argv[]) { int trump; printf ( "トランプの数 ( 1 ? 13 ) を入力してください : " ); scanf ( "%d", &trump ); /* トランプの数値が 1 ? 10 場合は、そのまま その代わりに、11 の時は J, 12 には Q, 13 の時には K を 出力したい (それいがいの場合は '?' ) */ /* switch でやるとどうなるか ? */ switch ( trump ) { case 1: /* trump == 1 の時 */ printf ( "1\n" ); break; /* ここまでをやる */ case 2: printf ( "2\n" ); break; /* 途中省略 3 ? 8 */ case 9: printf ( "9\n" ); printf ( "9\n" ); printf ( "9\n" ); printf ( "9\n" ); printf ( "9\n" ); printf ( "9\n" ); break; case 10: printf ( "10\n" ); break; case 11: printf ( "J\n" ); break; case 12: printf ( "Q\n" ); break; case 13: printf ( "K\n" ); break; default: /* どれにも合わない時は default へ */ printf ( "?\n" ); break; /* default がなければ、何もしない */ } return 0; }
#include <stdio.h> int main(int argc, char *argv[]) { int trump; printf ( "トランプの数 ( 1 ? 13 ) を入力してください : " ); scanf ( "%d", &trump ); /* トランプの数値が 1 ? 10 場合は、そのまま その代わりに、11 の時は J, 12 には Q, 13 の時には K を 出力したい (それいがいの場合は '?' ) */ /* switch でやるとどうなるか ? */ switch ( trump ) { case 1: /* trump == 1 の時 */ printf ( "A\n" ); break; /* break 文があると、switch から抜け(break)する */ case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: printf ( "%d\n", trump ); /* 途中に break がないので、 trump が 2 ? 10 の場合は、 いずれも、ココに来る */ break; case 11: printf ( "J\n" ); break; case 12: printf ( "Q\n" ); break; case 13: printf ( "K\n" ); break; default: /* どれにも合わない時は default へ */ printf ( "?\n" ); break; /* default がなければ、何もしない */ } return 0; }
#include <stdio.h> #include <ncursesw/ncurses.h> /* ncursesw を利用する場合 */ /* 画面の真ん中に、'*' を使って、「田」という字かいてみる ********* * * * * * * ********* * * * * * * ********* */ int main(int arg, char *argv[] ) { initscr(); /* curses の利用開始 */ /* やりたい事をかく */ move ( 4, 30 ); /* カーソルの移動 ( Y, X の順である事に注意 ) */ addstr ( "*********" ); move ( 5, 30 ); /* カーソルの移動 ( Y, X の順である事に注意 ) */ addstr ( "* * *" ); move ( 6, 30 ); /* カーソルの移動 ( Y, X の順である事に注意 ) */ addstr ( "* * *" ); move ( 7, 30 ); /* カーソルの移動 ( Y, X の順である事に注意 ) */ addstr ( "*********" ); move ( 8, 30 ); /* カーソルの移動 ( Y, X の順である事に注意 ) */ addstr ( "* * *" ); move ( 9, 30 ); /* カーソルの移動 ( Y, X の順である事に注意 ) */ addstr ( "* * *" ); move ( 10, 30 ); /* カーソルの移動 ( Y, X の順である事に注意 ) */ addstr ( "*********" ); getch(); /* 文字の入力を待つ */ endwin(); /* curses の利用終了 */ return 0; }
/* * 2016/09/30 sample-001.c */ /* * curses hello * * 利用方法 * コンパイル * cc -Ic:\usr\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" ); /* 文字列の表示 */ move ( 13, 40 ); /* カーソルの移動 ( Y, X の順である事に注意 ) */ addstr ( "Jump" ); /* 文字列の表示 */ move ( 6, 60 ); /* カーソルの移動 ( Y, X の順である事に注意 ) */ addstr ( "Back" ); /* 文字列の表示 */ getch(); /* 文字の入力を待つ */ endwin(); /* curses の利用終了 */ } /* * main * */ int main( int argc, char *argv[] ) { curses_hello(); return 0; }
/* * 2016/09/30 sample-002.c */ /* * スカッシュゲーム ( Ver 0.01 ) * キーボードによって、ラケットを移動する * 'h' 左に移動 * 'l' 右に移動 * 'q' 終了 * * 利用方法 * コンパイル * cc -Ic:\usr\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; }
/* * 2016/09/30 sample-003.c */ /* * スカッシュゲーム ( Ver 0.02 ) * ボールも一緒に移動 * * 利用方法 * コンパイル * cc -Ic:\usr\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; }
/* * 2016/09/30 sample-004.c */ /* * スカッシュゲーム ( Ver 0.03 ) * ボールは、キーボードの入力を待たずに勝手に移動 * * 利用方法 * コンパイル * cc -Ic:\usr\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; }
/* * 2016/09/30 sample-005.c */ /* * スカッシュゲーム ( Ver 0.04 ) * ボールの移動と、キーボードの入力を分離 * * 利用方法 * コンパイル * cc -Ic:\usr\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; }
/* * 2016/09/30 sample-006.c */ /* * スカッシュゲーム ( Ver 0.05 ) * 衝突処理 * ボールと壁 * ボールとラケット * * 利用方法 * コンパイル * cc -Ic:\usr\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; }