パソコン活用研究シリコンバレー(C、C++、の活用研究)

もぐらたたき(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用とで、記述の仕方が異なるものがあると
思いますが、「もぐらたたき」で使う程度のものは、両者共通のようです。


TopPage