zoukankan      html  css  js  c++  java
  • 空战游戏

    一:实验项目名称:空战游戏
    二:实验项目功能描述:构建飞机,子弹,敌机,移动,结束。
    三:项目模块结构介绍:第一步利用函数和上面的游戏框架进行对飞机的显示与控制
    第二步发射子弹
    第三步增加敌机,使敌机移动,击中敌机
    第四步多个敌机
    第五步游戏由简单到困难 发射散弹

    四:
    五:代码托管连接:https://gitee.com/yangaapeng/yangaapeng
    六:实验总结:有了第一次实验,第二次没有前面的迷,慢慢的懂了一些东西,不过后面的知识变难,有些不懂什么意思,在今后多看书,多百度,尽可能的明白实验中的知识
    代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #include<windows.h>
                                   //游戏画面尺寸
    #define High 15
    #define Width 25
    #define EnemyNum 5            //敌机个数 
    //全局变量//
    int position_x,position_y;    //飞机的位置
    int enemy_x[EnemyNum],enemy_y[EnemyNum];          //敌机位置 
    int canvas[High][Width] = {0};  //二维数组存储游戏画布中对应的元素
                                    //0为空格,1为飞机*,2为子弹|,3为敌机@ 
    int score;                      //得分	
    int BulletWidth;                //子弹的宽度 
    int EnemyMovespeed;             //敌机的移动速度 
    							
    void gotoxy(int x,int y)     //将光标移动到(x,y)位置 
    {
    	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    	COORD pos;
    	pos.X = x;
    	pos.Y = y;
    	SetConsoleCursorPosition(handle,pos);
    }
    
    void startup()        //数据的初始化
    {
    	position_x = High-1;
    	position_y = Width/2;
    	canvas[position_x][position_y] = 1;
    	int k;
    	for(k=0;k<EnemyNum;k++)
    	{
    		enemy_x[k] = rand()%2;
    		enemy_y[k] = rand()%Width;
    		canvas[enemy_x[k]][enemy_y[k]] = 3;
    	}
    	score = 0;
        BulletWidth = 0;
        EnemyMovespeed = 20;
    }
    
    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("*");     //输出飞机* 
    			else if (canvas[i][j]==2)
    			    printf("|");    //输出子弹| 
    			else if(canvas[i][j]==3)
    			    printf("@");    //输出敌机 
    		}
    		printf("
    ");
    	}
    	printf("得分: %.3d
    ",score);
    	Sleep(20);
    }
    
    void updateWithoutInput()      //与用户输入无关更的新 
    {
    	int i,j,k;
    	for(i=0;i<High;i++)
    	{
    		for(j=0;j<Width;j++)
    		{
    			if(canvas[i][j]==2)
    			{
    				for(k=0;k<EnemyNum;k++)
    				{
    					if((i==enemy_x[k])&&(j==enemy_y[k]))      //子弹击中敌机
    					{
    						score++;    //分数加1
    						if(score % 5 == 0 && EnemyMovespeed>3)   //达到一定积分后敌机变快
    						    EnemyMovespeed--;
    						if(score%5==0)          //达到一定积分后子弹变厉害
    						    BulletWidth++;
    						canvas[enemy_x[k]][enemy_y[k]] = 0;
    						enemy_x[k] = rand()%2;    //产生新的飞机
    						enemy_y[k] = rand()%Width;
    						canvas[enemy_x[k]][enemy_y[k]] = 3;
    						canvas[i][j] = 0;    //子弹消失 
    					} 
    				}
    				//子弹向上移动
    				canvas[i][j] = 0;
    				if (i>0)
    					canvas[i-1][j] = 2;
    			}
    		}
    	}
    	static int speed = 0;
    	if(speed<EnemyMovespeed)
    		speed++;
    		
    	for(k=0;k<EnemyMovespeed;k++)
    	{
    		if((position_x==enemy_x[k])&&(position_y==enemy_y[k]))   //敌机撞到我机 
    		{
    			printf("失败!
    ");
    		    Sleep(3000);
    		    system("pause");
    		    exit(0);
    		}
    		
    		if(enemy_x[k]>High)        //敌机跑出显示屏幕
    		{
    			canvas[enemy_x[k]][enemy_y[k]] = 0;
    		    enemy_x[k] = rand()%2;         //产生新的飞机
    		    enemy_y[k] = rand()%Width;
    		    canvas[enemy_x[k]][enemy_y[k]] = 3;
    		    score--;          //减分   
    		}
    		if(speed == EnemyMovespeed)
    		{
    			//敌机下落
    			for (k=0;k<EnemyNum;k++)
    			{
    				canvas[enemy_x[k]][enemy_y[k]] = 0;
    				enemy_x[k]++;
    				speed = 0;
    				canvas[enemy_x[k]][enemy_y[k]] = 3;
    			} 
    		}
    	}
    }
    
    void updateWithInput()        //与用户输入有关的更新 
    {
    	char input;
    	if(kbhit())              //判断是否输入 
    	{
    		input = getch();     //根据用户的不同输入来移动,不必输入回车 
    		if(input == 'a'&&position_y>0)
    		{
    			canvas[position_x][position_y] = 0;
    			position_y--;            //位置左移 
    			canvas[position_x][position_y] = 1;
    		}
    		else if (input == 'd'&&position_y<Width-1)
    		{
    			canvas[position_x][position_y] = 0;
    			position_y++;            //位置右移
    			canvas[position_x][position_y] = 1;
    		}
    		else if (input == 'w')
    		{
    			canvas[position_x][position_y] = 0;
    			position_x--;            //位置上移 
    			canvas[position_x][position_y] = 1;
    		}
    		else if (input == 's')
    		{
    			canvas[position_x][position_y] = 0;
    			position_x++;            //位置下移
    			canvas[position_x][position_y] = 1;
    		}
    		else if( input == ' ')     //发射子弹
    		{
    			int left = position_y-BulletWidth;
    			int right = position_y+BulletWidth;
    			if(left<0)
    				left = 0;
    			if(right>Width-1)
     			    right = Width-1;
     			int k;
     			for(k=left;k<=right;k++)    //发射子弹
    			    canvas[position_x-1][k] = 2;   //发射子弹的初始位置在飞机的正上方 
    		}
    	}	
    }
    
    int main()
    {
        startup();                       //数据的初始化 
    	while(1)                     //游戏循环执行 
    	{
    		show();                      //显示画面 
    		updateWithoutInput();       //与用户输入无关的更新 
    		updateWithInput();       //与用户输入有关的更新 
    	}
    	return 0;
    }
    
  • 相关阅读:
    POJ 3253 Fence Repair
    POJ 2431 Expedition
    NYOJ 269 VF
    NYOJ 456 邮票分你一半
    划分数问题 DP
    HDU 1253 胜利大逃亡
    NYOJ 294 Bot Trust
    NYOJ 36 最长公共子序列
    HDU 1555 How many days?
    01背包 (大数据)
  • 原文地址:https://www.cnblogs.com/yang13aazop/p/10956758.html
Copyright © 2011-2022 走看看