【C-for next 1.2_1】||簡單飛機遊戲重構

【C-for next 1.2_1】||簡單飛機遊戲重構
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

這次將程式碼進行模組化,將相應的遊戲功能都放在startup()、show()、updateWinthoutInput()、updateWithInput()幾個函式中實現。

int main(){
startup();
while(1){    //遊戲迴圈 
show();
updateWithoutInput();
updateWithInput();
}
return 0;
}

1.利用函式將簡單的飛機遊戲進行重構,實現飛機的移動,另外本次的輸出與上次的輸出也不相同。

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//全域性變數
int position_x,position_y;//飛機位置 
int high,width;//遊戲介面大小 
//初始化 
void startup(){
high = 20;
width = 30;
position_x = high/2;
position_y = width/2;
}
//顯示畫面
void show(){
system("cls");
int i,j;
for(i=0;i<high;i  ){
for(j=0;j<width;j  ){
if((i==position_x)&&(j==position_y))
printf("*");
else
printf(" ");
}
printf("\n");
}
} 
//與使用者輸入無關的更新
void updateWithoutInput(){
} 
//與使用者輸入有關的更新
void updateWithInput(){
char input;
if(kbhit()){
input = getch();
if(input == 'a')
position_y--;
if(input == 'd')
position_y  ;
if(input == 'w')
position_x--;
if(input == 's')
position_x  ; 
}
} 
//主函式 
int main(){
startup();
while(1){    //遊戲迴圈 
show();
updateWithoutInput();
updateWithInput();
}
return 0;
} 

2.顯示新式子彈,定義變數bullet_x,bullet_y記錄子彈的位置。

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//全域性變數
int position_x,position_y;//飛機位置 
int high,width;//遊戲介面大小 
int bullet_x,bullet_y;//子彈位置 
//初始化 
void startup(){
high = 20;
width = 30;
position_x = high/2;
position_y = width/2;
bullet_x = 0;
bullet_y = position_y;
}
//顯示畫面
void show(){
system("cls");
int i,j;
for(i=0;i<high;i  ){
for(j=0;j<width;j  ){
if((i==position_x)&&(j==position_y))
printf("*");//輸出飛機
else if((i==bullet_x)&&(j==bullet_y))
printf("|");//輸出子彈 
else
printf(" ");
}
printf("\n");
}
} 
//與使用者輸入無關的更新
void updateWithoutInput(){
if(bullet_x>-1)
bullet_x--;
} 
//與使用者輸入有關的更新
void updateWithInput(){
char input;
if(kbhit()){
input = getch();
if(input == 'a')
position_y--;
if(input == 'd')
position_y  ;
if(input == 'w')
position_x--;
if(input == 's')
position_x  ; 
if(input == ' '){
bullet_x = position_x-1;//子彈初始位置 
bullet_y = position_y;
}
}
} 
//主函式 
int main(){
startup();
while(1){    //遊戲迴圈 
show();
updateWithoutInput();
updateWithInput();
}
return 0;
} 

3.類似於定義飛機一樣定義敵機的位置,定義變數enemy_x,enemy_y記錄敵機的位置。

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//全域性變數
int position_x,position_y;//飛機位置 
int high,width;//遊戲介面大小 
int bullet_x,bullet_y;//子彈位置 
int enemy_x,enemy_y;//敵機位置 
//初始化 
void startup(){
high = 20;
width = 30;
position_x = high/2;
position_y = width/2;
bullet_x = 0;
bullet_y = position_y;
enemy_x = 0;
enemy_y = position_y;
}
//顯示畫面
void show(){
system("cls");
int i,j;
for(i=0;i<high;i  ){
for(j=0;j<width;j  ){
if((i==position_x)&&(j==position_y))
printf("*");//輸出飛機
else if((i==bullet_x)&&(j==bullet_y))
printf("|");//輸出子彈 
else if((i==enemy_x)&&(j==enemy_y))
printf(" ");//輸出敵機 
else
printf(" ");
}
printf("\n");
}
} 
//與使用者輸入無關的更新
void updateWithoutInput(){
if(bullet_x>-1)
bullet_x--;
} 
//與使用者輸入有關的更新
void updateWithInput(){
char input;
if(kbhit()){
input = getch();
if(input == 'a')
position_y--;
if(input == 'd')
position_y  ;
if(input == 'w')
position_x--;
if(input == 's')
position_x  ; 
if(input == ' '){
bullet_x = position_x-1;//子彈初始位置 
bullet_y = position_y;
}
}
} 
//主函式 
int main(){
startup();
while(1){    //遊戲迴圈 
show();
updateWithoutInput();
updateWithInput();
}
return 0;
} 

4.實現敵機自動下落的效果,在updateWithoutInput()函式中設定speed變數來控制敵機向下降落的速度,例子中表示的就是每執行10次敵機移動一次。

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//全域性變數
int position_x,position_y;//飛機位置 
int high,width;//遊戲介面大小 
int bullet_x,bullet_y;//子彈位置 
int enemy_x,enemy_y;//敵機位置 
//初始化 
void startup(){
high = 20;
width = 30;
position_x = high/2;
position_y = width/2;
bullet_x = 0;
bullet_y = position_y;
enemy_x = 0;
enemy_y = position_y;
}
//顯示畫面
void show(){
system("cls");
int i,j;
for(i=0;i<high;i  ){
for(j=0;j<width;j  ){
if((i==position_x)&&(j==position_y))
printf("*");//輸出飛機
else if((i==bullet_x)&&(j==bullet_y))
printf("|");//輸出子彈 
else if((i==enemy_x)&&(j==enemy_y))
printf(" ");//輸出敵機 
else
printf(" ");
}
printf("\n");
}
} 
//與使用者輸入無關的更新
void updateWithoutInput(){
if(bullet_x>-1)
bullet_x--;
//敵機向下移動
static int speed = 0;
if(speed<20)
speed  ;
if(speed == 10){
enemy_x  ;
speed =0;
} 
} 
//與使用者輸入有關的更新
void updateWithInput(){
char input;
if(kbhit()){
input = getch();
if(input == 'a')
position_y--;
if(input == 'd')
position_y  ;
if(input == 'w')
position_x--;
if(input == 's')
position_x  ; 
if(input == ' '){
bullet_x = position_x-1;//子彈初始位置 
bullet_y = position_y;
}
}
} 
//主函式 
int main(){
startup();
while(1){    //遊戲迴圈 
show();
updateWithoutInput();
updateWithInput();
}
return 0;
} 

5.設定飛機擊中效果,當子彈位置和敵機位置處於一樣時就是擊中敵機,這時候敵機不顯示;增加變數score記錄分數,每擊中一次敵機則加一分;增加rand()函式產生隨機數,即每當敵機被擊中後會隨機產生另一分飛機,rand()%10表示產生的隨機數在0~9。

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//全域性變數
int position_x,position_y;//飛機位置 
int high,width;//遊戲介面大小 
int bullet_x,bullet_y;//子彈位置 
int enemy_x,enemy_y;//敵機位置 
int score;//遊戲得分 
//初始化 
void startup(){
high = 20;
width = 30;
position_x = high/2;
position_y = width/2;
bullet_x = 0;
bullet_y = position_y;
enemy_x = 0;
enemy_y = position_y;
score = 0;
}
//顯示畫面
void show(){
system("cls");
int i,j;
for(i=0;i<high;i  ){
for(j=0;j<width;j  ){
if((i==position_x)&&(j==position_y))
printf("*");//輸出飛機
else if((i==bullet_x)&&(j==bullet_y))
printf("|");//輸出子彈 
else if((i==enemy_x)&&(j==enemy_y))
printf(" ");//輸出敵機 
else
printf(" ");
}
printf("\n");
}
printf("得分: %d\n",score);
} 
//與使用者輸入無關的更新
void updateWithoutInput(){
if(bullet_x>-1)
bullet_x--;
//擊中敵機
if((bullet_x==enemy_x)&&(bullet_y==enemy_y)){
score  ;//分數加一
enemy_x =-1;
enemy_y = rand()%width;//產生新的飛機 
bullet_x = -2; //子彈無效 
} 
if(enemy_x>high){//飛機飛出介面 
enemy_x = -1;
enemy_y = rand()%width; 
}
//敵機向下移動
static int speed = 0;
if(speed<20)
speed  ;
if(speed == 10){
enemy_x  ;
speed =0;
} 
} 
//與使用者輸入有關的更新
void updateWithInput(){
char input;
if(kbhit()){
input = getch();
if(input == 'a')
position_y--;
if(input == 'd')
position_y  ;
if(input == 'w')
position_x--;
if(input == 's')
position_x  ; 
if(input == ' '){
bullet_x = position_x-1;//子彈初始位置 
bullet_y = position_y;
}
}
} 
//主函式 
int main(){
startup();
while(1){    //遊戲迴圈 
show();
updateWithoutInput();
updateWithInput();
}
return 0;
} 

6.優化;增加gotoxy()函式,每當游標移動到原點位置,就進行重畫,實現類似於清屏函式的功能,解決飛機閃爍的問題。

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h> 
//全域性變數
int position_x,position_y;//飛機位置 
int high,width;//遊戲介面大小 
int bullet_x,bullet_y;//子彈位置 
int enemy_x,enemy_y;//敵機位置 
int score;//遊戲得分 
//初始化 
void startup(){
high = 20;
width = 30;
position_x = high/2;
position_y = width/2;
bullet_x = 0;
bullet_y = position_y;
enemy_x = 0;
enemy_y = position_y;
score = 0;
}
//消除飛機閃爍
void gotoxy(int x,int y){
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x; 
pos.Y = y;
SetConsoleCursorPosition(handle,pos);
} 
//顯示畫面
void show(){
gotoxy(0,0);
int i,j;
for(i=0;i<high;i  ){
for(j=0;j<width;j  ){
if((i==position_x)&&(j==position_y))
printf("*");//輸出飛機
else if((i==bullet_x)&&(j==bullet_y))
printf("|");//輸出子彈 
else if((i==enemy_x)&&(j==enemy_y))
printf(" ");//輸出敵機 
else
printf(" ");
}
printf("\n");
}
printf("得分: %d\n",score);
} 
//與使用者輸入無關的更新
void updateWithoutInput(){
if(bullet_x>-1)
bullet_x--;
//擊中敵機
if((bullet_x==enemy_x)&&(bullet_y==enemy_y)){
score  ;//分數加一
enemy_x =-1;
enemy_y = rand()%width;//產生新的飛機 
bullet_x = -2; //子彈無效 
} 
if(enemy_x>high){//飛機飛出介面 
enemy_x = -1;
enemy_y = rand()%width; 
}
//敵機向下移動
static int speed = 0;
if(speed<20)
speed  ;
if(speed == 10){
enemy_x  ;
speed =0;
} 
} 
//與使用者輸入有關的更新
void updateWithInput(){
char input;
if(kbhit()){
input = getch();
if(input == 'a')
position_y--;
if(input == 'd')
position_y  ;
if(input == 'w')
position_x--;
if(input == 's')
position_x  ; 
if(input == ' '){
bullet_x = position_x-1;//子彈初始位置 
bullet_y = position_y;
}
}
} 
//主函式 
int main(){
startup();
while(1){    //遊戲迴圈 
show();
updateWithoutInput();
updateWithInput();
}
return 0;
} 

這樣一個簡單的飛機遊戲就實現了函式封裝,當然還可以類似於簡單的飛機遊戲一樣將飛機和敵機設定的複雜一些。

程式語言 最新文章