zoukankan      html  css  js  c++  java
  • 19年春第二次课程设计实验报告

    2019春第二次课程设计实验报告

    一、项目实验名称:空战游戏

    二、实验功能描述:操作者可以通过WASD来控制飞机移动,按下空格键飞机则可以发射子弹,子弹击中敌机则敌机消失,敌机消失后则可以得分并且刷新敌机位置,积分达到一定程度后敌机变快且子弹变多,放跑敌机会扣分。

    三、项目模块介绍:

    游戏最终代码:
    #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("得分:%d
    ",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<EnemyNum;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;
    }
    

    四、实现界面展示(截图):


    五、代码托管链接:

    https://gitee.com/Y-X-N/programming

    六、实验总结:

    实际上代码看的不是很懂,但是看了随书资源里的代码后终于明白他们的作用。
    然后有的自定义函数的作用不是太理解,多看会儿书就明白了。
    感想:近两百行的代码看着就眼花缭乱,每天还得关注自己的贡献度,搞完码云搞蓝墨云,搞完蓝墨云搞博客。其实挺累的。

  • 相关阅读:
    linux基础
    Jscript复选框
    Java 常用的几个算法(菜鸟初学)
    Hello World!
    调用快递鸟接口实现丰密面单打印 顺丰隐私面单 C#版
    快递单号智能识别API接口
    快递鸟开放平台API对接新手指南 极兔速递为例
    打印顺丰快递电子面单步骤 快递鸟教程
    打印京东电子面单步骤 快递鸟教程
    如何使用快递鸟打印顺丰电子面单
  • 原文地址:https://www.cnblogs.com/y-x-n/p/10960354.html
Copyright © 2011-2022 走看看