2015年3月24日火曜日

230行倉庫番

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

#define STAGE_NUM 2

void updateGame(int inputData);
void drawData(void);
void loadData(int _stageNum);
int Locate(HANDLE hOut, int x, int y);

int width;
int height;
int data[30][30];
int baseData[30][30];
int cara[2];
int goalCount;
int goal;
int block[30][2];

int main()
{
int stageNum = 0;
loadData(stageNum);
while(true){
drawData();
//Sleep(1000);
while(kbhit()!=1){
}
int t = getch();
if(t == 'r'){
loadData(stageNum);
}else if(t == 'n'){
stageNum++;
if(stageNum >= STAGE_NUM) stageNum = STAGE_NUM-1;
loadData(stageNum);
}else if(t == 'b'){
stageNum--;
if(stageNum < 0) stageNum = 0;
loadData(stageNum);
}
updateGame(t);
}
return 0;
}

void incrementGoalCount(int num){
goalCount+=num;
if(goalCount == goal){
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
Locate(hStdout,0, height+2);
printf("clear!!!");

}

}

void updateGame(int inputData){
if(inputData== 'w'){//上
if(cara[0] > 0){
if(data[cara[0]-1][cara[1]]==0 || data[cara[0]-1][cara[1]]==1){//何もないから大人しく移動
cara[0]-=1;
}else if(data[cara[0]-1][cara[1]]==2){//箱がある
if(cara[0] > 1){
if(data[cara[0]-2][cara[1]]==0 || data[cara[0]-2][cara[1]]==1){//箱の先にも何もないから大人しく移動
if(baseData[cara[0]-1][cara[1]] == 1){//箱が元々?だったから
data[cara[0]-1][cara[1]]=1;
incrementGoalCount(-1);
}else{
data[cara[0]-1][cara[1]]=0;
}
if(data[cara[0]-2][cara[1]]==1){//箱の先が?だったから、ゴール判定だから後ろ
incrementGoalCount(1);
}
data[cara[0]-2][cara[1]]=2;
cara[0]-=1;
}
}

}
}
}else if(inputData== 'z'){//下
if(cara[0] < height-1){
if(data[cara[0]+1][cara[1]]==0 || data[cara[0]+1][cara[1]]==1){//何もないから大人しく移動
cara[0]+=1;
}else if(data[cara[0]+1][cara[1]]==2){//箱がある
if(cara[0] < height-2){
if(data[cara[0]+2][cara[1]]==0 || data[cara[0]+2][cara[1]]==1){//何もないから大人しく移動
if(baseData[cara[0]+1][cara[1]] == 1){//箱が元々?だったから
data[cara[0]+1][cara[1]]=1;
incrementGoalCount(-1);
}else{
data[cara[0]+1][cara[1]]=0;
}
if(data[cara[0]+2][cara[1]]==1){//箱の先が?だったから
incrementGoalCount(1);
}
data[cara[0]+2][cara[1]]=2;
cara[0]+=1;
}
}

}
}
}else if(inputData== 'a'){//左
if(cara[1] > 0){
if(data[cara[0]][cara[1]-1]==0 || data[cara[0]][cara[1]-1]==1){//何もないから大人しく移動
cara[1]-=1;
}else if(data[cara[0]][cara[1]-1]==2){//箱がある
if(cara[1] > 1){
if(data[cara[0]][cara[1]-2]==0 || data[cara[0]][cara[1]-2]==1){//何もないから大人しく移動
if(baseData[cara[0]][cara[1]-1] == 1){//箱が元々?だったから
data[cara[0]][cara[1]-1]=1;
incrementGoalCount(-1);
}else{
data[cara[0]][cara[1]-1]=0;
}
if(data[cara[0]][cara[1]-2]==1){//箱の先が?だったから
incrementGoalCount(1);
}
data[cara[0]][cara[1]-2]=2;
cara[1]-=1;
}
}

}
}

}else if(inputData== 's'){//右
if(cara[1] < width-1){
if(data[cara[0]][cara[1]+1]==0 || data[cara[0]][cara[1]+1]==1){//何もないから大人しく移動
cara[1]+=1;
}else if(data[cara[0]][cara[1]+1]==2){//箱がある
if(cara[1] < width-2){
if(data[cara[0]][cara[1]+2]==0 || data[cara[0]][cara[1]+2]==1){//何もないから大人しく移動
if(baseData[cara[0]][cara[1]+1] == 1){
data[cara[0]][cara[1]+1]=1;
incrementGoalCount(-1);
}else{
data[cara[0]][cara[1]+1]=0;
}
if(data[cara[0]][cara[1]+2]==1){//箱の先が?だったから
incrementGoalCount(1);
}
data[cara[0]][cara[1]+2]=2;
cara[1]+=1;
}
}
}
}
}
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
Locate(hStdout,0, 10);
printf("%d",goalCount);
}

void drawData(void){
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

Locate(hStdout,0, 0);
for(int i=0;i<width+2;i++){
printf("■");
}
Locate(hStdout,0, height+1);
for(int i=0;i<width+2;i++){
printf("■");
}
for(int i=0;i<height;i++){
Locate(hStdout,0, i+1);
printf("■");
for(int j=0;j<width;j++){
if(data[i][j] == 0)printf(" ");
if(data[i][j] == 1)printf("・");
if(data[i][j] == 2)printf("□");
if(data[i][j] == 3)printf("■");
}
printf("■");
}
Locate(hStdout,cara[1]*2+2, cara[0]+1);
printf("○");
}

void loadData(int _stageNum){
goal=0;
goalCount=0;

HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
Locate(hStdout,0, height+2);
printf("         ");

char fileNum[256];
sprintf(fileNum,"stage%d.txt",_stageNum);

FILE *fp;
if ((fp = fopen(fileNum, "r")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */
}
fscanf(fp,"%d",&width);
fscanf(fp,"%d",&height);
fscanf(fp,"%d",&cara[0]);
fscanf(fp,"%d",&cara[1]);
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
fscanf(fp,"%d",&data[i][j]);
baseData[i][j] = data[i][j];
if(data[i][j] == 1){
block[goal][0]=j;
block[goal][1]=i;
goal++;
}
}
}
fclose(fp);
}

int Locate(HANDLE hOut, int x, int y)
{
    COORD dwPos;
    dwPos.X = (SHORT)x;
    dwPos.Y = (SHORT)y;

    if (SetConsoleCursorPosition(hOut, dwPos) == 0)
        return -1;
    else
        return 0;
}

0 件のコメント:

コメントを投稿