一.游戏规则:
这款自己DIY的小游戏有24个棋子。其中司令,军长各1个;师长,旅长,团长,营长,炸弹各2个;连长,排长,工兵,地雷各3个。棋子由小到大的顺序是:司令>军长>师长>旅长>团长>营长>连长>排长>工兵。其中工兵能挖掉地雷(工兵大于地雷),地雷能炸掉除工兵以外的其他任何棋子并消失;炸弹能炸掉对方所出的任何棋子并消失。若玩家和电脑所出的棋子相同,双方棋子同时阵亡。
二.代码实现:
/*--------------------------
game.h
---------------------------*/
#ifndef GAME_H_
#define GAME_H_
#include<iostream>
#include<string>
#include<Windows.h>
#include<ctime>
#include<cstdlib>
#pragma warning(disable:26495)
//棋子
typedef struct
{
std::string name;//棋子的名称(司令等)
int amount;//棋子的数量
int identify;//棋子的编号
}chess;
//抽象基类
class Player
{
protected:
chess ces[11]; //11种不同种类的棋子(司军师旅团 营连排兵弹 雷)
int chessSum = 0; //生还的棋子总数
public:
Player();
void deleteChess(int id); //某方棋子被干掉
int showChessSum()const; //访问chessSum变量
virtual void showList()const = 0; //向玩家展示我方生还的棋子
virtual void operation(int& my)const = 0; //玩家的操作
};
//我方玩家(自己)
class You :public Player
{
public:
virtual void showList()const; //向玩家展示我方生还的棋子
virtual void operation(int& my)const; //玩家的操作
};
//敌方玩家(电脑)
class ComputerPlayer :public Player
{
public:
virtual void showList()const; //向玩家展示电脑方生还的棋子
virtual void operation(int& co)const; //电脑的操作(随机生成一个棋子)
};
#endif
/*--------------------------
game.cpp
---------------------------*/
#include"game.h"
#pragma warning(disable:6385)
Player::Player()
{
//初始化棋子名称
ces[10].name = "炸弹";
ces[9].name = "司令";
ces[8].name = "军长";
ces[7].name = "师长";
ces[6].name = "旅长";
ces[5].name = "团长";
ces[4].name = "营长";
ces[3].name = "连长";
ces[2].name = "排长";
ces[1].name = "工兵";
ces[0].name = "地雷";
for (int i = 10; i >= 0; i--)
{
//初始化棋子编号
ces[i].identify = i;
if (i == 9 || i == 8)
{
ces[i].amount = 1;
}
else if (i >= 4 && i <= 7)
{
ces[i].amount = 2;
}
else if (i == 10)
{
ces[i].amount = 2;
ces[i].identify = 10;
}
else
{
ces[i].amount = 3;
}
chessSum += ces[i].amount;
}
}
void Player::deleteChess(int id)
{
ces[id].amount--;
chessSum--;
}
int Player::showChessSum()const
{
return chessSum;
}
//玩家方
void You::showList()const
{
using std::cout;
using std::endl;
cout << "我方:\n";
for (int i = 10; i >= 0; i--)
{
cout << ces[i].name << "共有" << ces[i].amount << "个(编号:" << i
<< ")\n";
}
cout << "剩余棋子:" << chessSum << endl;
}
void You::operation(int& my)const
{
using std::cin;
using std::cout;
using std::endl;
do
{
cout << "输入棋子代号[1-10]:";
cin >> my;
if (ces[my].amount != 0)
{
break;
}
else
{
cout << "你的" << ces[my].name << "全没了!\n";
}
} while (1);
cout << "我出的棋子为:" << ces[my].name << endl;
}
//电脑方
void ComputerPlayer::showList()const
{
using std::cout;
using std::endl;
cout << "敌方:\n";
for (int i = 10; i >= 0; i--)
{
cout << ces[i].name << "共有" << ces[i].amount << "个\n";
}
cout << "剩余棋子:" << chessSum << endl;
}
void ComputerPlayer::operation(int& co)const
{
using std::cout;
using std::endl;
//敌方随机出一个棋子
srand((unsigned)time(0));
while (1)
{
co = rand() % 11;
if (ces[co].amount == 0)
{
continue;
}
break;
}
cout << "敌方出的棋子为:" << ces[co].name << endl;
}
/*--------------------------
test.cpp
---------------------------*/
#include"game.h"
int main()
{
using std::cout;
using std::cin;
while (1)
{
Player* my = new You;
Player* co = new ComputerPlayer;
my->showList();
co->showList();
do
{
int mynum = -1;
int conum = -1;
//判断游戏结果并让用户选择是否继续
if (my->showChessSum() == 0 || co->showChessSum() == 0)
{
bool choose;
system("cls");
//同归于尽
if (my->showChessSum() == 0 && co->showChessSum() == 0)
{
cout << "平局!是否重来?(1:重来,0:退出)>";
}
//电脑失败
if (co->showChessSum() == 0)
{
cout << "胜利!是否重来?(1:重来,0:退出)>\n";
}
//我方失败
if (my->showChessSum() == 0)
{
cout << "失败!是否重来?(1:重来,0:退出)>\n";
}
cin >> choose;
//用户选择1就跳出循环,选择0就结束游戏进程
if (choose)
{
break;
}
else
{
return 0;
}
}
my->operation(mynum);//我方操作
Sleep(200);
co->operation(conum);//电脑操作
Sleep(750);
//吃子规则
//情况一:两个棋子编号为1-9的棋子的吃子规则
if ((mynum >= 1 && mynum <= 9) && (conum >= 1 && conum <= 9))
{
//1.我的棋子比电脑大
if (mynum > conum)
{
co->deleteChess(conum);
}
//2.电脑的棋比我的大
else if (mynum < conum)
{
my->deleteChess(mynum);
}
//3.同归于尽
else
{
my->deleteChess(mynum);
co->deleteChess(conum);
}
}
//情况二:地雷与棋子相遇的规则
//双方中有一方的棋子为地雷
else if (mynum == 0 || conum == 0)
{
//双方出的都是地雷
if (mynum == 0 && conum == 0)
{
system("cls");
my->showList();
co->showList();
continue;
}
//地雷与工兵相遇
//1.我出工兵电脑出地雷
else if (conum == 0 && mynum == 1)
{
co->deleteChess(conum);
}
//2.我出地雷电脑出工兵
else if (mynum == 0 && conum == 1)
{
my->deleteChess(mynum);
}
//3.地雷与非工兵,非地雷棋子相遇
else
{
my->deleteChess(mynum);
co->deleteChess(conum);
}
}
//情况三:炸弹与其他棋子相遇同归于尽
else
{
my->deleteChess(mynum);
co->deleteChess(conum);
}
system("cls");
my->showList();
co->showList();
} while (1);
delete my;
delete co;
}
return 0;
}