次のページ
前のページ
目次へ
とても古い 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
これでやっと動くようになりました!
Hearts は
Sunsite
から入手できます。
次のページ
前のページ
目次へ
|