初學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()函數中,綜合考慮目前點數和已有牌數,便可以判斷出是否要牌了。