C语言游戏编程之反弹小球

本文介绍如何使用C语言通过二维数组来编程实现一款反弹小球的游戏,探讨了二维数组在游戏编程中的应用和小球运动的逻辑实现。

采用二维数组进行编写

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
int high=15,width=20,collide,score;
int ball_x,ball_y,right,left,radius;
int coin_x,ball_vx,ball_vy; 
int canvas[15][20],board_x,board_y;
void hidecursor(){//隐藏光标 
	CONSOLE_CURSOR_INFO cursor_info={1,0};//第二个值为0表示隐藏光标 
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
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(){
	hidecursor();
	ball_x=high/2;ball_y=width/3;ball_vx=ball_vy=1; 
	radius=4;board_x=high-1;board_y=width/2;
	left=board_y-radius;right=board_y+radius;
	coin_x=4;
	int i,j;
	for(i=0;i<coin_x;i++)//初始化砖块数量 
		for(j=0;j<width;j++)
			canvas[i][j]=3;
	for(i=left;i<=right;i++)//初始化挡板 
		canvas[board_x][i]=2;
}
void show(){
	int i,j;
	//0代表空白,1代表小球,2代表挡板,3代表金币 
	gotoxy(0,0);
	for(i=0;i<high;i++){
		for(j=0;j<width;j++){
			if(canvas[i][j]==0)
				printf(" ");
			else if(canvas[i][j]==1)
				printf("O");
			else if(canvas[i][j]==2)
				printf("*");
			else if(canvas[i][j]==3)
				printf("$");
		}
		printf("|\n"); //画右边框,右边框的实际位置是width 
	}
	for(i=0;i<width;i++)//画下边框,下边框的实际位置是high 
		printf("-");
	printf("\n");
	printf("得分:%d\n",score);
	printf("小球碰撞次数:%d\n",collide);
	
}
void withoutinput(){
	//判断小球是否撞上挡板 
	if(ball_x==high-2){//下边框是high,挡板是high-1,所以小球该被挡板弹回的位置是high-2 
		if(ball_y>=left&&ball_y<=right)
			collide++;
		else{
			printf("Game Over!\n");
			system("pause");
			exit(0);
		}
	}
	
	//判断小球是否撞上金币
	if(canvas[ball_x-1][ball_y]==3){
		score++;
		canvas[ball_x-1][ball_y]=0;
		ball_vx=-ball_vx;
		printf("\a");
	}
	canvas[ball_x][ball_y]=0;//每一次改变小球位置前都要先将上一次小球的位置的值变为0 
	ball_x+=ball_vx;ball_y+=ball_vy;
	canvas[ball_x][ball_y]=1;//每次改变小球位置后立即将该位置值变为1 
	//判断小球何时转向
	if(ball_x==0||ball_x==high-2) //下边框是high,挡板是high-1,所以小球该变向的位置是high-2 
		ball_vx=-ball_vx;
	if(ball_y==0||ball_y==width-1)
		ball_vy=-ball_vy;
	Sleep(200);
}
void withinput(){
	char input;
	
	if(kbhit()){//判断键盘是否有输入,无论是否有输入都会继续循环,头文件是conio.h
		input=getch();
		if(input=='a'&&left!=0){
			canvas[board_x][right]=0;
			board_y--;
			left=board_y-radius;
			right=board_y+radius;
			canvas[board_x][left]=2;
		}
		else if(input=='d'&&right!=width-1){
			canvas[board_x][left]=0;
			board_y++;
			left=board_y-radius;
			right=board_y+radius;
			canvas[board_x][right]=2;
		} 
	}
	
}
int main(void){
	startup();
	while(1){
		show();
		withoutinput();
		withinput();
	}
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值