最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

反彈的球

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

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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>
// 畫面尺寸設(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)?? ?//移動光標(biāo)便于清屏重畫
{
?? ?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");//每畫完一行顯示邊界并換行
?? ?}
?? ?for(j=0; j<Width; j++)
?? ??? ?printf("-");//最后畫下邊界
}

void updateWithoutInput()?? ?//無關(guān)輸入的更新
{
?? ?//小球移動
?? ?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;
?? ?//休眠時間,避免刷新過快
?? ?sleep(50);
}

void updateWithInput()
{}

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

這里要注意的是:

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

增加擋板

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

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

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

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

//全局變量
int position_x,position_y; //擋板中心坐標(biāo)
int ridus;?? ?//擋板半徑,就是延伸的長度
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("*");
...

//更新部分(與輸入無關(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++)?? ?//這里是畫磚塊,可以根據(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. 實際對碰撞的判定是在斜方向上,當(dāng)然可以改進(jìn)判定內(nèi)容。
3. 游戲勝利條件還沒有完善。

全代碼:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>
// 畫面尺寸設(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;?? ?//擋板半徑,就是延伸的長度
int left,right;?? ?//擋板左右位置

void gotoxy(int x, int y)?? ?//移動光標(biāo)便于清屏重畫
{
?? ?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++)?? ?//這里是畫磚塊,可以根據(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");//每畫完一行顯示邊界并換行
?? ?}
?? ?for(j=0; j<Width; j++)
?? ??? ?printf("-");//最后畫下邊界
}

void updateWithoutInput()?? ?//無關(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);
?? ??? ?}
?? ?}
?? ?//小球移動
?? ?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;
?? ?//休眠時間,避免刷新過快
?? ?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;
}

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

相關(guān)文章

  • C++實現(xiàn)圖的鄰接矩陣存儲和廣度、深度優(yōu)先遍歷實例分析

    C++實現(xiàn)圖的鄰接矩陣存儲和廣度、深度優(yōu)先遍歷實例分析

    這篇文章主要介紹了C++實現(xiàn)圖的鄰接矩陣存儲和廣度、深度優(yōu)先遍歷,實例分析了C++實現(xiàn)圖的遍歷技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • C/C++ 中怎樣使用SetConsoleTextAttribute()函數(shù)來控制輸出字符的顏色

    C/C++ 中怎樣使用SetConsoleTextAttribute()函數(shù)來控制輸出字符的顏色

    這篇文章主要介紹了C/C++ 中如何使用SetConsoleTextAttribute()函數(shù)來控制輸出字符的顏色,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • sigsetjmp的用法總結(jié)

    sigsetjmp的用法總結(jié)

    sigsetjmp()會保存目前堆棧環(huán)境,然后將目前的地址作一個記號,而在程序其他地方調(diào)用siglongjmp()時便會直接跳到這個記號位置,然后還原堆棧,繼續(xù)程序的執(zhí)行
    2013-09-09
  • C++?Boost?Xpressive示例分析使用

    C++?Boost?Xpressive示例分析使用

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C語言 詳細(xì)講解邏輯運(yùn)算符的使用

    C語言 詳細(xì)講解邏輯運(yùn)算符的使用

    在C語言中,邏輯運(yùn)算符有&&、||、!;&&表示“與”的意思,需要兩端的表達(dá)式的值都為true,該式的值才為true。||表示“或”的意思,兩端的表達(dá)式的值只要有一端為true,該式的值就為true。!表示“非”的意思,將該式的真值換成相反的真值,即false和true互換
    2022-04-04
  • 基于VC編寫COM連接點事件的分析介紹

    基于VC編寫COM連接點事件的分析介紹

    本篇文章是對VC編寫COM連接點事件進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt自定義圖形實現(xiàn)拖拽效果

    Qt自定義圖形實現(xiàn)拖拽效果

    這篇文章主要為大家詳細(xì)介紹了Qt自定義圖形實現(xiàn)拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C++ 復(fù)制控制之復(fù)制構(gòu)造函數(shù)的實現(xiàn)

    C++ 復(fù)制控制之復(fù)制構(gòu)造函數(shù)的實現(xiàn)

    所謂的“復(fù)制控制”即通過這三個成員函數(shù)控制對象復(fù)制的過程,本文主要介紹了C++ 復(fù)制控制之復(fù)制構(gòu)造函數(shù)的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • C語言實現(xiàn)簡易五子棋

    C語言實現(xiàn)簡易五子棋

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡易五子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • C++利用棧實現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

    C++利用棧實現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

    這篇文章主要為大家詳細(xì)介紹了C++利用棧實現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論

定襄县| 麟游县| 茶陵县| 大姚县| 临清市| 天水市| 曲周县| 阿合奇县| 讷河市| 阜南县| 东丽区| 墨玉县| 郑州市| 烟台市| 舟曲县| 临澧县| 邯郸县| 克东县| 遂平县| 乌兰浩特市| 海盐县| 威宁| 华安县| 西贡区| 镇江市| 海口市| 库车县| 柏乡县| 乐都县| 大姚县| 五莲县| 平远县| 弥勒县| 曲松县| 昭平县| 仁寿县| 淄博市| 山东省| 丰原市| 余庆县| 绍兴市|