もぐらたたき(TurboC用への変更)
ShortProgram(もぐらたたき)では、コンパイラとしてはLSIC 用のソースを掲載しましたが
ここでは、TurboC用のソース(PC/AT,PC-98用)への変更点を、あげておきます。
コンパイラ、機種間でのコンバート時の参考にして下さい。(たいした変更点はありませんが)
このページで解説している関数
gotoxy, textcolor, window, delay, randomize
1 LSIC −−>TurboC(for PC/AT)
compiled By LSIC DOS/V、PC-98両用 | compiled by TurboC(for PC/AT) PC/AT用 |
/*アルファベット(A−Z)モグラたたき ver 0.01−− coded by Tsuyoshi Kasai for LSIC*/ #include <stdio.h> #include <stdlib.h> #include <time.h> #define timelimit 40 #define num 20 void locate (int,int); void init(); void appear(int); void color(int); char m[num][2]; int st[num],count; main(){ int i,j,k,t,wait; time_t start,interval; for (i=1; i<=num; i++){ /*変数初期化*/ st[i]=0;m[i][1]='\n';} init(); printf("\n****アルファベットもぐらたたき ver 0.01*****\n coded by Tsuyoshi Kasai for LSIC-86"); printf("\nらんだむに表示するアルファベットのもぐら (A−Z)と同じキーを押して下さい\n"); printf("時間がたつともぐらは反転文字になります。 この反転文字もぐらは無敵になります\n"); printf("キーは大文字にして下さい 制限時間 %d" ,timelimit); printf("\nマシンウェイト(1000−3000が標準) "); scanf("%d",&wait); time(&start); for (;;){ for (i=1; i<=num; i++){ if (st[i]==0) {appear(i);continue;} st[i]++; if (st[i]==10) {color(7); locate(i*2,10);putch(m[i][0]); color(0); continue;} if (st[i]==20) {locate(i*2,10);putch(' '); st[i]=0;} } while(kbhit()) {int c; int n; c=getch(); for (n=1;n<=num;n++){ if (c==m[n][0] && st[n]<10 && st[n]>0) { count++; locate(1,9);printf("COUNT : %d",count); locate(n*2,10);putch('*'); putch('\x07'); st[n]=17;} }} for (j=0;j<8000;j++){for (k=0;k<wait;k++);} time(&interval); t=(unsigned int)difftime(interval,start); locate(1,8);printf("残り時間 : %3d",timelimit-t); if (t>=timelimit) break;} locate(1,12);printf("THE END!!\n"); printf("\x01b[>5l"); } void init() /*初期化*/ {long nowt; long t; /* window(1,1,80,24); */ printf("\x01b[2J"); /*画面クリア*/ printf("\x01b[>5h"); t= time(&nowt); srand(nowt%3600); } void locate (tx,ty) int tx,ty; { printf("\x1b[%d;%dH" ,ty,tx); } void color(col) int col; {printf("\x01b[%dm",col);} void appear(n) int n; {int r,d; d=32767/26; if (rand()<2000) { r=rand()/d; m[n][0]=r+65; st[n]=1; locate(n*2,10);putch(m[n][0]);}} |
/*アルファベット(A−Z)モグラたたき ver 0.01−− coded by Tsuyoshi Kasai for TC2(for Dos/V) */ /*USモードで使用*/ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <dos.h> #define timelimit 40 #define num 20 /*void locate (int,int); */ void init(); void appear(int); /*void color(int); */ char m[num][2]; int st[num],count=0; main(){ int i,j,k,t; time_t start,interval; for (i=1; i<=num; i++){ /*変数初期化*/ st[i]=0;m[i][1]='\n';} init(); printf("\n******BEATING Alphabet MOGRA ver 0.01******* \ncoded by Tsuyoshi Kasai for TC2(Dos/V)"); printf("\nHit the same key (Big character[A-Z]) as is displayed.\n"); printf("In a short time the character turn red character,which is unequaled. \n"); printf("Key Big Character Time limit %d", timelimit); time(&start); for (;;){ for (i=1; i<=num; i++){ if (st[i]==0) {appear(i);continue;} st[i]++; if (st[i]==10) {textcolor(4); gotoxy(i*2,10);putch(m[i][0]); textcolor(7); continue;} if (st[i]==20) {gotoxy(i*2,10);putch(' '); st[i]=0;} } while(kbhit()) {int c; int n; c=getch(); for (n=1;n<=num;n++){ if (c==m[n][0] && st[n]<10 && st[n]>0) { count++; gotoxy(1,9);printf("COUNT : %d",count); gotoxy(n*2,10);putch('*'); putch('\x07'); st[n]=17;} }} delay(3000); time(&interval); t=(unsigned int)difftime(interval,start); gotoxy(1,8);printf("Time Left : %3d",timelimit-t); if (t>=timelimit) break;} gotoxy(1,12);printf("THE END!!\n"); printf("\x1b[>5l");printf("ok"); } void init() /*初期化*/ {long nowt; long t; window(1,1,80,24); printf("\x1b[2J"); /*画面クリア*/ printf("\x1b[>5h"); t= time(&nowt); randomize(); } /* void locate (tx,ty) int tx,ty; { printf("\x1b[%d;%dH" ,ty,tx); } */ /*void color(col) int col; {printf("\x1b[%dm",col);} */ void appear(n) int n; {int r,d; d=32767/26; if (rand()<2000) { r=rand()/d; m[n][0]=r+65; st[n]=1; gotoxy(n*2,10);putch(m[n][0]);}} |
【変更点について】
(1) テキスト表示関連
TurboCでは、テキストビデオ関数が豊富に用意されているので、テキストの表示位置、テキスト文字色の
変更が、TurboCの用意した関数でできます。
テキスト表示位置は、LSICでは、Locate( )関数を自作して、そこでエスケープシーケンスを利用して
カーソル位置の設定をしていましたが、TurboCでは、gotoxy( )が用意されています。
#include <conio.h>
void gotoxy(int x, int y) カーソル位置を(x、y)に動かす
テキスト文字色の設定も、LSICでは、color( )関数を自作して、これもエスケープシーケンスを利用して
いましたが、TurboCでは、textcolor( )が用意されています。
#include <conio.h>
void textcolor(int color)
また、TurboCでは window( )が利用できます。
#include <conio.h>
int window(int left, int top, int right, int bottom)
テキストウィンドウを設定
(2) プログラムにウェイトをかける
LSICでは、無駄な for( ) ループでウェイトをかけていましたが、TurboCでは、delay(
) が使えます。
for ( )ループでは、マシンのスペックにより、ウェイトの時間が違ってくるので、delay(
)を使うのがいい
でしょう。
#include <dos.h>
void delay (unsigned millisecond)
指定したミリセカンド分プログラムを停止する。
プログラムに一定のウェイトをかけるには、BIOSのディレイルーチンをコールするという手もあります。
これについては別の機会に書きたいとおもいます。
(3) 乱数初期化
LSICでは乱数の系列の初期化は srand( )で、シードを与えてやりますが、TurboCでは
randomize() になります。シードは不要です。
(4) 補足
TurboC(for PC/AT)でコンパイルしたものは、当然ながらPC/AT互換機(DOS/V)でないと正常に
実行されません。また日本語モードでは正しく表示されませんので、USモードで実行して下さい。
2 TurboC(PC-98)への変更について
上記のTurboC(PC/AT)用のソースは、TurboC(PC-98)でもそのままコンパイルできます。
ただし、上記コードはprintf 関数の中の表示文字を全て英文字にしてあります。(日本語表示不可のため)
TurboC(PC-98)でコンパイルするのなら、日本語が使用可ですから、printf の中を日本語に変更
したらよいでしょう。
おそらく、表示関係の関数は、TurboCのPC/AT用とPC-98用とで、記述の仕方が異なるものがあると
思いますが、「もぐらたたき」で使う程度のものは、両者共通のようです。