1. 程式人生 > >c語言 彈彈球小遊戲

c語言 彈彈球小遊戲

windows keys 計算 print 小球 隨機 lse pri include

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include<mmsystem.h>
#pragma comment(lib, "WINMM.LIB")

#define BRICK_NUM 100
//形狀類型
#define SQUARE 1
#define STAR 2
#define DIAMOND 3

/*
建立對應模型:20/80 程序:核心代碼20% 非核心的代碼80%
1、磚塊:描述磚塊
2、球
3、條形木塊
*/
typedef struct Point
{
int x;
int y;
} Point;
//球數據模型
typedef struct Ball
{
//坐標
Point point;
//形狀,普通 火球 激光
int shape;
//水平方向 r:1 l:-1 : ‘l‘ ‘r‘
int hdir;
//垂直方向 u :1 d:-1
int vdir;
//速度
int speed;
} Ball;

//木板
typedef struct Board
{
//坐標
Point point;
//長度
int length;
//方向 左(-1) 右(1)
int dir;
//速度
int speed;
} Board;

//構建類型,摸擬磚塊
typedef struct Brick
{
//坐標
Point point;
//形狀 :1:正方形(普通磚塊 10) 2(圓形 20) 3:
int shape;
} Brick;


//磚塊
Brick bricks[BRICK_NUM];

//構建一個球
Ball ball;
//構建一個木板
Board board;

//計數器,
int count=0;
//總分值
int totalScore=0;

void init()
{
srand(time(0));
//初始化球
ball.point.x=36;
ball.point.y=22;
ball.shape=1;
ball.speed=200;
ball.vdir=1;//向上 u 向下 d 向左 l 向右 r
ball.hdir=-1;
//初始化木板
board.point.x=32;
board.point.y=23;
board.length=5;
board.speed=300;
board.dir=-1;
//初始化磚塊
initBrick();
}

/*
功能:定位光標(輸出)位置
*/
void setPosition(Point point)
{
//用戶坐標信息轉換成內部坐標信息
COORD coord= {point.x,point.y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}

/*
可視化顯示木板,球
*/
void showBall()
{
setPosition(ball.point);
//顏色:r g b
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY) ;
printf("◎");
}

/*
*可視化顯示木板 (重構)--》進化--》
*/
void showBorad()
{
int index=0;
setPosition(board.point);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY) ;
for(index=0; index<board.length; index++)
{
printf("〓");
}
}

/*
隨機數字
*/
int createRan()
{
return rand()%3+1;// 0 12
}

/*
初始化磚塊信息
*/
void initBrick()
{
//確定第一個磚塊位置 x ,y 程序邏輯會引起修改
int x=10;
int y=2;
int i=0;
//保存最初坐標
int index=0;
//100=25*4
for(index=0; index<BRICK_NUM; index++)
{
//確定每一行起始坐標
if(index!=0 && index%25==0) //25 50 75
{
//換行
x=bricks[i*25].point.x;
y=bricks[i*25].point.y+1;
i++;
}
//具體化
bricks[index].point.x=x;
bricks[index].point.y=y;
//形狀
bricks[index].shape=createRan();
x=x+2;
}
}

/*
*圖形化磚塊
*/
void showBrick()
{
int index=0;
for(index=0; index<BRICK_NUM; index++)
{
setPosition(bricks[index].point);
switch(bricks[index].shape)
{
case SQUARE:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
printf("■");
break;
case STAR:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN | FOREGROUND_INTENSITY);

printf("★");
break;
case DIAMOND:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_INTENSITY);
printf("◆");
break;
}
}
}


/*
檢查小球是否碰到了木板
1 碰
0 沒有碰到
*/
int ballToBoard()
{
//木板的啟始x值
int bxs=board.point.x;
int bxe=board.point.x+board.length*2;
if( (ball.point.x>=bxs && ball.point.x<=bxe) && ball.point.y==board.point.y-1 )
{
return 1;
}
return 0;
}


void selDir(){
//函數:異步
if(GetAsyncKeyState(VK_LEFT)){
board.dir=-1;
}else if(GetAsyncKeyState(VK_RIGHT)){
board.dir=1;
}
}

/*
移動木板
*/
void moveBoard()
{
int index=0;
setPosition(board.point);
//清除
for(index=0; index<board.length; index++)
{
printf(" ");
}
//新坐標:
board.point.x+=2*board.dir;
//重新
setPosition(board.point);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY) ;
for(index=0; index<board.length; index++)
{
printf("〓");
}
}

/*
檢查小球是否碰到磚塊
0
1
2
3
*/
int ballToBrick(){
int index=0;
for(index=0;index<BRICK_NUM;index++){
if(bricks[index].point.x==ball.point.x && bricks[index].point.y==ball.point.y){
return bricks[index].shape;;
}
}
return 0;
}

/*
移動小球
*/
void moveBall()
{
int left=4;
int right=64;
int top=2;
int bottom=24;
//水平、垂直增量
int stepx=2;
int stepy=1;
int shape=0;
Point p={76,10};
//得到小球原來位置
Point oldPoint=ball.point;
srand(time(0));
//原來位置圖形清除
setPosition(oldPoint);
printf(" ");

//檢查水平方向
if(ball.point.x<left)
{
//改變水平方向
ball.hdir=1;
}
else if(ball.point.x>right)
{
ball.hdir=-1;
}

//檢查垂直方向
if(ball.point.y<top)
{
ball.vdir=-1;
}
else if(ball.point.y>bottom)
{
ball.vdir=1;
}
else if(ballToBoard()==1)
{
ball.vdir=1;
}

//確定小球的新的位置
ball.point.x=oldPoint.x+stepx*ball.hdir;
ball.point.y=oldPoint.y-stepy*ball.vdir;

//判斷是否碰到磚塊 0 1 2 3
shape=ballToBrick();
//計算碰了多少塊磚塊
count+=shape>0?1:0;

setPosition(p);
totalScore+=shape*10;
printf("小球碰了%d磚塊,計分:%d",count,totalScore);
//重新繪制
setPosition(ball.point);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY) ;
printf("◎");
}

/*
功能模塊:繪制圍墻 1B=8bit A:1B 中文:2B
*/
void paintWall()
{
int index=0;
Point point;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);
//上邊。下邊
for(index=0; index<70; index=index+2)
{
point.x=index;
point.y=0;
setPosition(point);
printf("■");
point.y=26;
setPosition(point);
printf("■");
}
//左邊、右邊akes[0].x=oldX+2;
for(index=1; index<=26; index++)
{
point.x=0;
point.y=index;
setPosition(point);
printf("■");
point.x=68;
setPosition(point);
printf("■");
}
}

void show()
{
paintWall();
showBrick();
showBall();
showBorad();
}

int main()
{

init();
show();
while(1)
{
moveBall();
selDir();
moveBoard();
//速度
Sleep(ball.speed);
}
return 0;
}

c語言 彈彈球小遊戲