特攻隊

RPGツクール、パズル、プログラミング等々。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
プログラミングに興味がない人を疎外する記事で申し訳ないですが、
Cで「キャロル先生の料理パズル」を再現してみました。
料理ではないので、タイトルは「スタンプパズル」。
全5ステージ収録。(全てDS版に収録されている面です)
例によってDOSで動かすタイプなので、Cコンパイラを持っていない人は遊べません。。



操作方法

 w
a d :十字キーに相当(キーボード左側の方)
 z

l:スタンプ選択、スタンプ使用
p:ゲーム終了
スペースキー:ステージ初期化



オブジェが消えていくプロセスが見れない、ステージクリアするとゲームが強制終了等、
色々ひどい点がありますが、その辺は笑って許してあげてね!
DS版と違いレスポンスが速いので、サクサクできるのが長所。

↓以下、ソースコード(諸事情によりスペースがないので、少し見にくいです。)




#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

int field[5][5]; /* 5×5フィールドのオブジェ。0:「・」(オブジェなし) 1:「●」 2:「■」 3:「▲」*/
int stamp[2][2][2]; /* 2×2スタンプのオブジェ */
int showfield[9][6]; /* ゲーム画面描画用 */
int stage; /* 1~5まで */
int x, y; /* カーソルの座標 */
int firststamp, secondstamp; /* 0:スタンプ未選択 1:スタンプ選択中*/
int verticalline, horizontalline; /* 残りの列数 (0 ~ 5)*/
int gameover; /* ゲーム終了ならば1 */

/* 関数プロトタイプ宣言 */
void choosestage(void);
void stageinitialize(void);
void createfield(void);
void pushbutton(void);
int movecursor(int, int);
int choosestamp(void);
int usestamp(void);
int linecheck(void);

int main(void) {
choosestage();
while(!gameover) {
if(kbhit()) {
pushbutton();
}
}
return 0;
}

void choosestage(void) {

int checkkey = 0;

system("cls");
while(!checkkey) {
printf("挑戦するステージを入力して下さい(1~5):");
scanf("%d", &stage);
if((stage < 1) || (5 < stage)) {
printf("入力エラー:1~5の半角数字を入力して下さい\n");
}
else {
checkkey = 1;
}
}
stageinitialize();
}

void stageinitialize(void) {
x = 0;
y = 1;
verticalline = horizontalline = 5;
firststamp = secondstamp = 0;
switch(stage) {
case 1:
field[0][0] = 1;
field[1][0] = 2;
field[2][0] = 2;
field[3][0] = 1;
field[4][0] = 1;
field[0][1] = 2;
field[1][1] = 1;
field[2][1] = 1;
field[3][1] = 2;
field[4][1] = 2;
field[0][2] = 3;
field[1][2] = 1;
field[2][2] = 1;
field[3][2] = 3;
field[4][2] = 3;
field[0][3] = 2;
field[1][3] = 1;
field[2][3] = 1;
field[3][3] = 2;
field[4][3] = 2;
field[0][4] = 3;
field[1][4] = 1;
field[2][4] = 1;
field[3][4] = 3;
field[4][4] = 3;
stamp[0][0][0] = 2;
stamp[0][1][0] = 2;
stamp[0][0][1] = 3;
stamp[0][1][1] = 3;
stamp[1][0][0] = 2;
stamp[1][1][0] = 2;
stamp[1][0][1] = 3;
stamp[1][1][1] = 3;
break;
case 2:
field[0][0] = 2;
field[1][0] = 2;
field[2][0] = 2;
field[3][0] = 3;
field[4][0] = 3;
field[0][1] = 3;
field[1][1] = 3;
field[2][1] = 1;
field[3][1] = 1;
field[4][1] = 1;
field[0][2] = 1;
field[1][2] = 1;
field[2][2] = 3;
field[3][2] = 2;
field[4][2] = 1;
field[0][3] = 2;
field[1][3] = 2;
field[2][3] = 3;
field[3][3] = 2;
field[4][3] = 1;
field[0][4] = 3;
field[1][4] = 1;
field[2][4] = 3;
field[3][4] = 2;
field[4][4] = 1;
stamp[0][0][0] = 2;
stamp[0][1][0] = 2;
stamp[0][0][1] = 3;
stamp[0][1][1] = 1;
stamp[1][0][0] = 3;
stamp[1][1][0] = 1;
stamp[1][0][1] = 1;
stamp[1][1][1] = 2;
break;
case 3:
field[0][0] = 1;
field[1][0] = 3;
field[2][0] = 2;
field[3][0] = 1;
field[4][0] = 1;
field[0][1] = 2;
field[1][1] = 3;
field[2][1] = 2;
field[3][1] = 3;
field[4][1] = 2;
field[0][2] = 3;
field[1][2] = 3;
field[2][2] = 2;
field[3][2] = 3;
field[4][2] = 3;
field[0][3] = 2;
field[1][3] = 2;
field[2][3] = 1;
field[3][3] = 2;
field[4][3] = 1;
field[0][4] = 1;
field[1][4] = 2;
field[2][4] = 1;
field[3][4] = 2;
field[4][4] = 1;
stamp[0][0][0] = 1;
stamp[0][1][0] = 3;
stamp[0][0][1] = 1;
stamp[0][1][1] = 2;
stamp[1][0][0] = 2;
stamp[1][1][0] = 2;
stamp[1][0][1] = 3;
stamp[1][1][1] = 1;
break;
case 4:
field[0][0] = 2;
field[1][0] = 1;
field[2][0] = 1;
field[3][0] = 3;
field[4][0] = 1;
field[0][1] = 2;
field[1][1] = 1;
field[2][1] = 2;
field[3][1] = 3;
field[4][1] = 1;
field[0][2] = 3;
field[1][2] = 3;
field[2][2] = 3;
field[3][2] = 1;
field[4][2] = 3;
field[0][3] = 3;
field[1][3] = 1;
field[2][3] = 1;
field[3][3] = 1;
field[4][3] = 1;
field[0][4] = 2;
field[1][4] = 2;
field[2][4] = 2;
field[3][4] = 1;
field[4][4] = 2;
stamp[0][0][0] = 3;
stamp[0][1][0] = 1;
stamp[0][0][1] = 2;
stamp[0][1][1] = 3;
stamp[1][0][0] = 3;
stamp[1][1][0] = 1;
stamp[1][0][1] = 2;
stamp[1][1][1] = 1;
break;
case 5:
field[0][0] = 3;
field[1][0] = 1;
field[2][0] = 1;
field[3][0] = 1;
field[4][0] = 3;
field[0][1] = 1;
field[1][1] = 1;
field[2][1] = 2;
field[3][1] = 1;
field[4][1] = 1;
field[0][2] = 2;
field[1][2] = 3;
field[2][2] = 3;
field[3][2] = 2;
field[4][2] = 3;
field[0][3] = 1;
field[1][3] = 1;
field[2][3] = 2;
field[3][3] = 1;
field[4][3] = 1;
field[0][4] = 3;
field[1][4] = 1;
field[2][4] = 1;
field[3][4] = 1;
field[4][4] = 3;
stamp[0][0][0] = 1;
stamp[0][1][0] = 2;
stamp[0][0][1] = 1;
stamp[0][1][1] = 1;
stamp[1][0][0] = 1;
stamp[1][1][0] = 1;
stamp[1][0][1] = 1;
stamp[1][1][1] = 3;
}
createfield();
}

void createfield(void) {

int i, j;

system("cls");
for(i = 0; i < 9; i++) {
for(j = 0; j < 6; j++) {
showfield[i][j] = -1;
}
}
if(firststamp) {
showfield[0][0] = 4;
}
if(secondstamp) {
showfield[0][3] = 4;
}
if(y) {
switch(y) {
case 1:
showfield[4][0] = showfield[5][0] = 5;
break;
case 2:
showfield[5][0] = showfield[6][0] = 5;
break;
case 3:
showfield[6][0] = showfield[7][0] = 5;
break;
case 4:
showfield[7][0] = showfield[8][0] = 5;
}
switch(x) {
case 0:
showfield[3][1] = showfield[3][2] = 5;
break;
case 1:
showfield[3][2] = showfield[3][3] = 5;
break;
case 2:
showfield[3][3] = showfield[3][4] = 5;
break;
case 3:
showfield[3][4] = showfield[3][5] = 5;
}
}
else {
if(!x) {
showfield[0][1] = showfield[0][2] = showfield[1][0] = showfield[2][0] = 5;
}
else {
showfield[0][4] = showfield[0][5] = showfield[1][3] = showfield[2][3] = 5;
}
}
for(i = 0; i < 2; i++) {
for(j = 0; j < 2; j++) {
showfield[i+1][j+1] = stamp[0][i][j];
showfield[i+1][j+4] = stamp[1][i][j];
}
}
for(i = 0; i < 5; i++) {
for(j = 0; j < 5; j++) {
showfield[i+4][j+1] = field[i][j];
}
}
for(i = 0; i < 9; i++) {
for(j = 0; j < 6; j++) {
switch(showfield[i][j]) {
case -1:
printf(" ");
break;
case 0:
printf("・");
break;
case 1:
printf("●");
break;
case 2:
printf("■");
break;
case 3:
printf("▲");
break;
case 4:
printf("☆");
break;
case 5:
printf("◇");
}
}
printf("\n");
}
}

void pushbutton(void) {

switch(getch()) {
case 'a':
if (!((x == 3) && (y == 0))) {
movecursor(x-1, y);
}
else {
movecursor(x-3, y);
}
break;
case 'w':
movecursor(x, y-1);
break;
case 'd':
if (!((x == 0) && (y == 0))) {
movecursor(x+1, y);
}
else {
movecursor(x+3, y);
}
break;
case 'z':
movecursor(x, y+1);
break;
case 'l':
if ((!firststamp) && (!secondstamp)) {
choosestamp();
}
else {
usestamp();
}
break;
case ' ':
stageinitialize();
break;
case 'p':
gameover = 1;
}
}

int movecursor(int p, int q) {
if ((p<0) || (3<p) || (q<0) || (4<q)) {
return 0;
}
else {
x = p;
y = q;
createfield();
}
if ((y == 0) && (x == 1)) {
x = 0;
y = 0;
}
if ((y == 0) && (x == 2)) {
x = 3;
y = 0;
}
createfield();
return 1;
}


int choosestamp(void) {
if (y) {
return 0;
}
else if (!x) {
if (stamp[0][0][0]) {
firststamp = 1;
}
else {
return 0;
}
}
else {
if (stamp[1][0][0]) {
secondstamp = 1;
}
else {
return 0;
}
}
createfield();
return 1;
}

int usestamp(void) {

int i, j;

if(!y) {
firststamp = secondstamp = 0;
createfield();
return 0;
}
else if((x > verticalline - 2) || (y < 5 - horizontalline)) {
return 0;
}
else if (firststamp == 1) {
for(i = 0; i < 2; i++) {
for(j = 0; j < 2; j++) {
field[i+y-1][j+x] = stamp[0][i][j];
stamp[0][i][j] = 0;
}
}
}
else {
for(i = 0; i < 2; i++) {
for(j = 0; j < 2; j++) {
field[i+y-1][j+x] = stamp [1][i][j];
stamp[1][i][j] = 0;
}
}
}
firststamp = secondstamp = 0;
for (i = 0; i < 9; i++) {
linecheck();
}
createfield();
if(!(verticalline) || !(horizontalline)) {
printf("Congratulations!");
gameover = 1;
}
return 1;
}

int linecheck(void) {

int i, j, k, l;
int c1, s1, t1; /* 同じタテ列中の●、■、▲の個数 */
int c2, s2, t2;/* 同じヨコ列中の●、■、▲の個数 */

c1 = s1 = t1 = c2 = s2 = t2 = 0;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
if (field[i][j] == 1) {
c2++;
}
else if (field[i][j] == 2) {
s2++;
}
else if (field[i][j] == 3) {
t2++;
}
if (field[j][i] == 1) {
c1++;
}
else if (field[j][i] == 2) {
s1++;
}
else if (field[j][i] == 3) {
t1++;
}
if ((c1 >= verticalline) || (s1 >= verticalline) || (t1 >= verticalline)) {
for (k = i; k < 5; k++) {
for (l = 0; l < 5; l++) {
if(k < 4) {
field[l][k] = field[l][k+1];
}
else {
field[l][k] = 0;
}
}
}
horizontalline--;
return 1;
}
if ((c2 >= horizontalline) || (s2 >= horizontalline) || (t2 >= horizontalline)) {
for (k = i; k >= 0; k--) {
for (l = 0; l < 5; l++) {
if(k > 0) {
field[k][l] = field[k-1][l];
}
else {
field[k][l] = 0;
}
}
}
verticalline--;
return 1;
}
}
c1 = s1 = t1 = c2 = s2 = t2 = 0;
}
return 0;
}
コメント
この記事へのコメント
完成オメ!
お疲れ様です。
作成するプログラムの規模が大きくなってきましたね!
なんというハイペースw

キャロル先生、こういうシステムだったんですね。
最初ルールが分からなくて焦りましたw
これをツクールDSで作るとかテラスゴス。
さすがはもずくさんですね。純粋に感動しました!

もう既に修正済みかもしれませんが、
main文を少しいじるだけでリトライも可能ですよ?
例えば…

int main(void) {
while(1){
choosestage();
while(!gameover) {
if(kbhit()) {
pushbutton();
}
}
printf("\nP:終了 それ以外のキー:タイトルへ");
gameover=0;
while(!(kbhit())){
}
if(getch()=='p')
break;
}
printf("\nお疲れ様でした!\n");
return 0;
}

不恰好なコードですみません。
このコードの場合、上記コードの
printf("\nP:終了 それ以外のキー:タイトルへ");
といった説明文は
printf("Congratulations!");
に続けて書いた方がスマートかも?

それと、話は変わりますが、
>例によってDOSで動かすタイプなので、
>Cコンパイラを持っていない人は遊べません。。
コンパイルしたファイルをexeに変換するか、
Visual Studioでコンパイルした後、
同プロジェクト内のDebugフォルダ内にある
exeファイルをそのまま使えば遊べたりします。
ただ、コンパイルする場所を考えないと、
ちょっとした個人情報が漏れたりしますが…

長文失礼しました。
ではでは ノシ
2010/12/09(木) 23:38:45 | パルソニック | #D2xI14F.[ 編集]
No title
>パルソニックさん
ありがとうございます!
パルソニックさんはキャロル先生をやったことはなかったんでしたっけ?
キャロちゃんのルールは昔2chで配布した時にちょっと書いて、
それ以来全く言及してなかったので申し訳ないです。。
次の記事辺りで、exeファイルをアップするのと一緒に、キャロちゃんのルールも書いておこうかな…
そして修正案、ありがとうございます!
リトライ、早速組み込んでみました。

リトライあるだけでずいぶんストレスが減りますね。
私事ですが、自分のファイルには、このゲームを"stamppuzzle"という名前で保存しているので、
ゲームを起動するたびにstamppuzzleと打たなくてはならず、なかなか面倒だったので…

プログラムをコンパイルした時に出てくるexeファイル、あれそのまま使えたのですね…知らなかった。
Cゲーム用にアップローダーを借りたので、そこにexeファイルをアップする予定です。
ありがとうございました!
2010/12/11(土) 22:58:47 | もずく | #-[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://mozuku88.blog134.fc2.com/tb.php/152-34ab8329
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。