Java基础入门教程,程序员带你回味童年,一起用C语言做一个

node *next;

};

/*

*队列

*/

class linkqueue//定义队列类

{

private://定义私有数据成员

node *front;

int count;

public://定义公有数据成员

linkqueue();

~linkqueue();

void insert(int item[]);//定义公有成员函数

void out(int item[]);

void clearqueue(void);

int getcount();

};

linkqueue::linkqueue()//定义相同类名的派生类

{

front = new node;//将定义的变量赋值给队头

front->next = NULL;//队头指向空节点

count = 0;

}

linkqueue::~linkqueue()

{

clearqueue();

count = 0;

}

void linkqueue::out(int item[])//出队列

{

node *searchp;

searchp = front->next;//将队头元素赋值给指针

for (int i = 0; i<(roomsize + 2)*(roomsize + 2); i++)//使i的值小于正方形滴边长

	item[i] = searchp->data[i];

front->next = searchp->next;//队头接收searchp

delete searchp;

count--;

}

void linkqueue::insert(int item[])//进队

{

node *newnodep = new node, *searchp = front; 

while (searchp->next != NULL)//循环使searchp节点不为空

	searchp = searchp->next;

for (int i = 0; i<121; i++)

	newnodep->data[i] = item[i];

newnodep->next = searchp->next;

searchp->next = newnodep;

count++;

}

void linkqueue::clearqueue(void)//定义依据于linkequeue的派生类

{

if (front->next == NULL)//若头结点为空。则返回

	return;

while (front->next != NULL)//若队头结点不为空,则将头结点赋值给指针

{

	node *searchp;

	searchp = front->next;

	front->next = searchp->next;

	delete searchp;

}

count = 0;

}

int linkqueue::getcount()//定义依据于linkequeue的派生类用来返回count滴值

{

return count;

}

/*

*栈

*/

class seqstack//定义类

{

public://设定公有成员函数

seqstack();

~seqstack();

void clearseqstack(void);

void push(int item[], int &line, int &lie);//括号内为只接收变量滴地址

void pop(int item[], int &line, int &lie);

private:

node *top;

};

seqstack::seqstack()

{

top = new node;

top->next = NULL;

}

seqstack::~seqstack()

{}

void seqstack::push(int item[], int &line, int &lie)//定义以seqtack类滴push(推)的类,用来记录推动箱子的地址和位置

{

node *newnodep, *searchp = top;

newnodep = new node;

for (int i = 0; i<(roomsize + 2)*(roomsize + 2); i++)

	newnodep->data[i] = item[i];

newnodep->positionH = line;//将地址进行返回

newnodep->positionL = lie;//将地址进行返回

newnodep->next = searchp->next;

searchp->next = newnodep;

}

void seqstack::pop(int item[], int &line, int &lie)

{

node *newnodep, *searchp = top;

if (searchp->next != NULL)

{

	newnodep = top->next;

	for (int i = 0; i<(roomsize + 2)*(roomsize + 2); i++)

		item[i] = newnodep->data[i];

	line = newnodep->positionH;

	lie = newnodep->positionL;

	top->next = newnodep->next;

	delete newnodep;

}

}

void seqstack::clearseqstack(void)

{

if (top->next == NULL)

	return;

while (top->next != NULL)

{

	node *searchp;

	searchp = top->next;

	top->next = searchp->next;

	delete searchp;

}

}

//对象:箱子

class box//记录人位置滴函数

{

int positionh;//人的位置纵坐标

int positionl;//人的位置横坐标

int flag;//标志位,记录人在目标位置上

int gate;//这个变量是记录关数

int count;//这个变量是记录步数

seqstack st;

linkqueue linkqu;

public:

box();

void begin();//开始界面

void choose_gate();//选关提示

void choose();//游戏时c选项的提示

void replay();//重玩

void playing();//玩游戏时界面

void display();//显示地图

void left();//左方向

void right();//右方向

void down();//下方向

void up();//上方向

void test_flag();//过关提示

void record();//这段函数为排行榜

void travers();

void returnpush();

void returninseart();

//void random();//这段函数为随机生成室内布局,暂时没有提供

};

box::box()

{

positionh = 0;

positionl = 0;

flag = 0;

count = 0;

gate = 0;

}

void box::begin()

{

system("color 17");



/*******************************输出游戏主界面***********************************/

cout << "   ╭────────────-─────────────────-──╮" << endl <<//1                                                                       "<<endl<<//1

	"  │                                                                  │" << endl <<//2

	"  │              ★☆★       推箱子游戏        ★☆★               │" << endl <<//3

	"  │★☆★★☆★★☆★★☆★★☆★★☆★★☆★★☆★★☆★★☆★★☆★│" << endl <<//4

	"  │                            游戏介绍                              │" << endl <<//5

	"  │                                                                  │" << endl <<//6

	"  │怎么玩这个游戏呢?我来介绍一下:这是小人人(♀)小星星就是箱子啦(★)│" << endl <<//7

	"  │你要把星星放在这个地方喔(○),等到有了㊣.你就赢咯!快来挑战吧!!   │" << endl <<//8

	"  │                                                                  │" << endl <<//9

	"  │                           操作指令                               │" << endl <<//10

	"  │                                                                  │" << endl <<//11

	"  │使用方向键控制哦!'Ctrl+z' 用来撤销,'c'用来选择 'Esc'退出游戏!  │" << endl <<//12

	"  │                                                                  │" << endl <<//13

	"  │                                                                  │" << endl <<//14

	"  ╰─────────────────────────────────╯" << endl; //15

choose_gate();//选择关数

cout << String << endl;

Sleep(1000);

system("cls");

linkqu.clearqueue();

st.clearseqstack();

playing();

}

void box::choose_gate()

{

//system("color 10");

int j, k;



	/*******************************输出游戏关卡选择界面***********************************/

cout << "              ★               ╭────╮            ★      " << endl

	<< "             ★★             │ 关卡选择 │          ★★      " << endl

	<< "            ★  ★            │ 1.first  │         ★  ★        " << endl

	<< "       ★★★    ★★★       │ 2.scend  │    ★★★    ★★★     " <<endl

	<< "        ★          ★        │ 3.third  │     ★          ★        " << endl

	<< "         ★        ★         │ 4.forth  │      ★        ★          " << endl

	<< "          ★  ★  ★          │★★★★  │       ★  ★  ★            " << endl

	<< "          ★★  ★★          │  ★★★★│       ★★  ★★         " << endl

	<< "          ★      ★          ╰─────╯       ★      ★         " << endl<<endl<<endl;

cout << "请选择关卡哟:";

cin >> gate;

do

{

	switch (gate)

	{

	case 1:

		for (j = 0; j<roomsize + 2; j++)//此处 j控制行,k控制列

		for (k = 0; k<roomsize + 2; k++)

			map[j][k] = map1[j][k];

		positionh = 7; positionl = 7;

		break;

	case 2:

		for (j = 0; j<roomsize + 2; j++)

		for (k = 0; k<roomsize + 2; k++)

			map[j][k] = map2[j][k];

		positionh = 2; positionl = 3;

		break;

	case 3:

		for (j = 0; j<roomsize + 2; j++)

		for (k = 0; k<roomsize + 2; k++)

			map[j][k] = map3[j][k];

		positionh =7, positionl = 5;

		break;

	case 4:

		for (j = 0; j<roomsize + 2; j++)

		for (k = 0; k<roomsize + 2; k++)

			map[j][k] = map4[j][k];

		positionh = 6, positionl = 5;

		break;

	default:

		cout << "输入错误啦^_^请重新输入哟@v@!";

		cin >> gate;

	}

} while (gate>4);

}

void box::choose()//选项

{

int choice;

cout << " ╭────────╮" << endl

	<< " │1. 重播         │" << endl

	<< " │2. 主界面       │" << endl

	<< " │3. 最好的记录   │" << endl

	<< " │4. 退出         │" << endl

	<< " ╰────────╯" << endl;

cin >> choice;

switch (choice)

{

case 1:

	system("cls");

	replay();

	break;

case 2:

	system("cls");

	begin();

	break;

case 3:

	record();

	system("cls");

	playing();

	break;

case 4:

	exit(0);

}

}

void box::replay()//将游戏步骤进行重播

{

int j, k;

count = 0;

flag = 0;

st.clearseqstack();

linkqu.clearqueue();

do

{

	switch (gate)

	{

	case 1:

		for (j = 0; j<roomsize + 2; j++)

		for (k = 0; k<roomsize + 2; k++)

			map[j][k] = map1[j][k];

		positionh = 7; positionl = 7;

		break;

	case 2:

		for (j = 0; j<roomsize + 2; j++)

		for (k = 0; k<roomsize + 2; k++)

			map[j][k] = map2[j][k];

		positionh = 2; positionl = 3;

		break;

	case 3:

		for (j = 0; j<roomsize + 2; j++)

		for (k = 0; k<roomsize + 2; k++)

			map[j][k] = map3[j][k];

		positionh = positionl = 4;

		break;

	case 4:

		for (j = 0; j<roomsize + 2; j++)

		for (k = 0; k<roomsize + 2; k++)

			map[j][k] = map4[j][k];

		positionh = 6, positionl = 5;

		break;

	

	}

} while (gate>4);

playing();

}

void box::playing()//Ascii码键盘键位:左为75 右为77 上为72 下为80

{

int choice, i, l, r, item[1000],j,k;

count = 0;

cout << "游戏开始";

while (1)

{

	display();

	switch (_getch())

	{

	case 72:

		returninseart();

		returnpush();

		up();

		count++;

		break;

	case 80:

		returninseart();

		returnpush();

		down();

		count++;

		break;

	case 75:

		returninseart();

		returnpush();

		left();

		count++;

		break;

	case 77:

		returninseart();

		returnpush();

		right();

		count++;

		break;

	//case 'x':

	case 26:

		i = 0;

		system("cls");

		st.pop(item, l, r);

		for (j = 0; j<roomsize + 2; j++)

		for (k = 0; k<roomsize + 2; k++)

		{

			map[j][k] = item[i];

			i++;

		}

		positionl = r; positionh = l;

		display();

		break;

	case 'c':

	case 'C':

		choose();

		break;

	//case 'q':

	case 27:

		cout << " ╭──────────────╮" << endl

			<< " │请给你选择喔:              │" << endl

			<< " │   1. 我要返回主界面        │" << endl

			<< " │   2. 我不玩了退出游戏      │" << endl

			<< " ╰──────────────╯" << endl;

		cin >> choice;

		switch (choice)

		{

		case 1:

			count = 0;

			Sleep(500);

			system("cls");

			begin();

			break;

		case 2:

			exit(0);

		}

	default:

		break;

	}

	system("cls");

}

}

void box::display()

{

cout << endl << endl << endl << endl << endl << endl;

for (int i = 1; i <= roomsize; i++)

{

	cout << setw(30);

	for (int j = 1; j <= roomsize; j++)

	{

		if (map[i][j] == 0) cout << "  ";

		if (map[i][j] == 1) cout << "■";//墙

		if (map[i][j] == 2) cout << "○";//目标位置

		if (map[i][j] == 3) cout << "★";//箱子

		if (map[i][j] == 4) cout << "♀";//人

		if (map[i][j] == 5) cout << "㊣";//箱子在目标位置上

	}

	cout << endl;

}

cout << endl << endl;

cout << "撤销(Ctrl+z)★★★" << "选择(c)★★★" << "游戏步数:" << count << endl;

}

void box::left()//向左函数

{

if (map[positionh][positionl - 1] == 0)

{

	map[positionh][positionl - 1] = 4;

	if (flag == 1)

	{

		map[positionh][positionl] = 2;  flag = 0;

	}

	else

		map[positionh][positionl] = 0;

	positionl--;

}

else if (map[positionh][positionl - 1] == 2)//人要到目标位置上

{

	map[positionh][positionl - 1] = 4;

	if (flag == 1)

		map[positionh][positionl] = 2;//恢复目标位置

	else

	{

		map[positionh][positionl] = 0;//恢复原来的状态

		flag = 1;//标志位,记录人在目标位置上

	}

	positionl--;

}

else if (map[positionh][positionl - 1] == 3 && map[positionh][positionl - 2] == 0)//将箱子推到空白位置上

{

	map[positionh][positionl - 2] = 3;

	map[positionh][positionl - 1] = 4;

	if (flag == 1)

	{

		map[positionh][positionl] = 2; flag = 0;

	}

	else

		map[positionh][positionl] = 0;

	positionl--;

}

else if (map[positionh][positionl - 1] == 5 && map[positionh][positionl - 2] != 1)//要将箱子从目标位置上推出

{

	if (map[positionh][positionl - 2] == 2)//下一个位置还是目标位置

	{

		map[positionh][positionl - 2] = 5;

		map[positionh][positionl - 1] = 4;

		if (flag == 1)

			map[positionh][positionl] = 2;

		else

		{

			map[positionh][positionl] = 0; flag = 1;

		}

	}

	else if (map[positionh][positionl - 2] == 0)//下一个位置是空白

	{

		map[positionh][positionl - 2] = 3;

		map[positionh][positionl - 1] = 4;

		if (flag == 1)

			map[positionh][positionl] = 2;

		else

		{

			map[positionh][positionl] = 0; flag = 1;

		}

	}

	positionl--;

}

else if (map[positionh][positionl - 1] == 3 && map[positionh][positionl - 2] == 2)//要将箱子推到目标位置上

{

	map[positionh][positionl - 2] = 5;//箱子在目标位置上

	map[positionh][positionl - 1] = 4;

	if (flag == 1)//人在目标位置上

	{

		map[positionh][positionl] = 2; flag = 0;

	}

	else //人不在目标位置上

		map[positionh][positionl] = 0;

	positionl--;

}

else count--;//抵消人不动的情况

test_flag();

}

void box::right()//向右函数

{

if (map[positionh][positionl + 1] == 0)

{

	map[positionh][positionl + 1] = 4;

	if (flag == 1)

	{

		map[positionh][positionl] = 2;  flag = 0;

	}

	else

		map[positionh][positionl] = 0;

	positionl++;

}

else if (map[positionh][positionl + 1] == 2)//人要到目标位置上

{

	map[positionh][positionl + 1] = 4;

	if (flag == 1)

		map[positionh][positionl] = 2;//恢复目标位置

	else

	{

		map[positionh][positionl] = 0;//恢复原来的状态

		flag = 1;//标志位,记录人在目标位置上

	}

	positionl++;

}

else if (map[positionh][positionl + 1] == 3 && map[positionh][positionl + 2] == 0)//将箱子推到空白位置上

{

	map[positionh][positionl + 2] = 3;

	map[positionh][positionl + 1] = 4;

	if (flag == 1)

	{

		map[positionh][positionl] = 2; flag = 0;

	}

	else

		map[positionh][positionl] = 0;

	positionl++;

}

else if (map[positionh][positionl + 1] == 5 && map[positionh][positionl + 2] != 1)//要将箱子从目标位置上推出

{

	if (map[positionh][positionl + 2] == 2)//下一个位置还是目标位置

	{

		map[positionh][positionl + 2] = 5;

		map[positionh][positionl + 1] = 4;

		if (flag == 1)

			map[positionh][positionl] = 2;

		else

		{

			map[positionh][positionl] = 0; flag = 1;

		}

	}

	else if (map[positionh][positionl + 2] == 0)//下一个位置是空白

	{

		map[positionh][positionl + 2] = 3;

		map[positionh][positionl + 1] = 4;

		if (flag == 1)

			map[positionh][positionl] = 2;

		else

		{

			map[positionh][positionl] = 0; flag = 1;

		}

	}

	positionl++;

}

else if (map[positionh][positionl + 1] == 3 && map[positionh][positionl + 2] == 2)//要将箱子推到目标位置上

{

	map[positionh][positionl + 2] = 5;//箱子在目标位置上

	map[positionh][positionl + 1] = 4;

	if (flag == 1)//人在目标位置上

	{

		map[positionh][positionl] = 2; flag = 0;

	}

	else //人不在目标位置上

		map[positionh][positionl] = 0;

	positionl++;

}

else count--;//抵消人不动的情况

test_flag();

}

void box::down()//向下函数

{

if (map[positionh + 1][positionl] == 0)

{

	map[positionh + 1][positionl] = 4;

	if (flag == 1)

	{

		map[positionh][positionl] = 2; flag = 0;

	}

	else

		map[positionh][positionl] = 0;

	positionh++;

}

else if (map[positionh + 1][positionl] == 2)//人要到目标位置上

{

	map[positionh + 1][positionl] = 4;

	if (flag == 1)

		map[positionh][positionl] = 2;//恢复目标位置

	else

	{

		map[positionh][positionl] = 0;//恢复原来的状态

		flag = 1;//标志位,记录人在目标位置上

	}

	positionh++;

}

else if (map[positionh + 1][positionl] == 3 && map[positionh + 2][positionl] == 0)//将箱子推到空白位置上

{

	map[positionh + 2][positionl] = 3;

	map[positionh + 1][positionl] = 4;

	if (flag == 1)

	{

		map[positionh][positionl] = 2; flag = 0;

	}

	else

		map[positionh][positionl] = 0;

	positionh++;

}

else if (map[positionh + 1][positionl] == 5 && map[positionh + 2][positionl] != 1)//要将箱子从目标位置上推出

{

	if (map[positionh + 2][positionl] == 2)//下一个位置还是目标位置

	{

		map[positionh + 2][positionl] = 5;

		map[positionh + 1][positionl] = 4;

		if (flag == 1)

			map[positionh][positionl] = 2;

		else

		{

			map[positionh][positionl] = 0; flag = 1;

		}

	}

	else if (map[positionh + 2][positionl] == 0)//下一个位置是空白

	{

		map[positionh + 2][positionl] = 3;

		map[positionh + 1][positionl] = 4;

		if (flag == 1)

			map[positionh][positionl] = 2;

		else

		{

			map[positionh][positionl] = 0; flag = 1;

		}

	}

	positionh++;

}

else if (map[positionh + 1][positionl] == 3 && map[positionh + 2][positionl] == 2)//要将箱子推到目标位置上

{

	map[positionh + 2][positionl] = 5;//箱子在目标位置上

	map[positionh + 1][positionl] = 4;

	if (flag == 1)//人在目标位置上

	{

		map[positionh][positionl] = 2; flag = 0;

	}

	else //人不在目标位置上

		map[positionh][positionl] = 0;

	positionh++;

}

else count--;//抵消人不动的情况

test_flag();

}

void box::up()//向上函数

{

if (map[positionh - 1][positionl] == 0)

{

	map[positionh - 1][positionl] = 4;

	if (flag == 1)

	{

		map[positionh][positionl] = 2; flag = 0;

	}

	else

		map[positionh][positionl] = 0;

	positionh--;

}

else if (map[positionh - 1][positionl] == 2)//人要到目标位置上

{

	map[positionh - 1][positionl] = 4;

	if (flag == 1)

		map[positionh][positionl] = 2;//恢复目标位置

	else

	{

		map[positionh][positionl] = 0;//恢复原来的状态

		flag = 1;//标志位,记录人在目标位置上

	}

	positionh--;

}

else if (map[positionh - 1][positionl] == 3 && map[positionh - 2][positionl] == 0)//将箱子推到空白位置上

{
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值