C語言實現(xiàn)反彈球消磚塊游戲
本文實例為大家分享了C語言實現(xiàn)反彈球消磚塊游戲的具體代碼,供大家參考,具體內(nèi)容如下
1.目標要求:
1.擊中上方方塊’H’,分數(shù)加1
2.下方控制線沒有接到小球時,游戲結(jié)束
2.C語言代碼:
#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h> /* ? ? ?? ?《反彈球消磚塊》?? ?by:你最珍貴 ? ? ?? ? ?? ??? ??? ? ——————————— ?? ??? ??? ?|控制信號: | 左 | 右 | ?? ??? ??? ? ———————————? ?? ??? ??? ?| ? ?鍵盤: | ?j | ?l |? ?? ??? ??? ? ——————————— ?? ?? ?? ? 1.擊中上方方塊'H',分數(shù)加1 ? ?? ? 2.下方控制線沒有接到小球時,游戲結(jié)束? */ void HideCursor(){?? ?//隱藏光標位置 ,這個函數(shù)復制代碼就行? ?? ?CONSOLE_CURSOR_INFO cursor_info={1,0};? ?? ?SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); } void gotoxy(int x,int y){?? ?//把光標放在(0,0)位置 ,這個函數(shù)復制代碼就行 ?? ?HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); ?? ?COORD pos; ?? ?pos.X = x; ?? ?pos.Y = y; ?? ?SetConsoleCursorPosition(handle,pos); }? int IsEnd;//是否結(jié)束? int interface_x,interface_y;//界面行數(shù)、列數(shù)? int block_y;//磚塊列位置? int ctrlline_width,ctrlline_left,ctrlline_right;//控制線的左列數(shù),寬度,右列數(shù)? int ball_x,ball_y;//小球位置? int ballv_x,ballv_y; //小球行列速度(1為正方向-1為反方向) int scores;//分數(shù)? int ballv_num;//小球速度的慢速變量,數(shù)值越大越慢? int ballv_num_i;//小球慢速變量值的循環(huán)變量? void startup(){?? ?//【數(shù)據(jù)初始化】? ?? ?HideCursor();//不顯示光標? ?? ?IsEnd = 0; ?? ?interface_x = 22; ?? ?interface_y = 30; ?? ?block_y = rand()%(interface_y-6)+2;? ?? ?ctrlline_width=8; ?? ?ctrlline_left=(interface_y-ctrlline_width-2)/2+1+1;//控制線最左列位置? ?? ?ctrlline_right=ctrlline_left+ctrlline_width-1;? ?? ?ball_x=interface_x-1; ?? ?ball_y=ctrlline_left+ctrlline_width/2;? ?? ?ballv_x=1; ?? ?ballv_y=1; ?? ?scores=0; ?? ?ballv_num=3;? ?? ?ballv_num_i=1;? } void show_begin(){//【初始頁面展示】? ?? ?int i,j; ?? ?int start=0; ?? ?char input; ??? ?while(!start){ ??? ??? ?gotoxy(0,0);//每次輸出頁面把鼠標放回(0,0)? ??? ??? ?for(i=1;i<=interface_x/2-4;i++) printf("\n");? ?? ??? ?for(i=1;i<interface_y/2-8;i++) printf(" "); ?? ??? ?printf("《反彈球消磚塊》\n\n"); ?? ??? ?for(i=1;i<interface_y/2-9;i++) printf(" "); ?? ??? ?printf("請按任意鍵開始游戲\n\n"); ?? ??? ?for(i=1;i<=interface_x/2-6;i++) printf("\n"); ?? ??? ?if(kbhit()){ ?? ??? ??? ?input = getch(); ?? ??? ??? ?if(input) start=1; ?? ??? ?} ?? ?} }? void show(){?? ?//【顯示畫面】? ?? ?gotoxy(0,0);//每次輸出頁面把鼠標放回(0,0)? ?? ?int i,j; ?? ?for(i=1;i<=interface_y/2-8;i++) printf(" "); ?? ?printf("《反彈球消磚塊》") ; ?? ?for(i=1;i<=interface_y/2-8-8;i++) printf(" "); ?? ?printf("分數(shù):%3d\n",scores); ?? ?for(i=1;i<=interface_x;i++){ ?? ??? ?printf(" ");//使屏幕對稱加的空格? ?? ??? ?for(j=1;j<=interface_y;j++){?? ??? ??? ? ?? ??? ??? ?if(j==1||j==interface_y){?? ?//邊框? ?? ??? ??? ??? ?printf("|"); ?? ??? ??? ?}else if(i==interface_x){?? ?//邊框? ?? ??? ??? ??? ?printf("_"); ?? ??? ??? ?}else if(i==1){?? ??? ?//上邊界? ?? ??? ??? ??? ?printf("V"); ?? ??? ??? ?}else if(i==interface_x-1&&(j>=ctrlline_left&&j<=ctrlline_right)){?? ?//控制線? ?? ??? ??? ??? ?printf("*"); ?? ??? ??? ?}else if(i==2&&(j>=block_y&&j<=block_y+4)){?? ??? ?//磚塊? ?? ??? ??? ??? ?printf("H"); ?? ??? ??? ?}else if(i==ball_x&&j==ball_y){?? ??? ?//反彈球? ?? ??? ??? ??? ?printf("O"); ?? ??? ??? ?}else printf(" ");?? ?//什么也不是的位置輸出空格? ?? ??? ?} ?? ??? ?printf("\n"); ?? ?} ?? ? } void update_outinput(){?? ?//【與輸入無關(guān)的更新】? ?? ?ballv_num_i= (ballv_num_i==ballv_num)?1:ballv_num_i+1;//ballv_num_i一次從{1到ballv_num}循環(huán),當ballv_num_i為最大時才更新球的位置,此目的是減速? ?? ?if(ballv_num_i==ballv_num){ ?? ??? ?if(ball_y==2||ball_y==interface_y-1){//判斷是否到左右邊界? ?? ??? ??? ?ballv_y *= -1; ?? ??? ?} ?? ??? ?if(ball_x==2){//判斷是否到上邊界 ?? ??? ??? ?if(ball_y>=block_y&&ball_y<=block_y+4){//判斷在上邊界有無消去磚塊? ?? ??? ??? ??? ?block_y = rand()%(interface_y-6)+2;//消去則磚塊位置重置? ?? ??? ??? ??? ?scores++;//分數(shù)加1 ?? ??? ??? ??? ?printf("\a");//提示音? ?? ??? ??? ?} ?? ??? ??? ?ballv_x *= -1;//不論是否碰磚塊,都要反彈? ?? ??? ?} ?? ??? ?if(ball_x==interface_x-1){//判斷是否下邊界接住小球了,若接住反彈,否則結(jié)束游戲? ?? ??? ??? ?if(ball_y>=ctrlline_left && ball_y<=ctrlline_right){ ?? ??? ??? ??? ?ballv_x *= -1; ?? ??? ??? ?}else{ ?? ??? ??? ??? ?IsEnd = 1; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?ball_x += ballv_x; ?? ??? ?ball_y += ballv_y; ?? ?}?? ? } void update_input(){//【與輸入有關(guān)的更新】? ?? ?char input; ?? ?if(kbhit()){ ?? ??? ?input = getch(); ?? ??? ?if( input == 'j'){//輸入“j”下方控制線左移? ?? ??? ??? ?ctrlline_left= (ctrlline_left==2)?2:ctrlline_left-1; ?? ??? ??? ?ctrlline_right= ctrlline_left+ctrlline_width-1; ?? ??? ?}else if( input == 'l'){//輸入“l(fā)”下方控制線右移? ?? ??? ??? ?ctrlline_left= (ctrlline_left==interface_y-ctrlline_width)?\ interface_y-ctrlline_width:ctrlline_left+1; ?? ??? ??? ?ctrlline_right= ctrlline_left+ctrlline_width-1; ?? ??? ?} ?? ?} } void show_end(){//【顯示失敗界面】? ?? ?system("cls");? ?? ?printf("\n\n\n\n\n\ngame over!\n\n\n\n\n\n\n\n\n\n\n\n\n");?? ? ?? ?system("pause");//暫停? ?? ?system("pause");//暫停 } int main(){ ?? ?startup();?? ?//數(shù)據(jù)初始化 ?? ?show_begin();//初始頁面? ?? ?while(!IsEnd){?? ?//游戲循環(huán)執(zhí)行? ?? ??? ?show();?? ?// 顯示畫面? ?? ??? ?update_outinput();?? ?//與輸入無關(guān)的更新? ?? ??? ?update_input();?? ?//與輸入有關(guān)的更新? ?? ?} ?? ?show_end(); //顯示失敗界面? ?? ?return 0; }
3.運行結(jié)果:
小游戲玩法:
《反彈球消磚塊》by:你最珍貴
————————————————————
|控制信號: | 左 | 右 |
————————————————————
| 鍵盤: | j | l |
————————————————————
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C/C++編程判斷String字符串是否包含某個字符串實現(xiàn)示例
這篇文章主要為大家介紹了C++編程中判斷String字符串是否包含某個字符串的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11C++實現(xiàn)LeetCode(144.二叉樹的先序遍歷)
這篇文章主要介紹了C++實現(xiàn)LeetCode(144.二叉樹的先序遍歷),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07C++簡明圖解分析靜態(tài)成員與單例設(shè)計模式
與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員,靜態(tài)成員函數(shù)沒有this指針。既然它沒有指向某一對象,也就無法對一個對象中的非靜態(tài)成員進行默認訪問2022-06-06