C++制作简单的军棋小游戏(控制台窗口)

一.游戏规则:

这款自己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;
}

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WqyEnergetic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值