次のページ 前のページ 目次へ

12. 4 番目の例: Hearts

とても古い Hearts というゲームがあります。これは 1980 年代のどこかで Bob Ankeney が UNIX 用に作成し、1992 年に Mike Yang が改訂し、現在は Jonathan Badger がメンテナンスしています。その前身は、Oregon Software の Don Backus が 書いたもっと古い Pascal のプログラムであり、後に Jeff Hemmerling が更 新しています。もともとは複数の人間で遊ぶことを想定したゲームですが、 コンピュータを相手にして一人で遊ぶこともできます。グラフィックスはいい 感じですが、このゲームには凝った機能はありませんし、コンピュータと対戦 してもあまり強くありません。それにもかかわらず、現在においても UNIX マシンや Linux マシンで生き残っているゲームはこの Hearts だけのようです。

古いため、また歴史的な経緯のため、このパッケージを Linux システム上で構築するのは特に 困難です。この作業では長くて複雑なパズルを解く必要があります。忍耐と 決断力の訓練になるでしょう。

作業を始める前には、必ず motif または lesstif ライブラリをインストールしておいてください。

xmkmf

make

client.c: In function `read_card':
client.c:430: `_tty' undeclared (first use in this function)
client.c:430: (Each undeclared identifier is reported only once
client.c:430: for each function it appears in.)
client.c: In function `scan':
client.c:685: `_tty' undeclared (first use in this function)
make: *** [client.o] Error 1

client.c ファイル中の問題を起こした部分を以下に示します:

#ifndef SYSV
        (buf[2] != _tty.sg_erase) && (buf[2] != _tty.sg_kill)) {
 #else
        (buf[2] != CERASE) && (buf[2] != CKILL)) {
#endif

client.c の 30 行目に

#define SYSV
を追加してください。これにより _tty への参照が回避されます。

make

client.c:41: sys/termio.h: No such file or directory
make: *** [client.o] Error 1

インクルードファイル termio.h は Linux システムでは /usr/include ディレクトリにあります。比較的古い UNIX マシンの 場合のような /usr/include/sys ではありません。したがって、 client.c の 41行目を

#include <sys/termio.h>
から
#include <termio.h>
に変更してください。

make

gcc -o hearts -g      -L/usr/X11R6/lib client.o hearts.o select.o connect.o
sockio.o start_dist.o  -lcurses -ltermlib       
/usr/bin/ld: cannot open -ltermlib: No such file or directory
collect2: ld returned 1 exit status
make: *** [hearts] Error 1

最近の Linux ディストリビューションは、時代遅れの termlib データベースではなく terminfoデータベース や termcap データベースを使っています。

したがって Makefile を編集します。

655 行目の

CURSES_LIBRARIES = -lcurses -ltermlib

CURSES_LIBRARIES = -lcurses -ltermcap
に変更します。

make

gcc -o xmhearts -g      -L/usr/X11R6/lib xmclient.o hearts.o select.o
connect.o sockio.o start_dist.o gfx.o  -lXm_s -lXt -lSM -lICE -lXext -lX11
-lPW       
/usr/bin/ld: cannot open -lXm_s: No such file or directory
collect2: ld returned 1 exit status

メインの lesstif ライブラリは libXm_s ではなく libXm です。したがって、Makefile を編集して、

653 行目の

XMLIB = -lXm_s $(XTOOLLIB) $(XLIB) -lPW

XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPW
にします。

make

gcc -o xmhearts -g      -L/usr/X11R6/lib xmclient.o hearts.o select.o
connect.o sockio.o start_dist.o gfx.o  -lXm -lXt -lSM -lICE -lXext -lX11 -lPW       
/usr/bin/ld: cannot open -lPW: No such file or directory
collect2: ld returned 1 exit status
make: *** [xmhearts] Error 1

ここではいつもの容疑者を逮捕しましょう。

PW というライブラリはありません。Makefile を編集して、

653 行目を

XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPW

から

XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPEX5

make

rm -f xmhearts
gcc -o xmhearts -g      -L/usr/X11R6/lib xmclient.o hearts.o select.o
connect.o sockio.o start_dist.o gfx.o  -lXm -lXt -lSM -lICE -lXext -lX11 -lPEX5       

make がやっとうまくいきました(ばんざーい!)。

インストール:

root になって以下を実行します。

[root@localhost hearts]# make install
install -c -s  hearts /usr/X11R6/bin/hearts
install -c -s  xmhearts /usr/X11R6/bin/xmhearts
install -c -s  xawhearts /usr/X11R6/bin/xawhearts
install in . done

実行テスト:

rehash

(tcsh を使っているものとします。)

xmhearts

localhost:~/% xmhearts
Can't invoke distributor!

hearts 付属の README を見ると以下のように書いてあり ます:

     heartsd, hearts_dist, hearts.instr ファイルを local.h で定義され
     ている HEARTSLIB ディレクトリに置き、誰でもアクセスできるようにし
     てください。

local.h には以下のように書いてあります:

/* where the distributor, dealer and instructions live */

#define HEARTSLIB "/usr/local/lib/hearts"

これは「マニュアルをちゃんと読め!」の典型例ですね。

root になって以下の作業を行います。

cd /usr/local/lib

mkdir hearts

cd !$

それから、distributor ファイルをこのディレクトリにコピーしま す。

cp /home/username/hearts/heartsd .

cp /home/username/hearts/hearts_dist .

cp /home/username/hearts/hearts.instr .

もう一度実行テストをしてみましょう。

xmhearts

これは動くことも時々ありますが、大抵の場合は dealer died! と いうメッセージを出して止まってしまうでしょう。

"distributor" と "dealer" はハードウェアのポートを叩きます。したがって、 これらのプログラムが root 権限が必要としていることを疑うべきです。

root になって以下の作業をしてみましょう。

chmod u+s /usr/local/lib/heartsd

chmod u+s /usr/local/lib/hearts_dist

(前にも述べましたが、suid したバイナリはセキュリティホールに なるかもしれないので注意してください。)

xmhearts

これでやっと動くようになりました!

HeartsSunsite から入手できます。


次のページ 前のページ 目次へ