欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言數(shù)組實(shí)現(xiàn)打磚塊游戲

 更新時(shí)間:2022年05月12日 09:48:37   作者:無(wú)限的菜鳥(niǎo)  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組實(shí)現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語(yǔ)言數(shù)組實(shí)現(xiàn)打磚塊游戲的具體代碼,供大家參考,具體內(nèi)容如下

這次我們使用數(shù)組來(lái)改進(jìn)打磚塊游戲

反彈的球

首先我們實(shí)現(xiàn)一個(gè)可以在熒幕上反彈的小球。使用二維數(shù)組 int canvas[High][Width] ( 和js的canvas沒(méi)有一毛錢關(guān)系)來(lái)儲(chǔ)存畫(huà)布上的所有元素,值為0時(shí)輸出空格,值為1時(shí)輸出小球。

設(shè)小球坐標(biāo)為(ball_x, ball_y),則有canvas[ball_x][ball_y] = 1 ,且暫時(shí)將其他元素的值設(shè)為0。

每次更新小球位置時(shí)將原位置元素設(shè)為0,將新位置元素設(shè)為1即可。

注意:gotoxy函數(shù)用于清屏重畫(huà),很久以前講過(guò)的。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>
// 畫(huà)面尺寸設(shè)定
#define High 15
#define Width 20

//全局變量
int ball_x,ball_y;?? ?//小球坐標(biāo)
int ball_vx,ball_vy;//小球速度
int canvas[High][Width] = [0];

void gotoxy(int x, int y)?? ?//移動(dòng)光標(biāo)便于清屏重畫(huà)
{
?? ?HANDLE handle = GetStdHandle(STD_UOTPUT_HANDLE);
?? ?CROOD pos;
?? ?pos.X = x;
?? ?pos.Y = y;
?? ?SetConsoleCursorPosition(handle, pos);
}

void startup()?? ??? ??? ??? ?//數(shù)據(jù)初始化
{
?? ?ball_x = 0;
?? ?ball_y = Width/2;
?? ?ball_vx = 1;
?? ?ball_vy = 1;
?? ?canvas[ball_x][ball_y] = 1;
}

void show()
{
?? ?gotoxy(0, 0);
?? ?int i,j;
?? ?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");//輸出小球
?? ??? ?}
?? ??? ?printf("|\n");//每畫(huà)完一行顯示邊界并換行
?? ?}
?? ?for(j=0; j<Width; j++)
?? ??? ?printf("-");//最后畫(huà)下邊界
}

void updateWithoutInput()?? ?//無(wú)關(guān)輸入的更新
{
?? ?//小球移動(dòng)
?? ?canvas[ball_x][ball_y] = 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;
?? ??? ??? ?
?? ?canvas[ball_x][ball_y] = 1;
?? ?//休眠時(shí)間,避免刷新過(guò)快
?? ?sleep(50);
}

void updateWithInput()
{}

int main()
{
?? ?startup();
?? ?while(1)
?? ?{
?? ??? ?show();
?? ??? ?updateWithoutInput();
?? ??? ?updateWithInput();
?? ?}
?? ?return 0;
}

這里要注意的是:

  • updateWithInput留空,因?yàn)楝F(xiàn)在還沒(méi)有用戶操作的功能實(shí)現(xiàn)。
  • main是死循環(huán),所以測(cè)試時(shí)要注意,當(dāng)然也可以改進(jìn)。

增加擋板

現(xiàn)在我們可以新定義,當(dāng)數(shù)組中某一元素值為2時(shí),輸出擋板“ * ”。

并且為updateWithInput增加移動(dòng)擋板的功能,每次移動(dòng)一個(gè)單位作為其速度(當(dāng)然可以改成別的數(shù))。

擋板的刷新方式和小球一樣,先將原位置清零然后把新位置元素改為2。

需要增加的內(nèi)容如下:

//全局變量
int position_x,position_y; //擋板中心坐標(biāo)
int ridus;?? ?//擋板半徑,就是延伸的長(zhǎng)度
int left,right;?? ?//擋板左右位置

//初始化
ridus = 5;
position_x = High - 1;
position_y = Width/2;
left = position_y - ridus;
right = position_x + ridus;

int k;
for(k=left; k<=right; k++)
?? ?canvas[position_x][k] = 2;

//輸出部分
...
else if (canvas[i][j] == 2)
?? ?printf("*");
...

//更新部分(與輸入無(wú)關(guān))
if (ball_x == High - 2)
{
?? ?//判斷是否擋住
?? ?if ((ball_y >= left)&&(ball_y <= right))
?? ?{
?? ??? ?printf("\a");
?? ?}
?? ?else?? ?//未擋住
?? ?{
?? ??? ?printf("游戲失敗\n");
?? ??? ?printf("pause");
?? ??? ?exit(0);
?? ?}
}

//與輸入有關(guān)的更新
void updateWithInput()
{
?? ?char input;
?? ?if (kbhit())?? ?//判斷是否有輸入
?? ??? ?input = getch();
?? ?if ((input == 'a')&&(left > 0))//左移
?? ?{
?? ??? ?canvas[position_x][right] = 0;
?? ??? ?position_y --;
?? ??? ?left = position_y - ridus;
?? ??? ?right = position_x + ridus;
?? ??? ?canvas[position_x][left] = 2;
?? ?}
?? ?if ((input == 'd')&&(right < Width -1))//右移
?? ?{
?? ??? ?canvas[position_x][left] = 0;
?? ??? ?position_y ++;
?? ??? ?left = position_y - ridus;
?? ??? ?right = position_x + ridus;
?? ??? ?canvas[position_x][right] = 2;?? ?
?? ?}
}

打磚塊

這部分內(nèi)容就和之前的內(nèi)容一樣了。

需要增加的內(nèi)容有:

1. 初始磚塊
2. 小球碰到磚塊的判定
3. 碰到磚塊后的更新(磚塊消失、小球反彈)

具體代碼如下:

//初始化
int k,i;

for(k=0; k<Width; k++)
?? ?for(i=0; i<high/4; i++)?? ?//這里是畫(huà)磚塊,可以根據(jù)修改 i 的范圍改變磚塊的排數(shù)
?? ??? ?canvas[i][k] = 3;
//輸出
...
else if (canvas[i][j] == 3)
?? ?printf("#");
...
//碰到磚塊后
if (canvas[ball_x + ball_vx][ball_y + ball_vy] == 3)
{
?? ?canvas[ball_x + ball_vx][ball_y + ball_vy] = 0;
?? ?ball_vx = -ball_vx;
?? ?ball_vy = -ball_vy;
?? ?printf("\a");
}

最后

1. 坐標(biāo)系是x軸向下,y 軸向右。
2. 實(shí)際對(duì)碰撞的判定是在斜方向上,當(dāng)然可以改進(jìn)判定內(nèi)容。
3. 游戲勝利條件還沒(méi)有完善。

全代碼:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>
// 畫(huà)面尺寸設(shè)定
#define High 15
#define Width 20

//全局變量
int ball_x,ball_y;?? ?//小球坐標(biāo)
int ball_vx,ball_vy;//小球速度
int canvas[High][Width] = [0];
int position_x,position_y; //擋板中心坐標(biāo)
int ridus;?? ?//擋板半徑,就是延伸的長(zhǎng)度
int left,right;?? ?//擋板左右位置

void gotoxy(int x, int y)?? ?//移動(dòng)光標(biāo)便于清屏重畫(huà)
{
?? ?HANDLE handle = GetStdHandle(STD_UOTPUT_HANDLE);
?? ?CROOD pos;
?? ?pos.X = x;
?? ?pos.Y = y;
?? ?SetConsoleCursorPosition(handle, pos);
}

void startup()?? ??? ??? ??? ?//數(shù)據(jù)初始化
{
?? ?ball_x = 0;
?? ?ball_y = Width/2;
?? ?ball_vx = 1;
?? ?ball_vy = 1;
?? ?canvas[ball_x][ball_y] = 1;

?? ?ridus = 5;
?? ?position_x = High - 1;
?? ?position_y = Width/2;
?? ?left = position_y - ridus;
?? ?right = position_x + ridus;

?? ?int k,i;
?? ?for(k=left; k<=right; k++)
?? ?canvas[position_x][k] = 2;

?? ?for(k=0; k<Width; k++)
?? ??? ?for(i=0; i<high/4; i++)?? ?//這里是畫(huà)磚塊,可以根據(jù)修改 i 的范圍改變磚塊的排數(shù)
?? ??? ??? ?canvas[i][k] = 3;
}

void show()
{
?? ?gotoxy(0, 0);
?? ?int i,j;
?? ?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");//每畫(huà)完一行顯示邊界并換行
?? ?}
?? ?for(j=0; j<Width; j++)
?? ??? ?printf("-");//最后畫(huà)下邊界
}

void updateWithoutInput()?? ?//無(wú)關(guān)輸入的更新
{
?? ?if (canvas[ball_x + ball_vx][ball_y + ball_vy] == 3)
?? ?{
?? ??? ?canvas[ball_x + ball_vx][ball_y + ball_vy] = 0;
?? ??? ?ball_vx = -ball_vx;
?? ??? ?ball_vy = -ball_vy;
?? ??? ?printf("\a");
?? ?}
?? ?if (ball_x == High - 2)
?? ?{
?? ??? ?//判斷是否擋住
?? ??? ?if ((ball_y >= left)&&(ball_y <= right))
?? ??? ?{
?? ??? ??? ?printf("\a");
?? ??? ?}
?? ??? ?else?? ?//未擋住
?? ??? ?{
?? ??? ??? ?printf("游戲失敗\n");
?? ??? ??? ?printf("pause");
?? ??? ??? ?exit(0);
?? ??? ?}
?? ?}
?? ?//小球移動(dòng)
?? ?canvas[ball_x][ball_y] = 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;
?? ??? ??? ?
?? ?canvas[ball_x][ball_y] = 1;
?? ?//休眠時(shí)間,避免刷新過(guò)快
?? ?sleep(50);
}

void updateWithInput()
{
?? ?char input;
?? ?if (kbhit())?? ?//判斷是否有輸入
?? ??? ?input = getch();
?? ?if ((input == 'a')&&(left > 0))//左移
?? ?{
?? ??? ?canvas[position_x][right] = 0;
?? ??? ?position_y --;
?? ??? ?left = position_y - ridus;
?? ??? ?right = position_x + ridus;
?? ??? ?canvas[position_x][left] = 2;
?? ?}
?? ?if ((input == 'd')&&(right < Width -1))//右移
?? ?{
?? ??? ?canvas[position_x][left] = 0;
?? ??? ?position_y ++;
?? ??? ?left = position_y - ridus;
?? ??? ?right = position_x + ridus;
?? ??? ?canvas[position_x][right] = 2;?? ?
?? ?}
}

int main()
{
?? ?startup();
?? ?while(1)
?? ?{
?? ??? ?show();
?? ??? ?updateWithoutInput();
?? ??? ?updateWithInput();
?? ?}
?? ?return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++類和對(duì)象之多態(tài)詳解

    C++類和對(duì)象之多態(tài)詳解

    大家好,本篇文章主要講的是C++類和對(duì)象之多態(tài)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++中I/O模型之select模型實(shí)例

    C++中I/O模型之select模型實(shí)例

    這篇文章主要介紹了C++中I/O模型的select模型,實(shí)例講述了I/O模型的用法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • 在QT5中實(shí)現(xiàn)求兩個(gè)輸入值的和并輸出(實(shí)例)

    在QT5中實(shí)現(xiàn)求兩個(gè)輸入值的和并輸出(實(shí)例)

    下面小編就為大家?guī)?lái)一篇在QT5中實(shí)現(xiàn)求兩個(gè)輸入值的和并輸出(實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • C語(yǔ)言?如何用堆解決Topk問(wèn)題

    C語(yǔ)言?如何用堆解決Topk問(wèn)題

    TopK問(wèn)題即在N個(gè)數(shù)中找出最大的前K個(gè),這篇文章將詳細(xì)講解如何利用小根堆的方法解決TopK問(wèn)題,文中代碼具有一定參考價(jià)值,快跟隨小編一起學(xué)習(xí)一下吧
    2021-12-12
  • C++中常見(jiàn)容器類的使用方法詳解(vector/deque/map/set)

    C++中常見(jiàn)容器類的使用方法詳解(vector/deque/map/set)

    C++中常見(jiàn)的容器類有vector、list、deque、map、set、unordered_map和unordered_set。下面將舉例直接說(shuō)明各個(gè)容器的使用方法,希望對(duì)大家有所幫助
    2023-03-03
  • C語(yǔ)言make和Makefile介紹及使用

    C語(yǔ)言make和Makefile介紹及使用

    這篇文章介紹了C語(yǔ)言make和Makefile以及使用方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • C++編程語(yǔ)言實(shí)現(xiàn)單鏈表詳情

    C++編程語(yǔ)言實(shí)現(xiàn)單鏈表詳情

    這篇文章主要介紹的是利用C語(yǔ)言實(shí)現(xiàn)單鏈表,實(shí)現(xiàn)的是鏈表中最簡(jiǎn)單的一種單鏈表且每個(gè)結(jié)點(diǎn)中只含有一個(gè)指針域,下面將詳細(xì)舉例說(shuō)明,需要的朋友可以參考一下
    2021-10-10
  • opencv利用矩形框選中某一區(qū)域并保存為新圖片

    opencv利用矩形框選中某一區(qū)域并保存為新圖片

    這篇文章主要為大家詳細(xì)介紹了opencv利用矩形框選中某一區(qū)域并保存為新圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++ 讓函數(shù)返回?cái)?shù)組的方法

    C++ 讓函數(shù)返回?cái)?shù)組的方法

    這篇文章主要介紹了C++ 讓函數(shù)返回?cái)?shù)組的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C++遞歸線性陣列搜索數(shù)字的方法

    C++遞歸線性陣列搜索數(shù)字的方法

    這篇文章主要介紹了C++遞歸線性陣列搜索數(shù)字的方法,涉及C++遞歸及數(shù)組操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06

最新評(píng)論