青少年编程知识记录 codecoming

C++小游戏—反弹球实现打砖块

0.前言

在上一篇中,我们用C++代码实现了弹球小游戏,上一篇链接可以点击这里查看。

这一篇中,我们继续优化代码,使用上一篇的弹球小游戏进行扩展,实现打砖块效果。

1.思路



  • 底部挡板跟随键盘移动

  • 在顶部生成目标物—砖块

  • 小球在底部挡板中向一个方向移动

  • 小球碰到墙壁反弹,

  • 小球碰到砖块,砖块消失,游戏结束

  • 小球碰到底部除挡板外的位置,游戏结束。





2.游戏框架

#include<cstdio>  #include<iostream>  #include<conio.h>  #include<windows.h>  #include<ctime>  using namespace std;  //全局变量定义       //数据初始化  void start() {    }  //显示画面  void show() {     }  //输入无关  void noInput() {    }  //输入有关  void Keydown() {    }  //隐藏光标   void HideCursor(){  	CONSOLE_CURSOR_INFO cursor_info={1,0}; //第二个值表示隐藏光标   	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);	  }  //屏幕移动函数  void gotoxy(int x, int y) {  	COORD pos = {x,y};  	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄  	SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置  }  //主函数  int main() {  	start(); //数据初始化  	HideCursor();  //隐藏光标  	while(1) {  		show();  		Keydown();  		noInput();  	}  	return 0;  }



3.过程

(1)画边框

画边框的原理比较简单,就是当遍历到边界的宽(width)或高(high)时,画出边界。

参考代码:

#include<cstdio>  #include<iostream>  #include<conio.h>  #include<windows.h>  #include<ctime>  using namespace std;  //全局变量定义       //数据初始化  void start() {    }  //显示画面  void show() {     }  //输入无关  void noInput() {    }  //输入有关  void Keydown() {    }  //隐藏光标   void HideCursor(){  	CONSOLE_CURSOR_INFO cursor_info={1,0}; //第二个值表示隐藏光标   	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);	  }  //屏幕移动函数  void gotoxy(int x, int y) {  	COORD pos = {x,y};  	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄  	SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置  }  //主函数  int main() {  	start(); //数据初始化  	HideCursor();  //隐藏光标  	while(1) {  		show();  		Keydown();  		noInput();  	}  	return 0;  }

效果:

(2)画挡板

定义挡板的中心坐标、半径、左右点坐标。然后加上键盘输入和移动。

参考代码:

#include<cstdio>  #include<iostream>  #include<conio.h>  #include<windows.h>  #include<ctime>  using namespace std;  //全局变量定义  int high,width;//屏幕高度、屏幕宽度  int ball_x,ball_y; //小球的坐标,  int speedx,speedy; //小球的速度  int pad_x,pad_y; //挡板中心坐标   int r; //挡板的半径大小  int pad_left,pad_right; //挡板的左右边界点     //数据初始化  void start() {  	high=15;  	width=20;  	ball_x=1;  	ball_y=width/2;  	speedx=1;  	speedy=1;  	  	pad_x=high;  //挡板中心坐标   	pad_y=width/2;  //挡板中心坐标   	r=2;  	pad_left =pad_y - r; //挡板左端点   	pad_right =pad_y + r; //挡板右端点   }  //屏幕移动函数  void gotoxy(int x, int y) {  	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄  	COORD pos = {x,y};  	SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置  }  //显示画面  void show() {  	gotoxy(0,0); //通过gotoxy可以达到清屏效果   	/*画小球*/  	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 if((i==high-1) && (j>=pad_left) && (j<=pad_right))  				printf("*"); //输出挡板   			else  				printf(" ");//输出空白  		}  		printf("\n");  	}  }  //输入无关  void noInput() {  	if(ball_x>=high || ball_x<=0) //上下边界判断  		speedx= -1*speedx; //让增量取反  	if(ball_y>=width || ball_y<=0)  //左右边界判断  		speedy= -1*speedy;    	ball_x=ball_x+speedx;  	ball_y=ball_y+speedy;  }  //输入有关  void Keydown() {    }  //隐藏光标  void HideCursor() {  	CONSOLE_CURSOR_INFO cursor_info= {1,0}; //第二个值表示隐藏光标  	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);  }    //主函数  int main() {  	start(); //数据初始化  	HideCursor();  //隐藏光标  	while(1) {  		//system("cls");  		show();  		Keydown();  		noInput();  	}  	return 0;  }



(3)加入挡板的移动

#include<cstdio>  #include<iostream>  #include<conio.h>  #include<windows.h>  #include<ctime>  using namespace std;  //全局变量定义  int high,width;//屏幕高度、屏幕宽度  int ball_x,ball_y; //小球的坐标,  int speedx,speedy; //小球的速度  int pad_x,pad_y; //挡板中心坐标  int r; //挡板的半径大小  int pad_left,pad_right; //挡板的左右边界点    //数据初始化  void start() {  	high=15;  	width=20;  	ball_x=1;  	ball_y=width/2;  	speedx=1;  	speedy=1;    	pad_x=high;  //挡板中心坐标  	pad_y=width/2;  //挡板中心坐标  	r=2;  	pad_left =pad_y - r; //挡板左端点  	pad_right =pad_y + r; //挡板右端点  }  //屏幕移动函数  void gotoxy(int x, int y) {  	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄  	COORD pos = {x,y};  	SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置  }  //显示画面  void show() {  	gotoxy(0,0); //通过gotoxy可以达到清屏效果  	/*画小球*/  	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 if((i==high-1) && (j>=pad_left) && (j<=pad_right))  				printf("*"); //输出挡板  			else  				printf(" ");//输出空白  		}  		printf("\n");  	}  }  //输入无关  void noInput() {  	if(ball_x>=high || ball_x<=0) //上下边界判断  		speedx= -1*speedx; //让增量取反  	if(ball_y>=width || ball_y<=0)  //左右边界判断  		speedy= -1*speedy;  	ball_x=ball_x+speedx;  	ball_y=ball_y+speedy;  }  //输入有关  void Keydown() {  	char input;  	if (_kbhit()) { //如果有按键按下,则_kbhit()函数返回真  		input = _getch();//使用_getch()函数获取按下的键值  		switch(input) {  			case 75: //左键  			case 'a':  			case 'A':  				pad_y--;  				pad_left=pad_y-r;  				pad_right=pad_y+r;  				break;  			case  77: //右键  			case  'd':  			case 'D':  				pad_y++;  				pad_left=pad_y-r;  				pad_right=pad_y+r;  				break;  		}  	}  }  //隐藏光标  void HideCursor() {  	CONSOLE_CURSOR_INFO cursor_info= {1,0}; //第二个值表示隐藏光标  	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);  }    //主函数  int main() {  	start(); //数据初始化  	HideCursor();  //隐藏光标  	while(1) {  		//system("cls");  		show();  		Keydown();  		noInput();  	}  	return 0;  }



(adsbygoogle = window.adsbygoogle || []).push({});

作者:亿万年的星光 分类:趣味小程序 浏览: