前言
呵呵 这大概是 大学里面的 c++ 贪吃蛇了吧
有一些 面向对象的理解, 但是不多
这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用
坦克大战
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<ctime>
#include<string>
#include<list>
using namespace std;
#define N 4
class Tank_War;
void set_pos(int x, int y);
class Object
{
protected:
int x, y;
int dir;
int life;
public:
Object() : x(0), y(0), dir(-1),life(1) {}
Object(int x, int y, int dir, int life) : x(x), y(y), dir(dir), life(life) {}
void move();
void paint() { }
void reduce_blood() { life -= 1; }
void increase_blood() { life += 1; }
bool is_failure();
virtual void print(){cout<<x<<"--"<<y<<"=="<<life<<"--"<<endl;}
};
class Missile : public Object
{
public:
Missile() : Object() {}
Missile(int x, int y, int dir, int life) : Object(x, y, dir, life) {}
bool move();
void paint(string icon);
int get_x()const { return x; }
int get_y()const { return y; }
void set_info(int x, int y, int dir) { this -> x = x; this -> y = y; this -> dir = dir; };
bool operator==(const Missile&_x){return (x==_x.x && y==_x.y&&dir==_x.dir); } //list中remove是需要重载==
};
class Tank : public Object
{
private:
int pre_dir;
list<Missile> missile_list;
public:
Tank() : Object(), pre_dir(-1) {}
Tank(int x, int y, int dir, int life) : Object(x, y, dir,life) {pre_dir = dir;};
void del_before_move();
void move(Tank_War &game, string name);
void paint(string icon);
int get_x() const { return x; }
int get_y() const { return y; }
int get_dir()const { return dir; }
void set_dir(int dir){ pre_dir = this -> dir; this -> dir = dir; }
void set_location(int x, int y){ this -> x = x; this -> y = y; }
void emission_missile();
void missile_move();
void check_missile(Tank_War &game, string name);
bool check_missile_strike(Missile& missile, Tank& tank);
// bool check_is_right(int x, int y, int dir);
int distance_squre(int x_1, int y_1, int x_2, int y_2);
int distance_squre(Tank& tank_2);
bool operator==(const Tank&_x){return (x==_x.x && y==_x.y&&dir==_x.dir); }
};
class Tank_War
{
private:
Tank lead;
list<Tank> enemy_list;
int tot;
int grade;
bool over;
public:
Tank_War():lead(28, 21, -1, 4), grade(0), tot(0), over(false) {};
int game();
void game_over() { over = true; }
int draw_menu();
void draw_game_interface();
Tank* get_lead() { return &lead; }
list<Tank>::iterator get_enemy_list_begin() { return enemy_list.begin(); }
list<Tank>::iterator get_enemy_list_end() { return enemy_list.end(); }
Tank* create_enemy();
void enemy_move();
// bool check_is_right(int x, int y, int dir);
bool can_move(Tank &tank, string name);
bool can_move(Tank& x, Tank& y);
void check_missile(string name);
void supply_enemy();
int get_random_direction();
list<Tank>::iterator remove_from_enemy_list(list<Tank>::iterator it) { return enemy_list.erase(it); }
void reduce_tot() { tot--; }
void increase_grade() { grade+=5;set_pos(68, 3);cout<<grade; }
};
int main()
{
Tank_War g;
g.game();
system("pause");
return 0;
}
int Tank_War::game()
{
bool is_move = true;
int speed = draw_menu();
system("cls");
draw_game_interface();
supply_enemy();
while(!over)
{
if(!lead.is_failure())
{
if(tot<N) supply_enemy();
if(GetAsyncKeyState(VK_UP)) lead.set_dir(-1);
else if(GetAsyncKeyState(VK_DOWN)) lead.set_dir(1);
else if(GetAsyncKeyState(VK_LEFT)) lead.set_dir(-2);
else if(GetAsyncKeyState(VK_RIGHT)) lead.set_dir(2);
else is_move = false;
if(is_move) lead.move(*this, "l