初学C++,或者说初学面向对象的编程思想,便写了一个模拟21点游戏的程序,与电脑对弈,似乎没有感觉到电脑的无脑,换言之,虽然我用了很简单的策略判断,但在这个游戏中,电脑仍然表现出一定智能。这里先卖个关子,大家可以自己找找源代码,看看我用了什么策略。
先来看看运行效果:
输了,再看一个赢的:
你可以在此链接下载本工程的源代码,然后直接打开exe文件先玩一下试试:点此打开网页。本次是在C-Free5中建的工程,但主要的4个文件"class.h", “class_card.cpp”, “class_player.cpp”, “main.cpp”,在任何C++的编译环境中都是可以运行的。
现在讲一下程序的大体思路,整个程序逻辑集中在"class.h"之中:
/ *
* 文件名:class.h
* 作者:于子豪
* 日期:2019-7-31
*/
#include <iostream>
using namespace std;
class card{
int c[52];//扑克牌
int n;//扑克牌数量
public:
card();
int putcard();//发牌,返回一张牌
};
class player{
card *ca;//指向开局的牌的指针
int a[11];//已有扑克牌
int n;//扑克牌数量
int pointN;//点数
public:
player();
int getpoint()const {return pointN;}//返回点数
int getn(){return n;}
int* geta(){return a;}
void tocard(card*p){ca=p;}//用指针指向开局的牌
void getcard();//要牌
void showcard();//显示所有牌,"cards: "
};
class computer:public player{
public:
int judge();//判断是否要牌,要则返回1,否则返回0
};
对于一盘21点游戏而言,我们可以抽象出两个对象,其一为"发牌员",其二则是"选手"。如果是和电脑对弈,则对于程序而言需要从"选手"继承出一个"电脑选手"。
"class.h"中说明了这一设计:
card类按顺序存储了52张牌作为全局对象,然后使用putcard()函数随机取牌并发牌,然后去除已发过的牌。
player类存储了牌的引用,即自己的牌等等。其方法包括获取牌,显示等等。
computer类则是player的继承,多出了电脑自己判断是否继续要牌的策略函数。
在main函数中实例化各类并进行调度,实现了21点游戏的运行逻辑:
int main()
{
cout<<" *************************************\n";
cout<<" welcome to play simple 21point game\n";
cout<<" *************************************\n\n";
cout<<"now it's the beginning,the computer has already gotten a card.\n";
card card1; player pl; computer com;
pl.tocard(&card1); com.tocard(&card1);
pl.getcard();
com.getcard(); cout<<"your "; pl.showcard();
cout<<"your point: "<<pl.getpoint()<<"\n\n";
//游戏内容:
char putj;
while(1)
{
int Jud=0;
if(pl.getpoint()>21) {cout<<"you lose!\n"; system("pause");exit(0);}
if(com.getpoint()>21)
{cout<<"computer lose! And you win!\n";system("pause");exit(0);}
if(com.judge()) {cout<<"the computer get a card.\n\n";com.getcard();}
else {cout<<"the computer passed.\n\n";Jud++;}
cout<<"Do you want one more card? 'y' or 'n' :" ;
cin>>putj;
if(putj=='y') {
pl.getcard();
cout<<"your ";pl.showcard();
cout<<"your point: "<<pl.getpoint()<<"\n\n";
}
else {cout<<"\n";Jud++;}
if(Jud==2) break;
}
cout<<"***********************************\n";
cout<<" the game is end.\n\n";
cout<<" computer's ";com.showcard();
cout<<" computer's point: "<<com.getpoint()<<"\n\n";
cout<<" your ";pl.showcard();
cout<<" your point: "<<pl.getpoint()<<"\n\n";
if(com.getpoint()<pl.getpoint()) cout<<" you win!\n";
else if(com.getpoint()>pl.getpoint()) cout<<" you lose!\n";
else cout<<" no one's win.\n";
cout<<"***********************************"<<endl;
system("pause");
return 0;
}
到这里基本上就说完了整个程序的思路及框架,具体代码可以参考源代码。
【资源下载链接:https://download.csdn.net/download/qq_45467083/11453331】
之前买的那个关子现在可以提示一下,在computer类的judeg()函数中,综合考虑当前点数和已有牌数,便可以判断出是否要牌了。