main.cpp
#include <stdio.h>
#include <graphics.h>
#include <windows.h>
#include "minecraft.h"
main(void)
{
initgraph(1080,720,0);
setcaption("Minecraft 2D");
int bx=0,x,y;
mouse_msg msg={0};
PIMAGE img;
img=newimage();
getimage(img,"first//white.png");
putimage(0,0,img);
getimage(img,"first//logo.png");
for(;is_run;delay_fps(40))
{
putimage_withalpha(NULL,img,0,0);
if (bx==120)
break;
bx++;
}
getimage(img,"first//start.png");
putimage(0,0,img);
for(;is_run;delay_fps(60)) //按键判定
{
mousepos(&x,&y);
putimage(0,0,img);
if(x>341 && x<740 && y>400 && y<513)
{
while(mousemsg())
{
msg=getmouse();
if(msg.is_left() && msg.is_up())
{
game();
return 0;
}
}
}
}
getch();
game();
getch();
}minecraft.h
int game(void);
minecraft.cpp
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <windows.h>
#define CDEC dk[ax][bx]
#define PSG dik[ax][bx]
void Find(int aix,int bix,int pc);
void Check(int aix,int bix,int pc);
void Count(int aix,int bix,int pc);
int dk[54][36];
int dik[54][36];
int flag=0;
int game(void)
{
FILE *fp;
PIMAGE img;
img=newimage();
getimage(img,"first//loading.png");
putimage(0,0,img);
PIMAGE quit;
quit=newimage();
getimage(quit,"game//quit.png");
fp=fopen("save.txt","r");
Sleep(1);
MUSIC msc;
msc.OpenFile("C418 - Minecraft.mp3");
msc.Play(0);
int x,y,tx=0,ty=0,hy;
int ax=0,bx=0,cx=0,dx=0,kind=1,axt,bxt;
mouse_msg msg={0};
getimage(img,"game//gm.png");
PIMAGE other[5];
while(cx<5)
{
other[cx]=newimage();
cx++;
}
cx=0;
getimage(other[0],"game//kinder.png");
getimage(other[1],"game//pick.png");
PIMAGE block[100];
while(cx<100)
{
block[cx]=newimage();
cx++;
}
cx=1;
char cm[12];
sprintf(cm,"game//%d.png",cx);
while(cx<90)
{
getimage(block[cx],cm);
cx++;
sprintf(cm,"game//%d.png",cx);
}
while(ax<54)
{
while(bx<36)
{
dik[ax][bx]=0;
bx++;
}
bx=0;
ax++;
}
ax=0;bx=0;
while(ax<54)
{
while(bx<36)
{
dk[ax][bx]=0;
bx++;
}
bx=0;
ax++;
}
ax=0;bx=3;cx=5;
while(cx>0)
{
while(bx<54)
{
dk[bx][30+cx]=2;
bx++;
}
bx=3;
cx--;
}
bx=3;cx=0;
while(bx<54)
{
dk[bx][31]=1;
bx++;
}
bx=3;
while(bx<54)
{
dk[bx][35]=3;
bx++;
}
ax=0;bx=0;
while(ax<54)
{
while(bx<36)
{
fscanf(fp,"%d",&dk[ax][bx]);
bx++;
}
bx=0;
ax++;
}
Sleep(1000);
for(;is_run;delay_fps(30))
{
putimage(tx,0,img);
putimage_withalpha(NULL,other[0],0,0);
if(kind>24)
putimage_withalpha(NULL,other[1],30,ty);
else
putimage_withalpha(NULL,other[1],0,ty);
if(tx==-2159)
tx=0;
while(ax<54) //确定方块种类
{
while(bx<36)
{
hy=CDEC;
if (CDEC==8)
putimage_withalpha(NULL,block[8],ax*20,bx*20);
else if(CDEC>=1 && CDEC<=11)
putimage(ax*20,bx*20,block[hy]);
else if (CDEC==72)
dk[ax][bx]=12;
else if (CDEC==12) //沙子掉落
{
putimage(ax*20,bx*20,block[12]);
if(bx==35)
{
CDEC=0;
}
else if((dk[ax][bx+1]==0))
{
dk[ax][bx+1]=72;
CDEC=0;
}
}
else if (CDEC==73)
dk[ax][bx]=13;
else if (CDEC==13)
{
putimage(ax*20,bx*20,block[13]);
if(bx==35)
{
CDEC=0;
}
else if((dk[ax][bx+1]==0))
{
dk[ax][bx+1]=73;
CDEC=0;
}
}
else if (CDEC==14)
putimage_withalpha(NULL,block[14],ax*20,bx*20);
else if (CDEC==25) //红石粉相关特性
{
if(dk[ax][bx+1]==0 || dk[ax][bx+1]==25
|| dk[ax][bx+1]==75 || dk[ax][bx+1]==26
|| dk[ax][bx+1]==27 || dk[ax][bx+1]==28)
{
CDEC=0;
}
if(dk[ax+1][bx-1]==25 && (dk[ax][bx-1]==0
|| dk[ax][bx-1]==14 || dk[ax][bx-1]==27
|| dk[ax][bx-1]==28 ||
(dk[ax][bx-1]>=90 && dk[ax][bx-1]<117)))
{
if(PSG==1)
putimage_withalpha(NULL,block[78],ax*20,bx*20-2);
else
putimage_withalpha(NULL,block[75],ax*20,bx*20-2);
}
if(dk[ax-1][bx-1]==25 && (dk[ax][bx-1]==0
|| dk[ax][bx-1]==14 || dk[ax][bx-1]==27 ||
dk[ax][bx-1]==28 ||
(dk[ax][bx-1]>=90 && dk[ax][bx-1]<117)))
{
if(PSG==1)
putimage_withalpha(NULL,block[79],ax*20,bx*20-2);
else
putimage_withalpha(NULL,block[76],ax*20,bx*20-2);
}
else
{
if(PSG==1)
putimage_withalpha(NULL,block[77],ax*20,bx*20);
else
putimage_withalpha(NULL,block[25],ax*20,bx*20);
}
}
else if (CDEC==15)
putimage(ax*20,bx*20,block[15]);
else if (CDEC==16)
putimage(ax*20,bx*20,block[16]);
else if (CDEC==26) //红石火把相关特性
{
if(dk[ax][bx+1]==0 || dk[ax][bx+1]==25
|| dk[ax][bx+1]==75 || dk[ax][bx+1]==26
|| dk[ax][bx+1]==27 || dk[ax][bx+1]==28
|| dk[ax][bx+1]==96 || dk[ax][bx+1]==110)
CDEC=0;
else
{
PSG=2;
if(dk[ax][bx-1]!=0 && dk[ax][bx-1]!=14)
dik[ax][bx-1]=2;
}
if(dik[ax][bx+1]==2 || dik[ax][bx+1]==3)
CDEC=76;
putimage_withalpha(NULL,block[26],ax*20,bx*20);
}
else if (CDEC>=76 && CDEC<82)
{
if(dk[ax][bx+1]==0 || dk[ax][bx+1]==25
|| dk[ax][bx+1]==75 || dk[ax][bx+1]==26
|| dk[ax][bx+1]==27 || dk[ax][bx+1]==28
|| dk[ax][bx+1]==96 || dk[ax][bx+1]==110)
CDEC=0;
else
CDEC+=1;
putimage_withalpha(NULL,block[26],ax*20,bx*20);
}
else if(CDEC==82)
{
if(dk[ax][bx+1]==0 || dk[ax][bx+1]==25
|| dk[ax][bx+1]==75 || dk[ax][bx+1]==26
|| dk[ax][bx+1]==27 || dk[ax][bx+1]==28
|| dk[ax][bx+1]==96 || dk[ax][bx+1]==110)
CDEC=0;
else
{
PSG=0;
}
if(dik[ax][bx+1]==0)
CDEC=83;
putimage_withalpha(NULL,block[82],ax*20,bx*20);
}
else if (CDEC>=83 && CDEC<89)
{
if(dk[ax][bx+1]==0 || dk[ax][bx+1]==25
|| dk[ax][bx+1]==75 || dk[ax][bx+1]==26
|| dk[ax][bx+1]==27 || dk[ax][bx+1]==28
|| dk[ax][bx+1]==96 || dk[ax][bx+1]==110)
CDEC=0;
else
CDEC+=1;
putimage_withalpha(NULL,block[82],ax*20,bx*20);
if(CDEC==89)
CDEC=26;
}
else if (CDEC==27) //斜红石火把相关特性
{
if(dk[ax+1][bx]==0 || dk[ax+1][bx]==25
|| dk[ax+1][bx]==75 || dk[ax+1][bx]==26
|| dk[ax+1][bx]==27 || dk[ax+1][bx]==28
|| dk[ax+1][bx]==96 || dk[ax+1][bx]==110)
CDEC=0;
else
{
PSG=2;
if(dk[ax][bx-1]!=0 && dk[ax][bx-1]!=14)
dik[ax][bx-1]=2;
}
if(dik[ax+1][bx]==2 || dik[ax+1][bx]==3)
CDEC=90;
if(dik[ax][bx+1]==1)
dik[ax][bx+2]=3;
putimage_withalpha(NULL,block[27],ax*20,bx*20);
}
else if (CDEC>=90 && CDEC<96)
{
if(dk[ax+1][bx]==0 || dk[ax+1][bx]==25
|| dk[ax+1][bx]==75 || dk[ax+1][bx]==26
|| dk[ax+1][bx]==27 || dk[ax+1][bx]==28
|| dk[ax+1][bx]==96 || dk[ax+1][bx]==110)
CDEC=0;
else
CDEC+=1;
if(dik[ax][bx+1]==1)
dik[ax][bx+2]=3;
putimage_withalpha(NULL,block[27],ax*20,bx*20);
}
else if(CDEC==96)
{
if(dk[ax+1][bx]==0 || dk[ax+1][bx]==25
|| dk[ax+1][bx]==75 || dk[ax+1][bx]==26
|| dk[ax+1][bx]==27 || dk[ax+1][bx]==28
|| dk[ax+1][bx]==96 || dk[ax+1][bx]==110)
CDEC=0;
else
{
PSG=0;
}
if(dik[ax+1][bx]==0)
CDEC=97;
putimage_withalpha(NULL,block[80],ax*20,bx*20);
}
else if (CDEC>=97 && CDEC<103)
{
if(dk[ax+1][bx]==0 || dk[ax+1][bx]==25
|| dk[ax+1][bx]==75 || dk[ax+1][bx]==26
|| dk[ax+1][bx]==27 || dk[ax+1][bx]==28
|| dk[ax+1][bx]==96 || dk[ax+1][bx]==110)
CDEC=0;
else
CDEC+=1;
putimage_withalpha(NULL,block[80],ax*20,bx*20);
if(CDEC==103)
CDEC=27;
}
else if (CDEC==28) //斜红石火把相关特性
{
if(dk[ax-1][bx]==0 || dk[ax-1][bx]==25
|| dk[ax-1][bx]==75 || dk[ax-1][bx]==26
|| dk[ax-1][bx]==27 || dk[ax-1][bx]==28
|| dk[ax-1][bx]==96 || dk[ax-1][bx]==110)
CDEC=0;
else
{
PSG=2;
if(dk[ax][bx-1]!=0 && dk[ax][bx-1]!=14)
dik[ax][bx-1]=2;
}
if(dik[ax-1][bx]==2 || dik[ax-1][bx]==3)
CDEC=104;
if(dik[ax][bx+1]==1)
dik[ax][bx+2]=3;
putimage_withalpha(NULL,block[28],ax*20,bx*20);
}
else if (CDEC>=104 && CDEC<110)
{
if(dk[ax-1][bx]==0 || dk[ax-1][bx]==25
|| dk[ax-1][bx]==75 || dk[ax-1][bx]==26
|| dk[ax-1][bx]==27 || dk[ax-1][bx]==28
|| dk[ax-1][bx]==96 || dk[ax-1][bx]==110)
CDEC=0;
else
CDEC+=1;
if(dik[ax][bx+1]==1)
dik[ax][bx+2]=3;
putimage_withalpha(NULL,block[28],ax*20,bx*20);
}
else if(CDEC==110)
{
if(dk[ax-1][bx]==0 || dk[ax-1][bx]==25
|| dk[ax-1][bx]==75 || dk[ax-1][bx]==26
|| dk[ax-1][bx]==27 || dk[ax-1][bx]==28
|| dk[ax-1][bx]==96 || dk[ax-1][bx]==110)
CDEC=0;
else
{
PSG=0;
}
if(dik[ax-1][bx]==0)
CDEC=111;
putimage_withalpha(NULL,block[81],ax*20,bx*20);
}
else if (CDEC>=111 && CDEC<117)
{
if(dk[ax-1][bx]==0 || dk[ax-1][bx]==25
|| dk[ax-1][bx]==75 || dk[ax-1][bx]==26
|| dk[ax-1][bx]==27 || dk[ax-1][bx]==28
|| dk[ax-1][bx]==96 || dk[ax-1][bx]==110)
CDEC=0;
else
CDEC+=1;
putimage_withalpha(NULL,block[81],ax*20,bx*20);
if(CDEC==117)
CDEC=28;
}
else if(CDEC==29)
{
if((dik[ax+1][bx]==2 && dk[ax+1][bx]!=28)
|| PSG==2 || PSG==3 || (dik[ax-1][bx]==2
&& dk[ax-1][bx]!=27) || dik[ax][bx+1]==2 || (
dik[ax][bx-1]==2 && (dk[ax][bx-1]==27 || dk[ax][bx-1]==28))
|| dik[ax][bx+1]==2 || dik[ax+1][bx]==3 ||
dik[ax-1][bx]==3 || dik[ax][bx+1]==3 || dik[ax][bx-1]==3)
putimage(ax*20,bx*20,block[83]);
else
putimage(ax*20,bx*20,block[29]);
}
if(PSG==2)
{
Find(ax,bx,0);
if(dk[ax][bx+1]!=26 && CDEC!=26 && CDEC!=27 && CDEC!=28)
PSG=0;
if(CDEC>=90 && CDEC<96)
PSG=2;
else if(CDEC>=76 && CDEC<82)
PSG=2;
else if(CDEC>=104 && CDEC<110)
PSG=2;
}
if(PSG==1)
{
flag=0;
Check(ax,bx,0);
if(flag!=1)
{
Count(ax,bx,0);
}
}
if(PSG==3)
{
if((dik[ax+1][bx]!=1 && dik[ax-1][bx]!=1
&& dik[ax][bx-1]!=1) || CDEC==0 || CDEC==14)
PSG=0;
}
bx++;
}
bx=0;
ax++;
}
ax=0;
putimage_withalpha(NULL,quit,1020,0);
while(mousemsg())
{
msg=getmouse();
if(msg.is_left() && msg.is_up())
{
mousepos(&x,&y);
dk[x/20][y/20]=0;
dik[x/20][y/20]=0;
if(x>30 && x<60)
{
kind=24+y/30+1;
ty=y/30*30;
}
else if(x<30)
{
kind=y/30+1;
ty=y/30*30;
}
if(x>1000 && y<100)
{
fp=fopen("save.txt","w"); //结束
x=0;y=0;
Sleep(100);
while(x<54)
{
while(y<36)
{
fprintf(fp,"%d ",dk[x][y]);
y++;
}
y=0;
x++;
}
fclose(fp);
return 0;
}
}
if(msg.is_right() && msg.is_up())
{
mousepos(&x,&y);
if(x>60)
dk[x/20][y/20]=kind;
}
}
tx--;
}
getch();
}
void Find(int aix,int bix,int pc) //激活
{
int axt,bxt;
axt=aix;bxt=bix;
if(dk[aix+1][bix]==25 && pc!=1)
{
dik[aix+1][bix]=1;
if(dik[aix+1][bix+1]!=2)
dik[aix+1][bix+1]=3;
aix++;
Find(aix,bix,2);
}
aix=axt;bix=bxt;
if(dk[aix-1][bix]==25 && pc!=2)
{
dik[aix-1][bix]=1;
if(dik[aix-1][bix+1]!=2)
dik[aix-1][bix+1]=3;
aix--;
Find(aix,bix,1);
}
aix=axt;bix=bxt;
if(dk[aix][bix-1]==25 && pc!=3)
{
dik[aix][bix-1]=1;
bix--;
Find(aix,bix,4);
}
aix=axt;bix=bxt;
if(dk[aix][bix+1]==25 && pc!=4)
{
dik[aix][bix+1]=1;
bix++;
Find(aix,bix,3);
}
aix=axt;bix=bxt;
if(dk[aix-1][bix-1]==25 && pc!=5 && dik[aix][bix]==1 && (dk[aix][bix-1]==0
|| dk[aix][bix-1]==14 || dk[aix][bix-1]==27 || (dk[aix][bix-1]>=90
&& dk[aix][bix-1]<=103)))
{
dik[aix-1][bix-1]=1;
if(dik[aix-1][bix]!=2)
dik[aix-1][bix]=3;
aix--;
bix--;
Find(aix,bix,6);
}
aix=axt;bix=bxt;
if(dk[aix+1][bix+1]==25 && pc!=6 && dik[aix][bix]==1
&& (dk[aix+1][bix]==0 || dk[aix+1][bix]==14 || dk[aix+1][bix]==27
|| (dk[aix+1][bix]>=90 && dk[aix+1][bix]<=103)))
{
dik[aix+1][bix+1]=1;
if(dik[aix+1][bix+2]!=2)
dik[aix+1][bix+2]=3;
aix++;
bix++;
Find(aix,bix,5);
}
aix=axt;bix=bxt;
if(dk[aix+1][bix-1]==25 && pc!=7 && dik[aix][bix]==1 && (dk[aix][bix-1]==0
|| dk[aix][bix-1]==14 || dk[aix][bix-1]==28
|| (dk[aix][bix-1]>=104 && dk[aix][bix-1]<=117)))
{
dik[aix+1][bix-1]=1;
if(dik[aix+1][bix]!=2)
dik[aix+1][bix]=3;
aix++;
bix--;
Find(aix,bix,8);
}
aix=axt;bix=bxt;
if(dk[aix-1][bix+1]==25 && pc!=8 && dik[aix][bix]==1
&& (dk[aix-1][bix]==0 || dk[aix-1][bix]==14 || dk[aix-1][bix]==28
|| (dk[aix-1][bix]>=104 && dk[aix-1][bix]<=117)))
{
dik[aix-1][bix+1]=1;
if(dik[aix-1][bix+2]!=2)
dik[aix-1][bix+2]=3;
aix--;
bix++;
Find(aix,bix,7);
}
if(dik[aix][bix]==1 && dik[aix+1][bix]!=2 && dk[aix+1][bix]!=0
&& dk[aix+1][bix]!=26 && dk[aix+1][bix]!=25 && dk[aix-1][bix]!=27)
dik[aix+1][bix]=3;
if(dik[aix][bix]==1 && dik[aix-1][bix]!=2 && dk[aix-1][bix]!=0
&& dk[aix-1][bix]!=26 && dk[aix-1][bix]!=25 && dk[aix-1][bix]!=27)
dik[aix-1][bix]=3;
}
void Check(int aix,int bix,int pc) //判定
{
int axt,bxt;
axt=aix;bxt=bix;
if(dk[aix+1][bix]==25 && pc!=1)
{
aix++;
Check(aix,bix,2);
}
else if(dik[aix+1][bix]==2)
flag=1;
aix=axt;bix=bxt;
if(dk[aix-1][bix]==25 && pc!=2)
{
aix--;
Check(aix,bix,1);
}
else if(dik[aix-1][bix]==2)
flag=1;
aix=axt;bix=bxt;
if(dk[aix][bix-1]==25 && pc!=3)
{
bix--;
Check(aix,bix,4);
}
else if(dik[aix][bix-1]==2)
flag=1;
aix=axt;bix=bxt;
if(dk[aix][bix+1]==25 && pc!=4)
{
bix++;
Check(aix,bix,3);
}
else if(dik[aix][bix+1]==2)
flag=1;
aix=axt;bix=bxt;
if(dk[aix-1][bix-1]==25 && pc!=5 && dik[aix][bix]==1 && (dk[aix][bix-1]==0
|| dk[aix][bix-1]==14 || dk[aix][bix-1]==27
|| (dk[aix][bix-1]>=90 && dk[aix][bix-1]<=103)))
{
aix--;
bix--;
Check(aix,bix,6);
}
aix=axt;bix=bxt;
if(dk[aix+1][bix+1]==25 && pc!=6 && dik[aix][bix]==1
&& (dk[aix+1][bix]==0 || dk[aix+1][bix]==14 || dk[aix+1][bix]==27
|| (dk[aix+1][bix]>=90 && dk[aix][bix+1]<=103)))
{
aix++;
bix++;
Check(aix,bix,5);
}
aix=axt;bix=bxt;
if(dk[aix+1][bix-1]==25 && pc!=7 && dik[aix][bix]==1 && (dk[aix][bix-1]==0
|| dk[aix][bix-1]==14 || dk[aix][bix-1]==28
|| (dk[aix][bix-1]>=104 && dk[aix][bix-1]<=117)))
{
aix++;
bix--;
Check(aix,bix,8);
}
aix=axt;bix=bxt;
if(dk[aix-1][bix+1]==25 && pc!=8 && dik[aix][bix]==1
&& (dk[aix-1][bix]==0 || dk[aix-1][bix]==14 || dk[aix-1][bix]==28
|| (dk[aix-1][bix]>=104 && dk[aix-1][bix]<=117)))
{
aix--;
bix++;
Check(aix,bix,7);
}
}
void Count(int aix,int bix,int pc) //清零
{
int axt,bxt;
axt=aix;bxt=bix;
if(dk[aix][bix]==25 && pc!=1)
{
dik[aix][bix]=0;
aix++;
Count(aix,bix,2);
}
aix=axt;bix=bxt;
if(dk[aix][bix]==25 && pc!=2)
{
dik[aix][bix]=0;
aix--;
Count(aix,bix,1);
}
aix=axt;bix=bxt;
if(dk[aix][bix]==25 && pc!=3)
{
dik[aix][bix]=0;
bix--;
Count(aix,bix,4);
}
aix=axt;bix=bxt;
if(dk[aix][bix]==25 && pc!=4)
{
dik[aix][bix]=0;
bix++;
Count(aix,bix,3);
}
aix=axt;bix=bxt;
if(dk[aix][bix]==25 && pc!=5 && dik[aix][bix]==1 && (dk[aix][bix-1]==0
|| dk[aix][bix-1]==14 || dk[aix][bix-1]==27 || dk[aix][bix-1]==28))
{
dik[aix][bix]=0;
aix--;
bix--;
Count(aix,bix,6);
}
aix=axt;bix=bxt;
if(dk[aix][bix]==25 && pc!=6 && dik[aix][bix]==1
&& (dk[aix+1][bix]==0 || dk[aix+1][bix]==14 || dk[aix+1][bix]==27
|| dk[aix+1][bix]==28))
{
dik[aix][bix]=0;
aix++;
bix++;
Count(aix,bix,5);
}
aix=axt;bix=bxt;
if(dk[aix][bix]==25 && pc!=7 && dik[aix][bix]==1 && (dk[aix][bix-1]==0
|| dk[aix][bix-1]==14))
{
dik[aix][bix]=0;
aix++;
bix--;
Count(aix,bix,8);
}
aix=axt;bix=bxt;
if(dk[aix][bix]==25 && pc!=8 && dik[aix][bix]==1
&& (dk[aix-1][bix]==0 || dk[aix-1][bix]==14))
{
dik[aix][bix]=0;
aix--;
bix++;
Count(aix,bix,7);
}
}
项目:Minecraft 2D