项目 : 用函数实现反弹球消砖块

目录

  • 一、项目描述和最终的成果展示
  • 二、封装后的弹跳小球
  • 三、显示移动挡板
  • 四、反弹小球
  • 五、添加砖块并实现打砖块操作

一、项目描述和最终的成果展示

这是在上一次弹跳小项目上进行了一系列的优化和封装。项目: 弹跳的小球
上次没有用函数进行的封装。这次在上次的基础上进行封装和一些功能的优化。
最终效果图如下:

二、封装后的弹跳小球

代码如下:

#include
#include
#include
#include

//全局变量
int high,width; //游戏画面大小
int ball_x,ball_y;//小球的坐标
int ball_vx,ball_vy;//小球的速度

void gotoxy(int x,int y)//将光标移动到(x,y)位置
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
}

void startup()//数据的初始化
{
	high =  15;
	width = 20;
	ball_x = 0;
	ball_y = width/2;
	ball_vx = 1;
	ball_vy = 1;
}

void show()//显示画面
{
	gotoxy(0,0);//光标移动到原点位置,以下重画清屏
	int i,j;
	for(i=0;i<=high;i++)
	{
		for(j=0;j<=width;j++)
		{
			if( ( i == ball_x) && ( j == ball_y ) )
                printf("O");//输出小球
			else if( j == width)
				printf("+");//输出右边框
			else if( i == high)
				printf("-");//输出下边框
			else
				printf(" ");//输出空格
		}
		printf("\n");
	}
}

void updateWithoutInput()//与用户输入无关的更新
{
	ball_x = ball_x + ball_vx;
	ball_y = ball_y + ball_vy;

	if( (ball_x == 0 ) || (ball_x == high-1 ))
		ball_vx = -ball_vx;
	if( (ball_y == 0 ) || (ball_y == width-1 ))
		ball_vy = -ball_vy;

	Sleep(50);
}

void updateWithInput()//与用户输入有关的更新
{

}
int main(void)
{
	startup();//数据的初始化
	while(1)
	{
		show();//显示画面
		updateWithoutInput();//与用户输入无关的更新
		updateWithInput();//与用户输入有关的更新
	}
	return 0;
}

效果图如下:
项目 : 用函数实现反弹球消砖块_第1张图片

三、显示移动挡板

代码如下:

#include
#include
#include
#include

//全局变量
int high,width; //游戏画面大小
int ball_x,ball_y;//小球的坐标
int ball_vx,ball_vy;//小球的速度
int position_x,position_y;//挡板的中心坐标
int ridus;//挡板的半径大小
int left,right;//挡板的左右位置

void gotoxy(int x,int y)//将光标移动到(x,y)位置
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
}

void startup()//数据的初始化
{
	high =  15;
	width = 20;
	ball_x = 0;
	ball_y = width/2;
	ball_vx = 1;
	ball_vy = 1;
	ridus = 5;
	position_x = high;
	position_y = width/2;
	left = position_y -ridus;
	right = position_y + ridus;
}

void show()//显示画面
{
	gotoxy(0,0);//光标移动到原点位置,以下重画清屏
	int i,j;
	for(i=0;i<=high+1;i++)
	{
		for(j=0;j<=width;j++)
		{
			if( ( i == ball_x) && ( j == ball_y ) )
                printf("O");//输出小球
			else if( j == width)
				printf("+");//输出右边框
			else if( i == high+1)
				printf("-");//输出下边框
			else if ( (i==high)&&(j>=left)&&(j<=right))
				printf("*");
			else
				printf(" ");//输出空格
		}
		printf("\n");
	}
}

void updateWithoutInput()//与用户输入无关的更新
{
	ball_x = ball_x + ball_vx;
	ball_y = ball_y + ball_vy;

	if( (ball_x == 0 ) || (ball_x == high-1 ))
		ball_vx = -ball_vx;
	if( (ball_y == 0 ) || (ball_y == width-1 ))
		ball_vy = -ball_vy;

	Sleep(50);
}

void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit())
	{
		input = getch();
		if( input == 'a' || input == 'A' )
		{
			position_y--;//位置左移
			left = position_y-ridus;
			right = position_y+ridus;
		}
		if( input == 'd' || input == 'D' )
		{
			position_y++;
			left = position_y - ridus;
			right = position_y + ridus;
		}
	}
}
int main(void)
{
	startup();//数据的初始化
	while(1)
	{
		show();//显示画面
		updateWithoutInput();//与用户输入无关的更新
		updateWithInput();//与用户输入有关的更新
	}
	return 0;
}

效果图如下:
项目 : 用函数实现反弹球消砖块_第2张图片

四、反弹小球

代码如下:

#include
#include
#include
#include

//全局变量
int high,width; //游戏画面大小
int ball_x,ball_y;//小球的坐标
int ball_vx,ball_vy;//小球的速度
int position_x,position_y;//挡板的中心坐标
int ridus;//挡板的半径大小
int left,right;//挡板的左右位置
int ball_number;//反弹小球的次数

void gotoxy(int x,int y)//将光标移动到(x,y)位置
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
}

void startup()//数据的初始化
{
	high =  15;
	width = 20;
	ball_x = 0;
	ball_y = width/2;
	ball_vx = 1;
	ball_vy = 1;
	ridus = 5;
	position_x = high;
	position_y = width/2;
	left = position_y -ridus;
	right = position_y + ridus;
	ball_number=0;
}

void show()//显示画面
{
	gotoxy(0,0);//光标移动到原点位置,以下重画清屏
	int i,j;
	for(i=0;i<=high+1;i++)
	{
		for(j=0;j<=width;j++)
		{
			if( ( i == ball_x) && ( j == ball_y ) )
                printf("O");//输出小球
			else if( j == width)
				printf("+");//输出右边框
			else if( i == high+1)
				printf("-");//输出下边框
			else if ( (i==high)&&(j>=left)&&(j<=right))
				printf("*");
			else
				printf(" ");//输出空格
		}
		printf("\n");
	}
	printf("反弹小球数:%d\n",ball_number);
}

void updateWithoutInput()//与用户输入无关的更新
{
	if( ball_x == high -1)
	{
		if( (ball_y>=left) && (ball_y<=right) )
		{
			ball_number++;
			printf("\a");//响铃
		}
		else
		{
			printf("游戏失败\n");
			system("pause");
			exit(0);
		}
	}
	
	ball_x = ball_x + ball_vx;
	ball_y = ball_y + ball_vy;

	if( (ball_x == 0 ) || (ball_x == high-1 ))
		ball_vx = -ball_vx;
	if( (ball_y == 0 ) || (ball_y == width-1 ))
		ball_vy = -ball_vy;

	Sleep(50);
}

void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit())
	{
		input = getch();
		if( input == 'a' || input == 'A' )
		{
			position_y--;//位置左移
			left = position_y-ridus;
			right = position_y+ridus;
		}
		if( input == 'd' || input == 'D' )
		{
			position_y++;
			left = position_y - ridus;
			right = position_y + ridus;
		}
	}
}
int main(void)
{
	startup();//数据的初始化
	while(1)
	{
		show();//显示画面
		updateWithoutInput();//与用户输入无关的更新
		updateWithInput();//与用户输入有关的更新
	}
	return 0;
}

效果图如下:

五、添加砖块并实现打砖块操作

代码如下:

#include
#include
#include
#include

//全局变量
int high,width; //游戏画面大小
int ball_x,ball_y;//小球的坐标
int ball_vx,ball_vy;//小球的速度
int position_x,position_y;//挡板的中心坐标
int ridus;//挡板的半径大小
int left,right;//挡板的左右位置
int ball_number;//反弹小球的次数
int block_x1,block_y1;//砖块1的位置
int block_x2,block_y2;//砖块2的位置
int block_x3,block_y3;//砖块3的位置
int score;//消掉砖块的个数

void gotoxy(int x,int y)//将光标移动到(x,y)位置
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
}

void startup()//数据的初始化
{
	high =  15;
	width = 20;
	ball_x = 0;
	ball_y = width/2;
	ball_vx = 1;
	ball_vy = 1;
	ridus = 5;
	position_x = high;
	position_y = width/2;
	left = position_y -ridus;
	right = position_y + ridus;
	ball_number=0;
	block_x1 = 0;
	block_y1 = 1;
	block_x2 = 0;
	block_y2 = 2;
	block_x3 = 0;
	block_y3 = 3;
	score=0;
}

void show()//显示画面
{
	gotoxy(0,0);//光标移动到原点位置,以下重画清屏
	int i,j;
	for(i=0;i<=high+1;i++)
	{
		for(j=0;j<=width;j++)
		{
			if( ( i == ball_x) && ( j == ball_y ) )
                printf("O");//输出小球
			else if( j == width)
				printf("+");//输出右边框
			else if( i == high+1)
				printf("-");//输出下边框
			else if ( (i==high)&&(j>=left)&&(j<=right))
				printf("*");
			else if( (i==block_x1) && (j==block_y1) )
				printf("A");//输出砖块1
			else if( (i==block_x2) && (j==block_y2) )
				printf("B");//输出砖块2
			else if( (i==block_x3) && (j==block_y3) )
				printf("C");//输出砖块3
			else
				printf(" ");//输出空格
		}
		printf("\n");
	}
	printf("反弹小球数:%d\n",ball_number);
	printf("消掉的砖块数: %d\n",score);
}

void updateWithoutInput()//与用户输入无关的更新
{
	if( ball_x == high -1)
	{
		if( (ball_y>=left) && (ball_y<=right) )//被挡板挡住了
		{
			ball_number++;
			printf("\a");//响铃
		}
		else
		{
			printf("游戏失败\n");
			system("pause");
			exit(0);
		}
	}
	
	if( (ball_x == block_x1) && (ball_y ==block_y1) )//小球击中砖块1
	{
		score++;//分数加1
		block_y1=rand()%width;//产生新的砖块
		while((block_y1==block_y2) || ( block_y1==block_y3))
		//当新产生的砖块和其他砖块重合时
		{
			block_y1=rand()%width;//产生新的砖块
		}
	}

	if( (ball_x == block_x2) && (ball_y ==block_y2) )//小球击中砖块2
	{
		score++;//分数加1
		block_y2=rand()%width;//产生新的砖块
		while((block_y2==block_y1) || ( block_y2==block_y3))
		//当新产生的砖块和其他砖块重合时
		{
			block_y2=rand()%width;//产生新的砖块
		}
	}

	if( (ball_x == block_x3) && (ball_y ==block_y3) )//小球击中砖块3
	{
		score++;//分数加1
		block_y3=rand()%width;//产生新的砖块
		while((block_y3==block_y1) || ( block_y3==block_y2))
			//当新产生的砖块和其他砖块重合时
		{
			block_y3=rand()%width;//产生新的砖块
		}
	}

	ball_x = ball_x + ball_vx;
	ball_y = ball_y + ball_vy;

	if( (ball_x == 0 ) || (ball_x == high-1 ))
		ball_vx = -ball_vx;
	if( (ball_y == 0 ) || (ball_y == width-1 ))
		ball_vy = -ball_vy;

	Sleep(66);
}

void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit())
	{
		input = getch();
		if( input == 'a' || input == 'A' )
		{
			position_y--;//位置左移
			left = position_y-ridus;
			right = position_y+ridus;
		}
		if( input == 'd' || input == 'D' )
		{
			position_y++;
			left = position_y - ridus;
			right = position_y + ridus;
		}
	}
}
int main(void)
{
	startup();//数据的初始化
	while(1)
	{
		show();//显示画面
		updateWithoutInput();//与用户输入无关的更新
		updateWithInput();//与用户输入有关的更新
	}
	return 0;
}

效果图如下:

你可能感兴趣的:(C语言游戏开发,游戏,c++,C语言)