推箱子的小游戏

本文介绍了一个使用C语言在Linux环境下开发的推箱子游戏,游戏包含多个关卡,利用ASCII字符绘制游戏界面,通过键盘输入控制人物移动,支持推拉箱子的操作。文章详细展示了游戏的源代码,包括游戏菜单、关卡选择、游戏规则说明等功能。

系统:linux
语言:C
源码如下

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

//whether to allow to pull box
#define PULL_BOX 1

//whether to move only one step at a time
#define ONE_STEP 0

struct box{
int *level;
int row;
int col;
int num;
};

int p_row,p_col; //person location
int perfect_box;

/*ASCII detects the input value,up(w) down(s) left(a) right(d) return "1 2 3 4"
 *pulls the box return "5678"
 *q returns -1, u returns -2,n returns -3,
 *and the others returns -99
 */
int scanf_dire(){
char a;
a=getchar();
for(;a==10;){
	a=getchar();
	}
switch(a){
	case 113:
		return -1;
	case 117:
		return -2;
	case 110:
		return -3;
	case 119:
		return 1;
	case 97:
		return 3;
	case 115:
		return 2;
	case 100:
		return 4;
#if PULL_BOX
	case 105:
		return 5;
	case 107:
		return 6;
	case 106:
		return 7;
	case 108:
		return 8;
#endif
}
if(a==27 && (a=getchar())==91){
	a=getchar();
	switch(a){
	case 65:
		return 1;
	case 66: 
		return 2;
	case 67: 
		return 4;
	case 68: 
		return 3;
	default:
		break;
		}
	}
return -99;
}

//get a number
int scanf_number(){
int num;
	for(;!scanf("%d",&num);){
	char ch;
	while((ch = getchar()) != '\n' && ch != EOF);
	printf("please input right number:");
	}
return num;
}

/*print level information(including level,steps,...), count the number of perfect boxes,
 *locate person
 */
void printf_map(struct box* level_tmp,int level,int steps){
int i,j,k;
printf("\033[2J");
printf("\033[H");
printf("---------------------------------------\n");
printf("level:%d",level);
if(steps>0){
	printf("  steps:%d",steps);
	}
printf("\n---------------------------------------\n");
perfect_box=0;
for(i=0;i<level_tmp->row;i++){
	for(j=0;j<level_tmp->col;j++){
		k=*(level_tmp->level+i*level_tmp->col+j);
		switch(k){
			case -1:
				printf("▓");//wall
				break;
			case 1:
				printf("☺");//person
				p_row=i;
				p_col=j;
				break;
			case 2:
				printf("●");//box
				break;
			case 3:
				printf("◎");//box's aim
				break;
			case 4:
				printf("☺");//person on box's aim
				p_row=i;
				p_col=j;
				break;
			case 5:
				printf("◉");//perfect box
				perfect_box++;
				break;
			default:
				printf(" ");//none
				break;
			}
		}
	printf("\n");
	}
}

//pull box
int p_move_oppo(struct box* level_tmp,int option){
int k,k_d,k_dd,offset,offset_d;
switch(option){
	case 5:
		offset=(p_row-1)*level_tmp->col+p_col;
		offset_d=(p_row+1)*level_tmp->col+p_col;
		break;
	case 6:
		offset=(p_row+1)*level_tmp->col+p_col;
		offset_d=(p_row-1)*level_tmp->col+p_col;
		break;
	case 7:
		offset=p_row*level_tmp->col+p_col-1;
		offset_d=p_row*level_tmp->col+p_col+1;
		break;
	case 8:
		offset=p_row*level_tmp->col+p_col+1;
		offset_d=p_row*level_tmp->col+p_col-1;
		break;
	default:
		break;
	}
k=*(level_tmp->level+(p_row)*level_tmp->col+p_col);
k_d=*(level_tmp->level+offset);
k_dd=*(level_tmp->level+offset_d);
switch(k_d){
	case 0:
	case 3:
		(*(level_tmp->level+(p_row)*level_tmp->col+p_col))--;
		(*(level_tmp->level+offset))++;
		switch(k_dd){
			case 2:
			case 5:
				*(level_tmp->level+offset_d)-=2;
				*(level_tmp->level+(p_row)*level_tmp->col+p_col)+=2;
				break;
			default:
				break;
			}
		return 1;
		break;
	default:
		return 0;
		break;
	}
}

//push box
int p_move(struct box* level_tmp,int option){
int k,k_d,k_dd,offset,offset_d;
switch(option){
	case 1:
		offset=(p_row-1)*level_tmp->col+p_col;
		offset_d=(p_row-2)*level_tmp->col+p_col;
		break;
	case 2:
		offset=(p_row+1)*level_tmp->col+p_col;
		offset_d=(p_row+2)*level_tmp->col+p_col;
		break;
	case 3:
		offset=p_row*level_tmp->col+p_col-1;
		offset_d=p_row*level_tmp->col+p_col-2;
		break;
	case 4:
		offset=p_row*level_tmp->col+p_col+1;
		offset_d=p_row*level_tmp->col+p_col+2;
		break;
	default:
		break;
	}
k=*(level_tmp->level+(p_row)*level_tmp->col+p_col);
k_d=*(level_tmp->level+offset);
k_dd=*(level_tmp->level+offset_d);
switch(k_d){
	case 2:
	case 5:
		switch(k_dd){
			case 0:
			case 3:
				*(level_tmp->level+offset_d)+=2;
				(*(level_tmp->level+offset))-=2;
				break;
			default:
				break;
			}
		if(k_dd!=0&&k_dd!=3){
			break;
			}
	case 0:
	case 3:
		(*(level_tmp->level+(p_row)*level_tmp->col+p_col))--;
		(*(level_tmp->level+offset))++;
		return 1;
		break;
	default:
		return 0;
		break;
	}
}

//printf menu
void printf_menu(){
printf("\033[2J");
printf("\033[H");
printf("************************************************\n\n");
printf("  1->start game\n");
printf("  2->reading instruction\n");
printf("  99->exit game\n");
printf("\n************************************************\n");
}

//printf caption
void printf_cap(){
printf("\033[2J");
printf("\033[H");
printf("************************************************\n");
printf("1.You should push boxes to right destination\n");
printf("2.The move regulations:\n");
printf("  use    w    or   ↑     to push boxes \n");
printf("       a s d     ← ↓ →    \n\n");
printf("         i    to pull boxes\n");
printf("       j k l\n");
printf("     (The reason is that I didn't set back keys!\n");
printf("      you can close this function at start of\n");
printf("      the source code.)\n\n");
printf("     q:return to main menu\n");
printf("     u:restart this level\n");
printf("     n:go to the next level\n");
printf("\n3.When choosing [y/n],key 'y' for [y],others for [n]\n");
printf("\n4.I hope you have a good time!\n");
printf("************************************************\n");
printf("press any key to return main menu!\n");
getchar();
getchar();
}

int main(){
int option,op_menu,op_menu_2,start_level,level_over;
struct box box_level;
struct box* level_tmp;
int level_1[11][19]={
{ 0, 0, 0, 0,-1,-1,-1,-1,-1,},
{ 0, 0, 0, 0,-1, 0, 0, 0,-1,},
{ 0, 0, 0, 0,-1, 2, 0, 0,-1,},
{ 0, 0,-1,-1,-1, 0, 0, 2,-1,-1,},
{ 0, 0,-1, 0, 0, 2, 0, 2, 0,-1,},
{-1,-1,-1, 0,-1, 0,-1,-1, 0,-1, 0, 0, 0,-1,-1,-1,-1,-1,-1,},
{-1, 0, 0, 0,-1, 0,-1,-1, 0,-1,-1,-1,-1,-1, 0, 0, 3, 3,-1,},
{-1, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3,-1,},
{-1,-1,-1,-1,-1, 0,-1,-1,-1, 0,-1, 1,-1,-1, 0, 0, 3, 3,-1,},
{ 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
{ 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,},
};
int level_2[10][14]={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
{-1, 3, 3, 0, 0,-1, 0, 0, 0, 0, 0,-1,-1,-1,},
{-1, 3, 3, 0, 0,-1, 0, 2, 0, 0, 2, 0, 0,-1,},
{-1, 3, 3, 0, 0,-1, 2,-1,-1,-1,-1, 0, 0,-1,},
{-1, 3, 3, 0, 0, 0, 0, 1, 0,-1,-1, 0, 0,-1,},
{-1, 3, 3, 0, 0,-1, 0,-1, 0, 0, 2, 0,-1,-1,},
{-1,-1,-1,-1,-1,-1, 0,-1,-1, 2, 0, 2, 0,-1,},
{ 0, 0,-1, 0, 2, 0, 0, 2, 0, 2, 0, 2, 0,-1,},
{ 0, 0,-1, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,},
{ 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
};
int level_3[10][17]={
{ 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 1,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 2,-1, 2, 0,-1,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 2, 0, 0, 2,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1,-1, 2, 0, 2, 0,-1,},
{-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 2, 0,-1, 0,-1,-1,-1,},
{-1, 3, 3, 3, 3, 0, 0,-1,-1, 0, 2, 0, 0, 2, 0, 0,-1,},
{-1,-1, 3, 3, 3, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0,-1,},
{-1, 3, 3, 3, 3, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
{-1,-1,-1,-1,-1,-1,-1,-1,},
};
int level_4[14][19]={
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 3, 3, 3, 3,-1,},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 3, 3, 3, 3,-1,},
{-1, 0, 0, 0, 0,-1, 0, 0, 2, 0, 2, 0, 0, 0, 3, 3, 3, 3,-1,},
{-1, 0, 2, 2, 2,-1, 2, 0, 0, 2, 0,-1, 0, 0, 3, 3, 3, 3,-1,},
{-1, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0,-1, 0, 0, 3, 3, 3, 3,-1,},
{-1, 0, 2, 2, 0,-1, 2, 0, 2, 0, 2,-1,-1,-1,-1,-1,-1,-1,-1,},
{-1, 0, 0, 2, 0,-1, 0, 0, 0, 0, 0,-1,},
{-1,-1, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
{-1, 0, 0, 0, 0,-1, 0, 0, 0, 0,-1,-1,},
{-1, 0, 0, 0, 0, 0, 2, 0, 0, 0,-1,-1,},
{-1, 0, 0, 2, 2,-1, 2, 2, 0, 0, 1,-1,},
{-1, 0, 0, 0, 0,-1, 0, 0, 0, 0,-1,-1,},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
};
int level_5[13][17]={
{ 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0,-1,-1,-1,-1,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1, 0,-1, 2,-1,-1, 0, 0,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 2, 0,-1,},
{-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1,-1, 0, 0, 0,-1,},
{-1, 3, 3, 3, 3, 0, 0,-1,-1, 0, 2, 0, 0, 2,-1,-1,-1,},
{-1, 3, 3, 3, 3, 0, 0, 0, 0, 2, 0, 2, 2, 0,-1,-1,},
{-1, 3, 3, 3, 3, 0, 0,-1,-1, 2, 0, 0, 2, 0, 1,-1,},
{-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 2, 0, 0,-1,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 2, 0, 2, 0, 0,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1, 0,-1,-1, 0,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,},
};
int level_6[11][12]={
{-1,-1,-1,-1,-1,-1, 0, 0,-1,-1,-1,},
{-1, 3, 3, 0, 0,-1, 0,-1,-1, 1,-1,-1,},
{-1, 3, 3, 0, 0,-1,-1,-1, 0, 0, 0,-1,},
{-1, 3, 3, 0, 0, 0, 0, 0, 2, 2, 0,-1,},
{-1, 3, 3, 0, 0,-1, 0,-1, 0, 2, 0,-1,},
{-1, 3, 3,-1,-1,-1, 0,-1, 0, 2, 0,-1,},
{-1,-1,-1,-1, 0, 2, 0,-1, 2, 0, 0,-1,},
{ 0, 0, 0,-1, 0, 0, 2,-1, 0, 2, 0,-1,},
{ 0, 0, 0,-1, 0, 2, 0, 0, 2, 0, 0,-1,},
{ 0, 0, 0,-1, 0, 0,-1,-1, 0, 0, 0,-1,},
{ 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
};
int level_7[12][13]={
{ 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,},
{ 0,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1,},
{-1,-1, 0,-1, 0, 1,-1,-1, 0, 2, 2, 0,-1,},
{-1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,-1,},
{-1, 0, 0, 2, 0, 0,-1,-1,-1, 0, 0, 0,-1,},
{-1,-1,-1, 0,-1,-1,-1,-1,-1, 2,-1,-1,-1,},
{-1, 0, 2, 0, 0,-1,-1,-1, 0, 3, 3,-1,},
{-1, 0, 2, 0, 2, 0, 2, 0, 3, 3, 3,-1,},
{-1, 0, 0, 0, 0,-1,-1,-1, 3, 3, 3,-1,},
{-1, 0, 2, 2, 0,-1, 0,-1, 3, 3, 3,-1,},
{-1, 0, 0,-1,-1,-1, 0,-1,-1,-1,-1,-1,},
{-1,-1,-1,-1,},
};
int level_8[16][16]={
{ 0, 0,-1,-1,-1,-1,},
{ 0, 0,-1, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
{ 0, 0,-1, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 0,-1,},
{ 0, 0,-1, 0, 2,-1, 0, 2, 0,-1, 0, 0, 2, 0, 0,-1,},
{ 0, 0,-1, 0, 0, 2, 0, 2, 0, 0,-1, 0, 0, 0, 0,-1,},
{-1,-1,-1, 0, 2,-1, 0,-1, 0, 0,-1,-1,-1,-1, 0,-1,},
{-1, 1,-1, 2, 0, 2, 0, 2, 0, 0,-1,-1, 0, 0, 0,-1,},
{-1, 0, 0, 0, 0, 2, 0,-1, 2,-1, 0, 0, 0,-1, 0,-1,},
{-1, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0,-1,},
{-1,-1,-1,-1,-1, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
{ 0, 0,-1, 0, 0, 0, 0, 0, 0,-1,},
{ 0, 0,-1, 0, 0, 0, 0, 0, 0,-1,},
{ 0, 0,-1, 3, 3, 3, 3, 3, 3,-1,},
{ 0, 0,-1, 3, 3, 3, 3, 3, 3,-1,},
{ 0, 0,-1, 3, 3, 3, 3, 3, 3,-1,},
{ 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,},
};
int level_9[14][17]={
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 3, 3, 3,-1,},
{ 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1, 0, 0, 3, 3, 3,-1,},
{ 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 3, 0, 3,-1,},
{ 0, 0, 0, 0, 0, 0,-1, 0, 0,-1,-1, 0, 0, 3, 3, 3,-1,},
{ 0, 0, 0, 0, 0, 0,-1,-1, 0,-1,-1, 0, 0, 3, 3, 3,-1,},
{ 0, 0, 0, 0, 0,-1,-1,-1, 0,-1,-1,-1,-1,-1,-1,-1,-1,},
{ 0, 0, 0, 0, 0,-1, 0, 2, 2, 2, 0,-1,-1,},
{ 0,-1,-1,-1,-1,-1, 0, 0, 2, 0, 2, 0,-1,-1,-1,-1,-1,},
{-1,-1, 0, 0, 0,-1, 2, 0, 2, 0, 0, 0,-1, 0, 0, 0,-1,},
{-1, 1, 0, 2, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0,-1,},
{-1,-1,-1,-1,-1,-1, 0, 2, 2, 0, 2, 0,-1,-1,-1,-1,-1,},
{ 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0,-1,},
{ 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,},
};
int level_10[16][19]={
{ 0,-1,-1,-1, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
{-1,-1, 1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0,-1,},
{-1, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 2, 0, 2, 0, 3, 3, 3,-1,},
{-1, 0, 0, 2, 2, 2,-1, 0, 0, 0, 0, 2, 0, 0,-1, 3, 3, 3,-1,},
{-1, 0, 2, 0, 0, 0,-1, 0, 2, 2, 0, 2, 2, 0,-1, 3, 3, 3,-1,},
{-1,-1,-1, 0, 0, 0,-1, 0, 0, 2, 0, 0, 0, 0,-1, 3, 3, 3,-1,},
{-1, 0, 0, 0, 0, 0,-1, 0, 2, 0, 2, 0, 2, 0,-1, 3, 3, 3,-1,},
{-1, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1, 0,-1,-1,-1, 3, 3, 3,-1,},
{-1,-1, 0,-1, 0, 0,-1, 0, 0, 2, 0, 2, 0, 0,-1, 3, 3, 3,-1,},
{-1, 0, 0,-1,-1, 0,-1, 0, 2, 2, 0, 2, 0, 2,-1,-1, 3, 3,-1,},
{-1, 0, 3, 3,-1, 0,-1, 0, 0, 2, 0, 0, 0, 0, 0, 0,-1, 3,-1,},
{-1, 0, 3, 3,-1, 0,-1, 0, 2, 2, 2, 0, 2, 2, 2, 0,-1, 3,-1,},
{-1,-1,-1,-1,-1, 0,-1, 0, 0, 0, 0, 0, 0, 0,-1, 0,-1, 3,-1,},
{ 0, 0, 0, 0,-1, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1, 3,-1,},
{ 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 3,-1,},
{ 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},
};
for(;;){
printf_menu();
op_menu=scanf_number();
switch(op_menu){
	case 2:
		printf_cap();
		break;
	case 1:
	printf("choose level[1-10]:");
	op_menu_2=scanf_number();
	for(;op_menu_2<1 || op_menu_2>10;){
		printf("please choose rihgt level![1-10]:");
		op_menu_2=scanf_number();
		}
for(start_level=1;start_level==1;){
	switch(op_menu_2){
	case 1:
box_level.level=&level_1[0][0];
box_level.row=11;
box_level.col=19;
box_level.num=6;
break;

	case 2:
box_level.level=&level_2[0][0];
box_level.row=10;
box_level.col=14;
box_level.num=10;
break;

	case 3:
box_level.level=&level_3[0][0];
box_level.row=10;
box_level.col=17;
box_level.num=11;
break;

	case 4:
box_level.level=&level_4[0][0];
box_level.row=14;
box_level.col=19;
box_level.num=20;
break;

	case 5:
box_level.level=&level_5[0][0];
box_level.row=13;
box_level.col=17;
box_level.num=12;
break;

	case 6:
box_level.level=&level_6[0][0];
box_level.row=11;
box_level.col=12;
box_level.num=10;
break;

	case 7:
box_level.level=&level_7[0][0];
box_level.row=12;
box_level.col=13;
box_level.num=11;
break;

	case 8:
box_level.level=&level_8[0][0];
box_level.row=16;
box_level.col=16;
box_level.num=18;
break;

	case 9:
box_level.level=&level_9[0][0];
box_level.row=14;
box_level.col=17;
box_level.num=14;
break;

	case 10:
box_level.level=&level_10[0][0];
box_level.row=16;
box_level.col=19;
box_level.num=32;
break;

	default:
break;
	}//the end of switch(op_menu_2)
int level_999[box_level.row][box_level.col];
int i,j; 
for(i=0;i<box_level.row;i++){
	for(j=0;j<box_level.col;j++){
		level_999[i][j]=*(box_level.level+i*box_level.col+j);
		}
	}//copy the level_* to level_999
box_level.level=&level_999[0][0];
level_tmp=&box_level;
printf_map(level_tmp,op_menu_2,0);
for(level_over=0;perfect_box<level_tmp->num && level_over!=-1;){
	option=scanf_dire();
#if ONE_STEP
	char ch;
	while((ch = getchar()) != 10 && ch != EOF);//move one step at a time
#endif
	switch(option){
		case 1:
		case 2:
		case 3:
		case 4:
			if(p_move(level_tmp,option)){
				level_over++;
				}
			break;
		case 5:
		case 6:
		case 7:
		case 8:
			if(p_move_oppo(level_tmp,option)){
				level_over++;
				}
			break;
		case -1:
			printf("---------------------------------------\n");
			printf("Do you want to return to main menu?[y/n]\n");
			getchar();
			if(getchar()=='y'){
				start_level=-2;
				level_over=-1;
				}
			break;
		case -2:
			printf("---------------------------------------\n");
			printf("Do you want to restart this level?[y/n]\n");
			getchar();
			if(getchar()=='y'){
				level_over=-1;
				}
			break;
		case -3:
			if(op_menu_2<10){
			printf("---------------------------------------\n");
			printf("Do you want to start next level?[y/n]\n");
			getchar();
			if(getchar()=='y'){
				op_menu_2++;
				level_over=-1;
				}
			}
			else{
			printf("---------------------------------------\n");
			printf("This is the last level!\n");
			printf("press any key to continue!\n");
			getchar();
			getchar();
			}
			break;
		default:
			break;
		}
	if(level_over!=-1){
		printf_map(level_tmp,op_menu_2,level_over);
		}
	}
	if(perfect_box==level_tmp->num && op_menu_2<=10){
		if(op_menu_2==10){
			printf("You win!congratulation!!!\n");
			start_level=-1;
			}
		else{
			printf("---------------------------------------\n");
			printf("Do you want to start next level?[y/n]\n");
			getchar();
			if(getchar()=='y'){
				op_menu_2++;
				}
			else{
				start_level=-1;
				}
			}
		}
	}//the end of for(;start_level;)

	break; //the end of switch(op_menu) -> case 1
	case 99:
	printf("EXIT GAME!\n");
	return 0;//the only way to exit the game
	break;

	default:
	break;
	}//the end of switch(op_menu)
	}//the end of for(;;)
}
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值