/**********************************************
* 头文件Submarine.h,包含Submarine基类及其派生类 *
* 包含潜艇的移动 、攻击、重载、更新等函数的具体实现 *
***********************************************/
#include <iostream>
#include <string>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <ctime>
#include <cstdlib>
#include <time.h>
#include "Game.h"
#include "Submarine.h"
#include "Torpedo.h"
#include "LifePrize.h"
using namespace std;
//Submarine类构造函数
Submarine::Submarine()
{
SetAttribute();
SetShape();
InitializeTorpedo();
}
//潜艇属性设置函数
void Submarine::SetAttribute()
{
//设置潜艇初始生死值
isDead = false;
//设置潜艇速度
speed = 0.5;
//设置潜艇速度控制标志值的初始值
speedcontrol = 0;
}
//潜艇形状图案设置函数
void Submarine::SetShape()
{
//初始横坐标为1 或 98,初始纵坐标为0,速度为0.5
initial_x = rand() % 2 ? 1 : 98;
x = initial_x;
//3个字符串长度均一样,方便操作,相当于操作一个矩形
if (initial_x == 1)
{
s1 = " ^ ";
s2 = "** * ";
s3 = " ******";
}
if (initial_x == 98)
{
s1 = " ^ ";
s2 = " * **";
s3 = "****** ";
}
//设置潜艇图案基本长度值
initial_length = s1.length();
//设置length值,后面可作为潜艇横坐标变化的一个标志值
length = initial_length;
}
//初始化鱼雷函数
void Submarine::InitializeTorpedo()
{
//设置潜艇的鱼雷的初始状态
ifShoot = false;
}
//返回潜艇初始横坐标函数
int Submarine::getInitial_X()
{
return initial_x;
}
//返回潜艇横坐标函数
int Submarine::get_X()
{
return x;
}
//返回潜艇纵坐标函数
int Submarine::get_Y()
{
return y;
}
//设置潜艇纵坐标函数
void Submarine::setY(const int LINE)
{
y = LINE;
}
//潜艇消亡函数
void Submarine::Dead()
{
isDead = true;
}
//潜艇消亡重生函数
void Submarine::Reborn()
{
SetAttribute();
SetShape();
}
//重载潜艇状态函数
void Submarine::Reload()
{
if (!isDead)
{
//从左边界出现的情况
if (initial_x == 1)
{
//从左边界出现
if (length > 0 && length <= initial_length)
{
length--;
//length此处代表未输出的长度,每重载一次length便减一
}
if (length == 0)
{
x++;
//length减至0时,代表整个潜艇完整图案已经出现
//以后的每一次重载,潜艇的横坐标右移,加一
}
//整个图案出现,在屏幕中向右移动
if (1 < x && x < 100 - initial_length)
{
x++; //横坐标加一
//边界处的检验,即完整图案刚好出现的状态,
//用length做标志值检验,防止横坐标一次性变化两个单位
if (x == 3 && length == 0)
{
x = 2;
length--;
}
}
//从右边界消失
if (100 - initial_length <= x && x < 99)
{
x++; //横坐标加一
//边界处的检验,即完整图案刚好开始消失的状态,
//用length做标志值检验,防止横坐标一次性变化两个单位
if (x == 94 && length == -2)
{
x = 93;
length--;
}
}
}
//从右边界出现的情况
if (initial_x == 98)
{
//从右边界出现
if (x != 1 && length > 0 && length <= initial_length)
{
length--;
x--;
//length此处代表未输出的长度,每重载一次length便减一
//每重载一次,潜艇的横坐标左移,减一
}
//整个图案出现,在屏幕中向左移动
if (1 < x && x <= 98 - initial_length)
{
x--; //横坐标减一
//边界处的检验,即完整图案刚好出现的状态,
//用length做标志值检验,防止横坐标一次性变化两个单位
if (x == 90 && length == 0)
{
x = 91;
length--;
}
}
//从左边界消失
if (x == 1 && length == -2)
{
length = initial_length + 1;
//将标志值length重置,方便实现从左边界消失(作为标志值)
}
if (x == 1 && length > 0)
{
length--; //更新标志值
}
}
}
//如果处于消亡状态,便重生
if (isDead)
{
Reborn();
}
//重载鱼雷
ReloadTorpedo();
}
//更新潜艇状态函数
void Submarine::Update()
{
if (!isDead)
{
//从左边界出现的情况
if (initial_x == 1)
{
//从左边界出现
//从第length个字符开始打印
if (length > 0 && length <= initial_length)
{
gotoXY(x, y);
for (int j = length - 1; j < initial_length; j++)
{
cout << s1[j];
}
gotoXY(x, y + 1);
for (int j = length - 1; j < initial_length; j++)
{
cout << s2[j];
}
gotoXY(x, y + 2);
for (int j = length - 1; j < initial_length; j++)
{
cout << s3[j];
}
}
//消除最左边的第一个完整图案
//如果达到length标志值-1,便从初始横坐标 initial_x = 1处开始,
//输出与潜艇字符串长度相同的空字符串,将最左边的第一个完整图案消除,开始后面的移动
if (length == -1)
{
gotoXY(initial_x, y);
for (int i = 0; i < initial_length; i++)
{
cout << " ";
}
gotoXY(initial_x, y + 1);
for (int i = 0; i < initial_length; i++)
{
cout << " ";
}
gotoXY(initial_x, y + 2);
for (int i = 0; i < initial_length; i++)
{
cout << " ";
}
length--;
}
//整个图案出现,在屏幕中向右移动
//光标移动到横坐标(x - 1)处,打印一个空字符后再打印整个字符串,实现向右移动
if (1 < x && x < 100 - initial_length)
{
gotoXY(x - 1, y);
cout << " ";
for (int j = 0; j < initial_length; j++)
{
cout << s1[j];
}
gotoXY(x - 1, y + 1);
cout << " ";
for (int j = 0; j < initial_length; j++)
{
cout << s2[j];
}
gotoXY(x - 1, y + 2);
cout << " ";
for (int j = 0; j < initial_length; j++)
{
cout << s3[j];
}
}
//从右边界消失
//光标移动到横坐标(x - 1)处,打印一个空字符后
//再从第一个字符开始打印到第(99 - x)个字符,实现从右边界逐渐消失
if (100 - initial_length <= x && x < 99)
{
int r = 99 - x;
gotoXY(x - 1, y);
cout << " ";
for (int j = 0; j < r; j++)
{
cout << s1[j];
}
gotoXY(x - 1, y + 1);
cout << " ";
for (int j = 0; j < r; j++)
{
cout << s2[j];
}
gotoXY(x - 1, y + 2);
cout << " ";
for (int j = 0; j < r; j++)
{
cout << s3[j];
}
}
//到达横坐标x = 98处时,消除最后一个字符
if (x == 98)
{
gotoXY(x, y);
cout << " ";
gotoXY(x, y + 1);
cout << " ";
gotoXY(x, y + 2);
cout << " ";
Dead();
}
}
//从右边界出现的情况
if (initial_x == 98)
{
//从右边界出现
//从第 1 个字符开始打印到第(initial_length - length)个字符
if (x != 1 && length > 0 && length <= initial_length)
{
gotoXY(x, y);
for (int j = 0; j < (initial_length - length) + 1; j++)
{
cout << s1[j];
}
gotoXY(x, y + 1);
for (int j = 0; j < (initial_length - length) + 1; j++)
{
cout << s2[j];
}
gotoXY(x, y + 2);
for (int j = 0; j < (initial_length - length) + 1; j++)
{
cout << s3[j];
}
}
//消除最右边的第一个完整图案
//如果达到length标志值-1,便从横坐标 98 -initial_x 处开始,
//输出与潜艇字符串长度相同的空字符串,将最右边的第一个完整图案消除,开始后面的移动
if (length == -1)
{
gotoXY(98 - initial_length, y);
for (int i = 0; i < initial_length; i++)
{
cout << " ";
}
gotoXY(98 - initial_length, y + 1);
for (int i = 0; i < initial_length; i++)
{
cout << " ";
}
gotoXY(98 - initial_length, y + 2);
for (int i = 0; i < initial_length; i++)
{
cout << " ";
}
length--;
}
//整个图案出现,在屏幕中向左移动
//光标移动到横坐标 x 处,打印整个字符串后再打印一个空字符,实现向左移动
if (1 < x && x < 99 - initial_length)
{
gotoXY(x, y);
for (int j = 0; j < initial_length; j++)
{
cout << s1[j];
}
cout << " ";
gotoXY(x, y + 1);
for (int j = 0; j < initial_length; j++)
{
cout << s2[j];
}
cout << " ";
gotoXY(x, y + 2);
for (int j = 0; j < initial_length; j++)
{
cout << s3[j];
}
cout << " ";
}
//从左边界消�
评论0
最新资源