天天看點

C語言小遊戲:和電腦玩21點遊戲

初學C++,或者說初學面向對象的程式設計思想,便寫了一個模拟21點遊戲的程式,與電腦對弈,似乎沒有感覺到電腦的無腦,換言之,雖然我用了很簡單的政策判斷,但在這個遊戲中,電腦仍然表現出一定智能。這裡先賣個關子,大家可以自己找找源代碼,看看我用了什麼政策。

先來看看運作效果:

C語言小遊戲:和電腦玩21點遊戲

輸了,再看一個赢的:

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

繼續閱讀