コンテンツにスキップ

敵の動きを遅くする小技(その1)

将棋やオセロなどのコンピュータ対戦型のゲームで、敵(コンピュータ)が打つ時にちょっと時間をかけるようにする小技を紹介します。

※数字の100は、状況に合わせて適当に変えてください。大きくすると、ゆっくりになります。

1.利用シーン

将棋やオセロなどのゲームを作ってコンピュータ対戦ができるようにした時、プレーヤーが打つとすぐに敵のコンピュータが打ってきてしまい、ちょっと違和感があることがあるでしょう。また、コンピュータがどこに打ったか見逃してしまった、ということがしばしばあるでしょう。しかし小技を使えば、プレーヤーが打ってからコンピューターが打つまでの時間を少し設けることができます。あたかも、コンピューターが少し悩んでから打っているような感じを演出できます。

このテクニックは対戦型ゲームに限らず、コンピュータの動きを遅くしたい様々なシーンで利用できます。

2.小技を使わない場合

下記のプログラムでは、マウスでクリックするとそこに黒丸が描かれ、コンピュータはその右隣に白丸を描きます。小技を使わない場合、黒丸とほぼ同時に白丸が描かれてしまいます。

float px, py;
int turn = 0;
void setup() {
size(600, 400);
background(255);
}
void draw() {
compSet();
}
void mousePressed() {
if (turn == 0) {
fill(0, 0, 0);
px=mouseX;
py=mouseY;
ellipse(px, py, 100, 100);
turn = 1 - turn;
}
}
void compSet() {
if (turn == 1) {
fill(255, 255, 255);
ellipse(px+100, py, 100, 100);
turn = 1 - turn;
}
}

3.小技を使った場合

小技を使えば、コンピュータは少し時間が経ってから白丸を描きます。コンピューターが少し考えているかのような感じになります。

float px,py;
int turn = 0;
void setup() {
size(600, 400);
background(255);
}
void draw() {
compSet();
}
void mousePressed() {
if (turn == 0) {
fill(0, 0, 0);
px=mouseX;
py=mouseY;
ellipse(px,py, 100, 100);
turn = 1 - turn;
}
}
void compSet() {
if (turn == 1) {
if (frameCount % 100 == 0) {
fill(255, 255, 255);
ellipse(px+100, py, 100, 100);
turn = 1 - turn;
}
}
}

※frameCount はProcessingにおけるシステム変数で、プログラムが開始されてからフレーム(画面)が表示されるたびに値が増加していきます。draw関数の中では、ループするたびに1ずつ増えていきます。

※frameCount を使わずに、もっと簡単に敵(コンピュータ)の動きを遅くする方法もあります。( 敵の動きを遅くする小技(その2) )状況に応じて、利用してください。