Skip to content

Instantly share code, notes, and snippets.

@polonez
Created April 12, 2018 14:46
Show Gist options
  • Select an option

  • Save polonez/4064d09ff7397fa22640d06f82036e8b to your computer and use it in GitHub Desktop.

Select an option

Save polonez/4064d09ff7397fa22640d06f82036e8b to your computer and use it in GitHub Desktop.
puyopuyo (game)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <conio.h>
#include <windows.h>
#define LOG_TAB -12
#define LEFT_KEY 17
#define UP_KEY 18
#define RIGHT_KEY 19
#define DOWN_KEY 20
int level[2];
int map[2][20][20];
int mapx[2]={2,40};
int mapy[2]={1,1};
int H=12,W=6;
int pung = -123;
int bhp = 83;
int pung_len = 4; /// ∏¿Ã∏È ≈Õ¡ˆ∞‘µ«¥¬ ∞≥ºˆ. default = 4∞≥
int colorset[9] = {208, 224, 160, 144, 176, 192};
int color_cnt[5]={0,3,4,5,6};
int badak[2][10]= {{12,12,12,12,12,12,12},{12,12,12,12,12,12,12}};
int stack_size = 2;
int score_y[20] = {0,8,16,32,64,96,128,160,192,224,256,288,320,352,388,416,448,480,512};
int score_p[10] = {0,2,3,4,5,6,7,10};
int score_c[10] = {0,3,6,12,24};
int banha[2];
int nowrensa[2] = {0,0};
int maxrensa[2] = {0,0};
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
bool islog = false;
char log[1000010];
int loglen=0;
struct Puyo{
int x;
int y;
int color[2];
int dir;
} p[2][5], now[2], pre[2];
void gotoxy(int x, int y);
void setcolor(int color);
void replace_puyo(int user);
void dosomething(char dd);
int* is_combo(int user);
int combo_count(int user);
void rewrite_map(int user);
void make_map()
{
int i, j;
for(int player=0; player<2; player++)
{
for(i=0; i<=H+1; i++)
{
map[player][i][0] = -1;
map[player][i][W+1] = -1;
}
for(j=0; j<=W+1; j++)
{
map[player][0][j] = -1;
map[player][H+1][j] = -1;
}
for(i=1; i<=H; i++)
for(j=1; j<=W; j++)
map[player][i][j] = -19291;
}
}
void inil()
{
static const char *const init_message =
"ª—ø‰ª—ø‰ ººªÛø° ø¿Ω≈ ∞Õ¿ª »Øøµ«’¥œ¥Ÿ!\n"
"≥≠¿Ãµµ∏¶ º±≈√«— »ƒ Enter ≈∞∏¶ ¥≠∑Ø¡÷ººø‰\n"
"≥≠¿Ãµµ (1~4) : ";
fputs(init_message, stdout);
scanf("%d",&level[0]);
while(level[0]<1 || level[0] > 4)
{
system("cls");
printf("«Ê§ª ¥ŸΩ√ ¿‘∑¬«ÿ¡÷ººøÎ§ª\n");
printf("≥≠¿Ãµµ (1~4) : ");
scanf("%d",&level[0]);
}
level[1]= level[0];
system("cls");
printf("ª—ø‰ ∏Ó∞≥∞° ∏¿Ã∏È ≈Õ¡ˆ∞‘ «“±Óø‰??\n");
printf("∞≥ºˆ (2~7) : ");
scanf("%d",&pung_len);
while(pung_len<2 || pung_len > 7)
{
system("cls");
printf("«Ê§ª ¥ŸΩ√ ¿‘∑¬«ÿ¡÷ººøÎ§ª\n");
printf("∞≥ºˆ (2~10) : ");
scanf("%d",&pung_len);
}
system("cls");
srand(0);
make_map();
if(islog)
{
log[0] = level[0];
log[1] = LOG_TAB;
loglen = 2;
}
for(int player=0; player<2; player++)
for(int i=0; i<5; i++)
{
replace_puyo(player);
}
}
void shadow_change(int user)
{
gotoxy(mapx[user] + pre[user].y*2,mapy[user] + pre[user].x);
printf(" ");
gotoxy(mapx[user] + (pre[user].y+dy[pre[user].dir])*2,mapy[user]+pre[user].x + dx[pre[user].dir]);
printf(" ");
now[user].x = badak[user][now[user].y];
if(now[user].dir %2 && now[user].x > badak[user][now[user].y + dy[now[user].dir]])
now[user].x = badak[user][now[user].y + dy[now[user].dir]];
if(now[user].x + dx[now[user].dir] > badak[user][now[user].y])
{
now[user].x = badak[user][now[user].y] -1;
}
}
void paint_color(int user)
{
int i, j;
pre[user] = now[user];
if(pre[user].dir == 2)
{
map[user][badak[user][pre[user].y]][pre[user].y] = pre[user].color[1];
gotoxy(mapx[user]+pre[user].y*2,mapy[user]+badak[user][pre[user].y]);
if(pre[user].color[1] == bhp)
{
setcolor(15);
printf("£¿");
}
else
{
setcolor(colorset[pre[user].color[1]]);
printf(" ");
}
map[user][badak[user][pre[user].y]-1][pre[user].y] = pre[user].color[0];
gotoxy(mapx[user]+pre[user].y*2,mapy[user]+badak[user][pre[user].y]-1);
if(pre[user].color[0] == bhp)
{
setcolor(15);
printf("£¿");
}
else
{
setcolor(colorset[pre[user].color[0]]);
printf(" ");
}
badak[user][pre[user].y] -=2;
}
else
{
map[user][badak[user][pre[user].y]][pre[user].y] = pre[user].color[0];
gotoxy(mapx[user]+pre[user].y*2,mapy[user]+badak[user][pre[user].y]);
if(pre[user].color[0] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[pre[user].color[0]]);
printf(" ");}
badak[user][pre[user].y]--;
map[user][badak[user][pre[user].y+dy[pre[user].dir]]][pre[user].y+dy[pre[user].dir]]=pre[user].color[1];
gotoxy(mapx[user]+(pre[user].y+dy[pre[user].dir])*2,mapy[user]+badak[user][pre[user].y+dy[pre[user].dir]]);
if(pre[user].color[1] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[pre[user].color[1]]);
printf(" ");}
badak[user][pre[user].y+dy[pre[user].dir]]--;
}
}
void dosomething(char dd)
{
int user = 0;
if(dd == 'd' || dd==LEFT_KEY) // left
{
if(dd == LEFT_KEY)
user = 1;
pre[user] = now[user];
if(now[user].y > 1)
{
if(now[user].dir == 3)
{
if(now[user].y > 2 && badak[user][now[user].y-2]>=0)
now[user].y --;
}
else if(badak[user][now[user].y-1]>=0)
{
now[user].y--;
}
}
shadow_change(user);
}
if(dd == 'g' || dd==RIGHT_KEY) // right
{
if(dd == RIGHT_KEY)
user = 1;
pre[user] = now[user];
if(now[user].y < W)
{
if(now[user].dir == 1)
{
if( now[user].y <W-1 && badak[user][now[user].y+2]>=0)
now[user].y ++;
}
else if(badak[user][now[user].y+1]>=0)
{
now[user].y++;
}
}
shadow_change(user);
}
if(dd == 'z' || dd == 'r' || dd=='.' || dd==UP_KEY) // turn left
{
if(dd == '.' || dd == UP_KEY)
user = 1;
pre[user] = now[user];
if(now[user].dir%2 == 0)
if(badak[user][now[user].y-1]<0 &&badak[user][now[user].y+1]<0)
now[user].dir = (now[user].dir+3)%4;
now[user].dir = (now[user].dir+3)%4;
if(now[user].dir == 3 && (now[user].y == 1 || badak[user][now[user].y-1]<0))
{
now[user].y ++;
}
if(now[user].dir == 1 && (now[user].y == W || badak[user][now[user].y+1]<0))
{
now[user].y --;
}
shadow_change(user);
}
if(dd == 'x' || dd == '/') //turn right
{
if(dd == '/')
user = 1;
pre[user] = now[user];
if(now[user].dir%2 == 0)
if(badak[user][now[user].y-1]<0 &&badak[user][now[user].y+1]<0)
now[user].dir = (now[user].dir+1)%4;
now[user].dir = (now[user].dir+1)%4;
if(now[user].dir == 3 && (now[user].y == 1 || badak[user][now[user].y-1]<0))
{
now[user].y ++;
}
if(now[user].dir == 1 && (now[user].y == W || badak[user][now[user].y+1]<0))
{
now[user].y --;
}
shadow_change(user);
}
if(dd == 'v' || dd=='f'|| dd==DOWN_KEY) // down
{
if(dd == DOWN_KEY)
user = 1;
pre[user] = now[user];
setcolor(15);
gotoxy(mapx[user]+pre[user].y*2,mapy[user]+pre[user].x);
printf(" ");
gotoxy(mapx[user]+2*(pre[user].y+dy[pre[user].dir]),mapy[user]+pre[user].x+dx[pre[user].dir]);
printf(" ");
if(now[user].dir == 2)
{
map[user][badak[user][now[user].y]][now[user].y] = now[user].color[1];
gotoxy(mapx[user]+pre[user].y*2,mapy[user]+badak[user][pre[user].y]);
if(pre[user].color[1] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[pre[user].color[1]]);
printf(" ");}
if(islog)
{
log[loglen++] = now[0].y/10;
log[loglen++] = now[0].y%10;
log[loglen++] = LOG_TAB;
log[loglen++] = badak[0][now[0].y]/10;
log[loglen++] = badak[0][now[0].y]%10;
log[loglen++] = LOG_TAB;
log[loglen++] = now[0].color[1]/10;
log[loglen++] = now[0].color[1]%10;
log[loglen++] = LOG_TAB;
}
badak[user][now[user].y] --;
map[user][badak[user][now[user].y]][now[user].y+dy[now[user].dir]] = now[user].color[0];
gotoxy(mapx[user]+pre[user].y*2,mapy[user]+badak[user][pre[user].y]);
if(pre[user].color[0] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[pre[user].color[0]]);
printf(" ");}
if(islog)
{
log[loglen++] = (now[0].y+dy[now[0].dir])/10;
log[loglen++] = (now[0].y+dy[now[0].dir])%10;
log[loglen++] = LOG_TAB;
log[loglen++] = badak[0][now[0].y]/10;
log[loglen++] = badak[0][now[0].y]%10;
log[loglen++] = LOG_TAB;
log[loglen++] = now[0].color[0]/10;
log[loglen++] = now[0].color[0]%10;
log[loglen++] = LOG_TAB;
}
badak[user][now[user].y] --;
}
else
{
map[user][badak[user][now[user].y]][now[user].y] = now[user].color[0];
gotoxy(mapx[user]+pre[user].y*2,mapy[user]+badak[user][pre[user].y]);
if(pre[user].color[0] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[pre[user].color[0]]);
printf(" ");}
if(islog)
{
log[loglen++] = now[0].y/10;
log[loglen++] = now[0].y%10;
log[loglen++] = LOG_TAB;
log[loglen++] = badak[0][now[0].y]/10;
log[loglen++] = badak[0][now[0].y]%10;
log[loglen++] = LOG_TAB;
log[loglen++] = now[0].color[0]/10;
log[loglen++] = now[0].color[0]%10;
log[loglen++] = LOG_TAB;
}
badak[user][now[user].y]--;
map[user][badak[user][now[user].y+dy[now[user].dir]]][now[user].y+dy[now[user].dir]] = now[user].color[1];
gotoxy(mapx[user]+(pre[user].y+dy[pre[user].dir])*2,mapy[user]+badak[user][pre[user].y+dy[pre[user].dir]]);
if(pre[user].color[1] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[pre[user].color[1]]);
printf(" ");}
if(islog)
{
log[loglen++] = (now[0].y+dy[now[0].dir])/10;
log[loglen++] = (now[0].y+dy[now[0].dir])%10;
log[loglen++] = LOG_TAB;
log[loglen++] = badak[0][now[0].y+dy[now[0].dir]]/10;
log[loglen++] = badak[0][now[0].y+dy[now[0].dir]]%10;
log[loglen++] = LOG_TAB;
log[loglen++] = now[0].color[1]/10;
log[loglen++] = now[0].color[1]%10;
log[loglen++] = LOG_TAB;
}
badak[user][now[user].y+dy[now[user].dir]] -- ;
}
nowrensa[user] = combo_count(user);
if(nowrensa[user] > maxrensa[user])
maxrensa[user] = nowrensa[user];
setcolor(15);
gotoxy(mapx[user]+12,mapy[user]+3+H);
printf("%3d",nowrensa[user]);
gotoxy(mapx[user]+12,mapy[user]+4+H);
printf("%3d",maxrensa[user]);
/*
* gotoxy(0,15);
* setcolor(15);
* printf("\n\n«ˆ¿Á ƒfi∫∏ : %d",nowrensa[user]);
* printf("\n√÷¥Î ƒfi∫∏ : %d",maxrensa[user]);
* printf("\nπÊ«ÿª—ø‰ ºˆ : %d ",banha[user]);*/
replace_puyo(user);
}
if(dd == 'q' || loglen > 1000000)
{
badak[0][3] = -1;
badak[1][3] = -1;
}
}
void replace_puyo(int user)
{
int i;
now[user] = p[user][0];
now[user].y = 3;
now[user].x = badak[user][3];
for(i=0; i<stack_size-1; i++)
{
p[user][i] = p[user][i+1];
}
if(banha[(user+1)%2]>0 && (rand()%10>3)){banha[(user+1)%2]--; p[user][stack_size-1].color[0] = bhp;}
else{p[user][stack_size-1].color[0] = rand()%color_cnt[level[user]];}
if(banha[(user+1)%2]>0 && (rand()%10>3)){banha[(user+1)%2]--; p[user][stack_size-1].color[1] = bhp;}
else{p[user][stack_size-1].color[1] = rand()%color_cnt[level[user]];}
p[user][stack_size-1].dir = 0;
}
void queue_clear(int user)
{
setcolor(15);
gotoxy(20+16*user,1);
printf(" ");
gotoxy(20+16*user,3);
printf(" ");
gotoxy(22+16*user,2);
printf(" ");
gotoxy(18+16*user,2);
printf(" ");
}
void print_queue(int user)
{
int i=0;
queue_clear(user);
gotoxy(20+16*user,2);
if(now[user].color[0] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[now[user].color[0]]);
printf(" ");
}
gotoxy(20+16*user+2*dy[now[user].dir],2+dx[now[user].dir]);
if(now[user].color[1] == bhp){
setcolor(15);
printf("£¿");
}
else
{
setcolor(colorset[now[user].color[1]]);
printf(" ");
}
for(i=0; i<stack_size; i++)
{
gotoxy(25+6*user,i*4+4);
if(p[user][i].color[0] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[p[user][i].color[0]]);
printf(" ");}
gotoxy(25+6*user,i*4+3);
if(p[user][i].color[1] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[p[user][i].color[1]]);
printf(" ");}
}
}
void process()
{
int i, j;
char dd;
setcolor(15);
for(int player=0; player<2; player++)
{
setcolor(15);
for(i=0; i<=H+1; i++)
{
gotoxy(mapx[player],mapy[player]+i);
for(j=0; j<=W+1; j++)
{
if(map[player][i][j]==-1)
{
printf("¢æ");
}
else if(map[player][i][j] == bhp)
{
printf("£¿");
}
else
{
printf(" ");
}
}
}
gotoxy(mapx[player],mapy[player]+2+H);
printf("≥≤¿∫ πÊ«ÿª—ø‰ : %3d",banha[player]);
gotoxy(mapx[player],mapy[player]+3+H);
printf("«ˆ¿Á ƒfi∫∏ : %3d",nowrensa[player]);
gotoxy(mapx[player],mapy[player]+4+H);
printf("√÷¥Î ƒfi∫∏ : %3d",maxrensa[player]);
}
while(1)
{
setcolor(15);
gotoxy(mapx[0]+16,mapy[0]+2+H);
printf("%3d",banha[1]);
gotoxy(mapx[1]+16,mapy[1]+2+H);
printf("%3d",banha[0]);
for(int player=0; player<2; player++)
{
gotoxy(mapx[player]+now[player].y*2,mapy[player]+now[player].x);
if(now[player].color[0] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[now[player].color[0]]/16);
printf("°‡");}
gotoxy(mapx[player]+(now[player].y+dy[now[player].dir])*2,mapy[player]+now[player].x + dx[now[player].dir]);
if(now[player].color[1] == bhp)
{
setcolor(15);
printf("£¿");
}
else{
setcolor(colorset[now[player].color[1]]/16);
printf("°‡");}
print_queue(player);
}
setcolor(15);
dd = getch();
if(dd<0){
dd = getch();
switch(dd)
{
case 80: // down
dd = DOWN_KEY;
break;
case 77: // right key
dd = RIGHT_KEY;
break;
case 72: // up
dd = UP_KEY;
break;
case 75: // left
dd = LEFT_KEY;
break;
}
}
dosomething(dd);
if(badak[0][3] < 0 || badak[1][3] < 0)
{
system("cls");
break;
}
}
printf("≤ ¥Á≈•~\n\n");
}
void dds()
{
int i=0;
for(i=0; i<16; i++)
{
setcolor(i*16);
printf(" ");
}
getchar();
}
void makelog()
{
int i;
char k;
k = log[0];
for(i=1; i<loglen; i++)
{
log[i] = log[i-1] ^ log[i];
}
}
void output()
{
char y;
printf("¿Ã¿¸ ∑Œ±◊∆ƒ¿œ¿ª ¡ˆøÏ∞Ì ªı∑Œ µ§æÓæ≤Ω√∞⁄Ω¿¥œ±Ó??\n(y/n)");
fflush(stdin);
scanf("%c",&y);
if(!islog){ printf("æ∆¡˜ ∑Œ±◊∆ƒ¿œ ±‚∑œ 滫œ∞‘«ÿ≥˘¿Ω§ª \nfake∂ı¥Ÿ!! «÷«÷«œ(;;)\n\n");}
else if(y == 'y' || y == 'Y')
{
printf("∑Œ±◊∆ƒ¿œ¿ª ¿˙¿Â¡fl¿‘¥œ¥Ÿ. ¿·Ω√∏∏ ±‚¥Ÿ∑¡¡÷Ω Ω√ø¿");
FILE *fp;
fp = fopen("loging.txt","wt");
printf(".");
makelog();
printf(".");
for(int i=0; i<loglen; i++)
{
fprintf(fp,"%c",log[i]);
}
printf(".");
printf("\n\n∑Œ±◊∆ƒ¿œ ¿˙¿Â øœ∑·!\n¿Ã¡¶ loging.txt ∆ƒ¿œ¿ª \n\n");
setcolor(12);
printf("[email protected]");
setcolor(15);
printf("∑Œ ∫∏≥ª¡÷ººøµ~\n\n");
}
printf("contact\nP.H. = ");
setcolor(12);
printf("010-5l26-34l9\n");
setcolor(15);
printf("Blog = ");
setcolor(12);
printf("http://hinohie.tistory.com »˜≥Û¿« ¿‚«–¥ŸΩƒ\n");
setcolor(15);
printf("Email = ");
setcolor(12);
printf("[email protected]\n [email protected]\n [email protected]\n\n");
setcolor(15);
printf("¡¶¿€¿⁄ : »˜≥λ˜ø°\n\n");
system("pause");
}
int main()
{
int i, j;
inil();
process();
output();
return 0;
}
void gotoxy(int x, int y)
{
COORD pos = {x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void setcolor(int color)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
void bfs(int sx, int sy,int user)
{
int i, j;
int queue[100][2];
int mark[20][20];
int q, r;
int tx, ty;
int t[2];
for(i=0; i<=H; i++)
for(j=1; j<=W; j++)
mark[i][j] = 0;
q=0;
r=1;
queue[0][0] = sx;
queue[0][1] =sy;
mark[sx][sy] = 1;
while(q<r)
{
t[0] = queue[q][0];
t[1] = queue[q][1];
for(i=0; i<4; i++)
{
tx = t[0] + dx[i];
ty = t[1] + dy[i];
if(tx>0 && tx<=H)
{
if(ty>0 && ty<=W)
{
if(mark[tx][ty] == 0)
{
if(map[user][tx][ty] == map[user][t[0]][t[1]])
{
queue[r][0] = tx;
queue[r][1] = ty;
mark[tx][ty] = 1;
r++;
}
}
}
}
}
q++;
}
if(r >= pung_len)
{
for(i=0; i<r; i++)
{
map[user][queue[i][0]][queue[i][1]] = pung + map[user][queue[i][0]][queue[i][1]];
for(j=0; j<4; j++)
{
if(map[user][queue[i][0]+dx[j]][queue[i][1]+dy[j]] == bhp)
{
map[user][queue[i][0]+dx[j]][queue[i][1]+dy[j]] +=pung;
}
}
}
}
}
int* is_combo(int user)
{
int i, j, k;
for(i=1; i<=H; i++)
{
for(j=1; j<=W; j++)
{
if(map[user][i][j] >=0 && map[user][i][j]!=bhp)
{
bfs(i,j,user);
}
}
}
int* pp;
pp = (int*)malloc(sizeof(int)*color_cnt[level[user]]);
for(i=0; i<color_cnt[level[user]]; i++)
{
*(pp+i) = 0;
}
for(i=1; i<=W; i++)
{
k=H;
for(j=H; j>=0; j--)
{
if(map[user][j][i] >= 0)
{
map[user][k][i] = map[user][j][i];
k--;
}
else
{
if((map[user][j][i] >= pung )&& (map[user][j][i] <=(pung + color_cnt[level[user]])))
{
(*(pp+(map[user][j][i] - pung)) )++;
continue;
}
else if(map[user][j][i] == pung+bhp)
continue;
break;
}
}
badak[user][i] = k;
for(j=k; j>0; j--)
{
map[user][j][i] = -19291;
}
if(k>0)
{
map[user][j][i] = -1;
}
}
return pp;
}
void rewrite_map(int user)
{
int i, j;
for(i=1; i<=W; i++)
{
for(j=0; j<=H; j++)
{
gotoxy(mapx[user]+i*2,mapy[user]+j);
setcolor(15);
if(map[user][j][i] == -1)
printf("¢æ");
else if(map[user][j][i] == bhp)
printf("£¿");
else
{
if(map[user][j][i] >= 0)
{
setcolor(colorset[map[user][j][i]]);
}
printf(" ");
}
}
}
}
int score(int* pp, int cnt,int user)
{
int yonsei;
int many=0;
int collor;
yonsei = score_y[cnt>18?18:cnt];
int i, j, k;
j=0;
for(i=0; i<color_cnt[level[user]]; i++)
{
if(*(pp+i) > 0)
{
j++;
many += score_p[*(pp+i)>11?7:*(pp+i)>4?*(pp+i) -4:0];
}
}
collor = score_c[j>4?4:j-1];
return (yonsei + many + collor);
}
int combo_count(int user)
{
int cnt = 0;
int tp=0;
int* pp;
int i, j;
banha[user] = 0;
while(1)
{
pp = is_combo(user);
tp=0;
j=0;
for(i=0; i<color_cnt[level[user]]; i++)
{
if(*(pp+i) > 0)
{
j++;
tp+=(*(pp+i));
}
}
if(j==0)
break;
banha[user] += tp*score(pp,cnt,user)/7;
cnt++;
}
if(cnt >0)
{
rewrite_map(user);
}
return cnt;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment