特攻隊

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

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

第01期(2/1) 80→47→43→43→43→42→42→41→41→41→41→41→39 (-2) 生存率 49%
第02期(2/8) 70→29→25→24→20→19→19→19→19→19→19→19 (-0) 27%
第03期(2/15) 70→33→31→29→28→27→27→27→25→25→24 (-1) 34%
第04期(2/22) 70→30→25→24→24→23→23→23→23→22 (-1) 31%
第05期(3/1) 70→40→38→37→36→36→36→36→36 (-0) 51%
第06期(3/8) 80→42→34→32→32→32→32→28 (-4) 35%
第07期(3/15) 80→41→35→35→34→33→30 (-3) 38%
第08期(3/22) 80→48→34→31→29→24 (-5) 30%
第09期(3/29) 80→37→29→29→26 (-3) 33%
第10期(4/5) 90→38→31→26 (-5) 29%
第11期(4/12)130→60→50 (-10) 38%
第12期(4/20)125→91 (-34) 73%

計 415作品(-68) 削除合計 -68

総公開数 1025作品
総削除数 610作品
総生存率 39%


第01期(2/1) 80→47→43→43→43→42→42→41→41→41→41→41 (-0) 生存率 51%
第02期(2/8) 70→29→25→24→20→19→19→19→19→19→19 (-0) 27%
第03期(2/15) 70→33→31→29→28→27→27→27→25→25 (-0) 36%
第04期(2/22) 70→30→25→24→24→23→23→23→23 (-0) 32%
第05期(3/1) 70→40→38→37→36→36→36→36 (-0) 51%
第06期(3/8) 80→42→34→32→32→32→32 (-0) 40%
第07期(3/15) 80→41→35→35→34→33 (-1) 41%
第08期(3/22) 80→48→34→31→29 (-2) 36%
第09期(3/29) 80→37→29→29 (-0) 36%
第10期(4/5) 90→38→31 (-7) 34%
第11期(4/12)130→60 (-70) 46%
第12期(4/20)125 NEW!


計 484作品(+45) 削除合計 -80

総公開数 1025作品
総削除数 541作品
OLD生存率 40%(11期までの生存数÷11期までの公開数)

遂に全作品が出そろいましたね。
自作品2作目「空から天使が降ってきた」も公開されました。
現在評価数6、☆4ですが、全体的に好評価(荒らし?)なので、油断はできないですね。


ところで、「そらてん」(以下この略称で)には、以下、進行不能バグが2箇所あります。


①ノースロップの森の左にある洞窟に入ると、出た時に真っ暗な場所に出る

回避方法:
テストプレイにて、すり抜けONで右へ向かって下さい。
普通プレイでやっている場合は、その場でセーブしてテストプレイに切り替えてください。


②魔力場観測所イベント終了後に再度観測所へ行くと、出られなくなる

回避方法:
イベント終了後は観測所に用はないので、観測所には行かないでください。


…というわけで、例のごとくバグがあって申し訳ないです。
THE MISSIONの頃から全く成長してないですね^^;

ところで2ch等では、「進行不能バグがあると消される」という噂が囁かれていますが、本当にそうなのかな?
DPコンの頃の天使さま体験版、進行不能バグがあったのですが、なぜか最後まで生き残っていました。

そらてんも最後まで生き残って欲しいですね。

というわけで、色々と拙い作品ですが、プレイ&評価して頂けたら幸いです。

追記:作品中のギミックに関しては、しばらくノータッチで行きたいと思います。
よなべしてしまった…ぷよぷよの消すアルゴリズムって、複雑なんですね。
再帰関数の学習教材として、ぷよぷよは最適。
落ちゲーは他にも色々作れそう。

(4/21追記)main()関数を改造(clock()による時間制御に変更)。
(5/22追記)連鎖ウエイト追加。


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

#define HT 14
#define WD 6
#define CB 4

int field[WD + 2][HT + 1], check[WD + 2][HT + 1], combine[WD + 2][HT + 1];
int gameover = 0;
double timer = 0;
clock_t start, end;

typedef struct _TAG_STATUS {
int x;
int y;
int rotate;
int center;
int satellite;
} STATUS;

STATUS current, next;

bool putblock(STATUS, bool);
bool deleteblock(STATUS);
bool pushkey(char);
void blockdown(void);
void checkcombine(void);
bool deletecheck(int, int);
void closeup(void);
void showfield(void);

int main(void) {
for(int x = 0; x < WD + 2; x++) {
for(int y = 0; y < HT + 1; y++) {
if(x == 0 || x == WD + 1 || y == 0) {
field[x][y] = 6;
}
else {
field[x][y] = 0;
}
}
}
current.x = WD / 2 + WD % 2;
current.y = HT;
current.rotate = 0;
srand((unsigned)time(NULL));
current.center = rand() % 5 + 1;
current.satellite = rand() % 5 + 1;
putblock(current, true);
start = clock();
showfield();
while(!gameover) {
while(timer < 1) {
if(kbhit()) {
if(pushkey(getch())) {
timer = 1;
}
} else {
end = clock();
timer = (double)(end - start) / CLOCKS_PER_SEC;
}
}
blockdown();
timer = 0;
start = end = clock();
}
return 0;
}

bool putblock(STATUS s, bool action = false) {
if(field[s.x][s.y]) {
return false;
}
if(action) {
field[s.x][s.y] = current.center;
}
int r = s.rotate % 4;
int dx = 0;
int dy = -1;
for(int i = 0; i < r; i++) {
int nx = dx, ny = dy;
dx = ny;
dy = -nx;
}
if(field[s.x + dx][s.y + dy]) {
return false;
}
if(action) {
field[s.x + dx][s.y + dy] = current.satellite;
}
if(!action) {
putblock(s, true);
}
showfield();
return true;
}

bool deleteblock(STATUS s) {
field[s.x][s.y] = 0;
int dx = 0;
int dy = -1;
int r = s.rotate % 4;
for(int i = 0; i < r; i++) {
int nx = dx, ny = dy;
dx = ny;
dy = -nx;
}
field[s.x + dx][s.y + dy] = 0;
return true;
}

bool pushkey(char key) {
bool ret = false;
STATUS n = current;
if(key == 'a') {
n.x--;
} else if(key == 'd') {
n.x++;
} else if(key == ' ') {
n.rotate++;
} else if(key == 's') {
ret = true;
}
if(n.x != current.x || n.y != current.y || n.rotate != current.rotate) {
deleteblock(current);
if(putblock(n)) {
current = n;
} else {
putblock(current);
}
}
return ret;
}

void blockdown(void) {
deleteblock(current);
current.y--;
if(!putblock(current)) {
current.y++;
putblock(current);

showfield();
closeup();
checkcombine();

current.x = WD / 2 + WD % 2;
current.y = HT;
current.rotate = 0;
srand((unsigned)time(NULL));
current.center = rand() % 5 + 1;
current.satellite = rand() % 5 + 1;
if(!putblock(current)) {
gameover = 1;
}
}
}

void checkcombine(void) {
bool ret = false;
for(int y = 1; y <= HT; y++) {
for(int x = 1; x <= WD; x++) {
if(!check[x][y]) {
if(deletecheck(x, y)) {
ret = true;
}
for(int y = 1; y <= HT; y++) {
for(int x = 1; x <= WD; x++) {
combine[x][y] = 0;
}
}
}
}
}
closeup();
for(int y = 1; y <= HT; y++) {
for(int x = 1; x <= WD; x++) {
check[x][y] = 0;
}
}
if(ret) {
showfield();
checkcombine();
}
}

bool deletecheck(int x, int y) {
int n = 0;
int type = field[x][y];
check[x][y]++;
combine[x][y]++;
if(!type) {
return false;
}
if(1 <= x - 1 && field[x - 1][y] == type && check[x - 1][y] == 0) {
deletecheck(x - 1, y);
}
if(x + 1 <= WD && field[x + 1][y] == type && check[x + 1][y] == 0) {
deletecheck(x + 1, y);
}
if(1 <= y - 1 && field[x][y - 1] == type && check[x][y - 1] == 0) {
deletecheck(x, y - 1);
}
if(y + 1 <= HT && field[x][y + 1] == type && check[x][y + 1] == 0) {
deletecheck(x, y + 1);
}
for(int y = 1; y <= HT; y++) {
for(int x = 1; x <= WD; x++) {
n += combine[x][y];
}
}
if(CB <= n) {
for(int y = 1; y <= HT; y++) {
for(int x = 1; x <= WD; x++) {
if(combine[x][y]) {
field[x][y] = 0;
}
}
}
Sleep(50);
showfield();
return true;
}
return false;
}

void closeup(void) {
bool ret = false;
for(int y = 1; y <= HT - 1; y++) {
for(int x = 1; x <= WD; x++) {
if(field[x][y] == 0 && field[x][y+1] != 0) {
field[x][y] = field[x][y+1];
field[x][y+1] = 0;
ret = true;
}
}
}
if(ret) {
closeup();
}
}

void showfield(void) {
system("cls");
for(int y = HT - 1; y >= 0; y--) {
for(int x = 0; x <= WD + 1; x++) {
switch(field[x][y]) {

case 0:
printf(" ");
break;
case 1:
printf("▽");
break;
case 2:
printf("○");
break;
case 3:
printf("□");
break;
case 4:
printf("◇");
break;
case 5:
printf("△");
break;
case 6:
printf("■");
break;
}
}
printf("\n");
}
}

第1期(2/1) 80→47→43→43→43→42→42→41→41→41→41 (-0) 生存率 51%
第2期(2/8) 70→29→25→24→20→19→19→19→19→19 (-0) 27%
第3期(2/15) 70→33→31→29→28→27→27→27→25 (-2) 36%
第4期(2/22) 70→30→25→24→24→23→23→23 (-0) 32%
第5期(3/1) 70→40→38→37→36→36→36 (-0) 51%
第6期(3/8) 80→42→34→32→32→32 (-0) 40%
第7期(3/15) 80→41→35→35→34 (-0) 44%
第8期(3/22) 80→48→34→31 (-3) 39%
第9期(3/29) 80→37→29 (-8) 36%
第10期(4/5) 90→38 (-52) 36%
第11期(4/12)130 NEW!


計 439作品(+65) 削除合計 -65

総公開数 900作品
総削除数 461作品
OLD生存率 47%(10期までの生存数÷10期までの公開数)

130作品。一気に公開数が増えました。
これは来週で最後かな?
来週も100以上公開されるとすると、全部で1000以上投稿されたことになります。
第1回と同じボリュームになるとは、予想外。

ところで、自分の2作目は来ませんでした。
また最終期の上の方に公開されそうで不安です…。幸運といえば幸運ですが。。
自作ゲーム用アプロダに、窓プログラミング版テトリスをアップしました。

操作方法:←→↓でブロック移動、↑でブロック回転

レベルつけてないけど、まあこんなもんで良いかな。
これでとりあえず、当初の目標達成ってことで、一区切りついた感じ。
ニコニコプログラミングの人のやり方を大いにパク…参考にしているので、
ソースコードは非公開にします。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。