1. 用C++編寫的小游戲源代碼
五子棋的代碼:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
usingnamespacestd;
constintN=15;//15*15的棋盤
constcharChessBoardflag='';//棋盤標志
constcharflag1='o';//玩家1或電腦的棋子標志
constcharflag2='X';//玩家2的棋子標志
typedefstructCoordinate//坐標類
{
intx;//代錶行
inty;//代表列
}Coordinate;
classGoBang//五子棋類
{
public:
GoBang()//初始化
{
InitChessBoard();
}
voidPlay()//下棋
{
CoordinatePos1;//玩家1或電腦
CoordinatePos2;//玩家2
intn=0;
while(1)
{
intmode=ChoiceMode();
while(1)
{
if(mode==1)//電腦vs玩家
{
ComputerChess(Pos1,flag1);//電腦下棋
if(GetVictory(Pos1,0,flag1)==1)//0表示電腦,真表示獲勝
break;
PlayChess(Pos2,2,flag2);//玩家2下棋
if(GetVictory(Pos2,2,flag2))//2表示玩家2
break;
}
else//玩家1vs玩家2
{
PlayChess(Pos1,1,flag1);//玩家1下棋
if(GetVictory(Pos1,1,flag1))//1表示玩家1
break;
PlayChess(Pos2,2,flag2);//玩家2下棋
if(GetVictory(Pos2,2,flag2))//2表示玩家2
break;
}
}
cout<<"***再來一局***"<<endl;
cout<<"yorn:";
charc='y';
cin>>c;
if(c=='n')
break;
}
}
protected:
intChoiceMode()//選擇模式
{
inti=0;
system("cls");//系統調用,清屏
InitChessBoard();//重新初始化棋盤
cout<<"***0、退出1、電腦vs玩家2、玩家vs玩家***"<<endl;
while(1)
{
cout<<"請選擇:";
cin>>i;
if(i==0)//選擇0退出
exit(1);
if(i==1||i==2)
returni;
cout<<"輸入不合法"<<endl;
}
}
voidInitChessBoard()//初始化棋盤
{
for(inti=0;i<N+1;++i)
{
for(intj=0;j<N+1;++j)
{
_ChessBoard[i][j]=ChessBoardflag;
}
}
}
voidPrintChessBoard()//列印棋盤,這個函數可以自己調整
{
system("cls");//系統調用,清空屏幕
for(inti=0;i<N+1;++i)
{
for(intj=0;j<N+1;++j)
{
if(i==0)//列印列數字
{
if(j!=0)
printf("%d",j);
else
printf("");
}
elseif(j==0)//列印行數字
printf("%2d",i);
else
{
if(i<N+1)
{
printf("%c|",_ChessBoard[i][j]);
}
}
}
cout<<endl;
cout<<"";
for(intm=0;m<N;m++)
{
printf("--|");
}
cout<<endl;
}
}
voidPlayChess(Coordinate&pos,intplayer,intflag)//玩家下棋
{
PrintChessBoard();//列印棋盤
while(1)
{
printf("玩家%d輸入坐標:",player);
cin>>pos.x>>pos.y;
if(JudgeValue(pos)==1)//坐標合法
break;
cout<<"坐標不合法,重新輸入"<<endl;
}
_ChessBoard[pos.x][pos.y]=flag;
}
voidComputerChess(Coordinate&pos,charflag)//電腦下棋
{
PrintChessBoard();//列印棋盤
intx=0;
inty=0;
while(1)
{
x=(rand()%N)+1;//產生1~N的隨機數
srand((unsignedint)time(NULL));
y=(rand()%N)+1;//產生1~N的隨機數
srand((unsignedint)time(NULL));
if(_ChessBoard[x][y]==ChessBoardflag)//如果這個位置是空的,也就是沒有棋子
break;
}
pos.x=x;
pos.y=y;
_ChessBoard[pos.x][pos.y]=flag;
}
intJudgeValue(constCoordinate&pos)//判斷輸入坐標是不是合法
{
if(pos.x>0&&pos.x<=N&&pos.y>0&&pos.y<=N)
{
if(_ChessBoard[pos.x][pos.y]==ChessBoardflag)
{
return1;//合法
}
}
return0;//非法
}
intJudgeVictory(Coordinatepos,charflag)//判斷有沒有人勝負(底層判斷)
{
intbegin=0;
intend=0;
intbegin1=0;
intend1=0;
//判斷行是否滿足條件
(pos.y-4)>0?begin=(pos.y-4):begin=1;
(pos.y+4)>N?end=N:end=(pos.y+4);
for(inti=pos.x,j=begin;j+4<=end;j++)
{
if(_ChessBoard[i][j]==flag&&_ChessBoard[i][j+1]==flag&&
_ChessBoard[i][j+2]==flag&&_ChessBoard[i][j+3]==flag&&
_ChessBoard[i][j+4]==flag)
return1;
}
//判斷列是否滿足條件
(pos.x-4)>0?begin=(pos.x-4):begin=1;
(pos.x+4)>N?end=N:end=(pos.x+4);
for(intj=pos.y,i=begin;i+4<=end;i++)
{
if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j]==flag&&
_ChessBoard[i+2][j]==flag&&_ChessBoard[i+3][j]==flag&&
_ChessBoard[i+4][j]==flag)
return1;
}
intlen=0;
//判斷主對角線是否滿足條件
pos.x>pos.y?len=pos.y-1:len=pos.x-1;
if(len>4)
len=4;
begin=pos.x-len;//橫坐標的起始位置
begin1=pos.y-len;//縱坐標的起始位置
pos.x>pos.y?len=(N-pos.x):len=(N-pos.y);
if(len>4)
len=4;
end=pos.x+len;//橫坐標的結束位置
end1=pos.y+len;//縱坐標的結束位置
for(inti=begin,j=begin1;(i+4<=end)&&(j+4<=end1);++i,++j)
{
if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j+1]==flag&&
_ChessBoard[i+2][j+2]==flag&&_ChessBoard[i+3][j+3]==flag&&
_ChessBoard[i+4][j+4]==flag)
return1;
}
//判斷副對角線是否滿足條件
(pos.x-1)>(N-pos.y)?len=(N-pos.y):len=pos.x-1;
if(len>4)
len=4;
begin=pos.x-len;//橫坐標的起始位置
begin1=pos.y+len;//縱坐標的起始位置
(N-pos.x)>(pos.y-1)?len=(pos.y-1):len=(N-pos.x);
if(len>4)
len=4;
end=pos.x+len;//橫坐標的結束位置
end1=pos.y-len;//縱坐標的結束位置
for(inti=begin,j=begin1;(i+4<=end)&&(j-4>=end1);++i,--j)
{
if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j-1]==flag&&
_ChessBoard[i+2][j-2]==flag&&_ChessBoard[i+3][j-3]==flag&&
_ChessBoard[i+4][j-4]==flag)
return1;
}
for(inti=1;i<N+1;++i)//棋盤有沒有下滿
{
for(intj=1;j<N+1;++j)
{
if(_ChessBoard[i][j]==ChessBoardflag)
return0;//0表示棋盤沒滿
}
}
return-1;//和棋
}
boolGetVictory(Coordinate&pos,intplayer,intflag)//對JudgeVictory的一層封裝,得到具體那個玩家獲勝
{
intn=JudgeVictory(pos,flag);//判斷有沒有人獲勝
if(n!=0)//有人獲勝,0表示沒有人獲勝
{
PrintChessBoard();
if(n==1)//有玩家贏棋
{
if(player==0)//0表示電腦獲勝,1表示玩家1,2表示玩家2
printf("***電腦獲勝*** ");
else
printf("***恭喜玩家%d獲勝*** ",player);
}
else
printf("***雙方和棋*** ");
returntrue;//已經有人獲勝
}
returnfalse;//沒有人獲勝
}
private:
char_ChessBoard[N+1][N+1];
};
設計思路
1、進行問題分析與設計,計劃實現的功能為,開局選擇人機或雙人對戰,確定之後比賽開始。
2、比賽結束後初始化棋盤,詢問是否繼續比賽或退出,後續可加入復盤、悔棋等功能。
3、整個過程中,涉及到了棋子和棋盤兩種對象,同時要加上人機對弈時的AI對象,即涉及到三個對象。
2. (完整word版)純C語言寫的一個小型游戲 源代碼
"掃雷"小游戲C代碼
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
main( )
{char a[102][102],b[102][102],c[102][102],w;
int i,j; /*循環變數*/
int x,y,z[999]; /*雷的位置*/
int t,s; /*標記*/
int m,n,lei; /*計數*/
int u,v; /*輸入*/
int hang,lie,ge,mo; /*自定義變數*/
srand((int)time(NULL)); /*啟動隨機數發生器*/
leb1: /*選擇模式*/
printf("
請選擇模式:
1.標准 2.自定義
");
scanf("%d",&mo);
if(mo==2) /*若選擇自定義模式,要輸入三個參數*/
{do
{t=0; printf("請輸入
行數 列數 雷的個數
");
scanf("%d%d%d",&hang,&lie,&ge);
if(hang<2){printf("行數太少
"); t=1;}
if(hang>100){printf("行數太多
");t=1;}
if(lie<2){printf("列數太少
");t=1;}
if(lie>100){printf("列數太多
");t=1;}
if(ge<1){printf("至少要有一個雷
");t=1;}
if(ge>=(hang*lie)){printf("雷太多了
");t=1;}
}while(t==1);
}
else{hang=10,lie=10,ge=10;} /*否則就是選擇了標准模式(默認參數)*/
for(i=1;i<=ge;i=i+1) /*確定雷的位置*/
{do
{t=0; z[i]=rand( )%(hang*lie);
for(j=1;j<i;j=j+1){if(z[i]==z[j]) t=1;}
}while(t==1);
}
for(i=0;i<=hang+1;i=i+1) /*初始化a,b,c*/
{for(j=0;j<=lie+1;j=j+1) {a[i][j]='1'; b[i][j]='1'; c[i][j]='0';} }
for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1) {a[i][j]='+';} }
for(i=1;i<=ge;i=i+1) /*把雷放入c*/
{x=z[i]/lie+1; y=z[i]%lie+1; c[x][y]='#';}
for(i=1;i<=hang;i=i+1) /*計算b中數字*/
{for(j=1;j<=lie;j=j+1)
{m=48;
if(c[i-1][j-1]=='#')m=m+1; if(c[i][j-1]=='#')m=m+1;
if(c[i-1][j]=='#')m=m+1; if(c[i+1][j+1]=='#')m=m+1;
if(c[i][j+1]=='#')m=m+1; if(c[i+1][j]=='#')m=m+1;
if(c[i+1][j-1]=='#')m=m+1; if(c[i-1][j+1]=='#')m=m+1;
b[i][j]=m;
}
}
for(i=1;i<=ge;i=i+1) /*把雷放入b中*/
{x=z[i]/lie+1; y=z[i]%lie+1; b[x][y]='#';}
lei=ge; /*以下是游戲設計*/
do
{leb2: /*輸出*/
system("cls");printf("
");
printf(" ");
for(i=1;i<=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf("
|");
for(i=1;i<=lie;i=i+1){printf("---|");}
printf("
");
for(i=1;i<=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩餘雷個數");
if(i==3)printf(" %d",lei);
printf("
|");
for(j=1;j<=lie;j=j+1){printf("---|");}
printf("
");
}
scanf("%d%c%d",&u,&w,&v); /*輸入*/
u=u+1,v=v+1;
if(w!='#'&&a[u][v]=='@')
goto leb2;
if(w=='#')
{if(a[u][v]=='+'){a[u][v]='@'; lei=lei-1;}
else if(a[u][v]=='@'){a[u][v]='?'; lei=lei+1;}
else if(a[u][v]=='?'){a[u][v]='+';}
goto leb2;
}
a[u][v]=b[u][v];
leb3: /*打開0區*/
t=0;
if(a[u][v]=='0')
{for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i<=hang;i=i+1)
{for(j=lie;j>=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i>=1;i=i-1)
{for(j=1;j<=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i>=1;i=i-1)
{for(j=lie;j>=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1;if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i<=hang;i=i+1) /*檢測0區*/
{for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')
{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1;
if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1;
if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1;
if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1;
if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1;
if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1;
if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1;
if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1;
}
}
}
if(t==1)goto leb3;
}
n=0; /*檢查結束*/
for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1)
{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='?')n=n+1;}
}
}
while(a[u][v]!='#'&&n!=(hang*lie-ge));
for(i=1;i<=ge;i=i+1) /*游戲結束*/
{x=z[i]/lie+1; y=z[i]%lie+1; a[x][y]='#'; }
printf(" ");
for(i=1;i<=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf("
|");
for(i=1;i<=lie;i=i+1){printf("---|");}
printf("
");
for(i=1;i<=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩餘雷個數");
if(i==3)printf(" %d",lei); printf("
|");
for(j=1;j<=lie;j=j+1) {printf("---|");}
printf("
");
}
if(n==(hang*lie-ge)) printf("你成功了!
");
else printf(" 游戲結束!
");
printf(" 重玩請輸入1
");
t=0;
scanf("%d",&t);
if(t==1)goto leb1;
}
/*註:在DEV c++上運行通過。行號和列號都從0開始,比如要確定第0行第9列不是「雷」,就在0和9中間加入一個字母,可以輸入【0a9】三個字元再按回車鍵。3行7列不是雷,則輸入【3a7】回車;第8行第5列是雷,就輸入【8#5】回車,9行0列是雷則輸入【9#0】並回車*/
3. 急需 一個用C寫一個紙牌游戲的源代碼思路,我只要思路不要源代碼哈!
52帳牌可以模擬成一個大小為52的數組,如果追求內存空間的話,也可以以二進制來替換,只不過稍微麻煩一點。這里為了方便假設為BYTE abPoker[52] = {0};
兩個循環解決問題.
for(int i = 2;i < 53;i++)
{
for(int j = 0;j < 51;j++)
{
if(abPoker[j] % 2 == 0)
{
abPoker[j] = !abPoker[j];
}
}
}
for(int j = 0;j < 51;j++)
{
通過數組中是0還是1來標識當前的牌是正面朝上還是反面朝上。
}
4. 簡易c++鬥地主源碼,簡單的鬥地主不需要ui,只要能發牌,隨機決定地主,把牌按大小順序排列
#include <time.h>
#include <iostream>
#include <string>
#include <vector>
enum em_CardClass_t
{
_CC_hearts = 0, // 紅桃
_CC_Spade, // 黑桃
_CC_Clubs, // 梅花
_CC_Diamonds, // 方塊
_CC_King // 大小王
};
struct st_Card_t
{
em_CardClass_t _emCardClass;
UINT _uCardIndex; // _emCardClass為_CC_King時,有效取值[1,2]
// _emCardClass非_CC_King時,有效取值[1,13]
};
using namespace std;
void InitCard(vector<st_Card_t>& vtCard)
{
st_Card_t card;
for( UINT i=0; i<_CC_King; i++ )
{
card._emCardClass = (em_CardClass_t)i;
for( UINT j=1; j<14; j++ )
{
card._uCardIndex = j;
vtCard.push_back(card);
}
}
card._emCardClass = _CC_King;
card._uCardIndex = 1;
vtCard.push_back(card);
card._uCardIndex = 2;
vtCard.push_back(card);
}
// 分牌
void DealCard(vector<st_Card_t>& vtCard, vector<st_Card_t>& vtPlayer1,
vector<st_Card_t>& vtPlayer2, vector<st_Card_t>& vtPlayer3)
{
srand( (unsigned)time( NULL ) );
for( int i = 0; i < 51; i++ )
{
int iCard = rand() % vtCard.size();
switch( i % 3 )
{
case 0:
vtPlayer1.push_back(vtCard[iCard]);
break;
case 1:
vtPlayer2.push_back(vtCard[iCard]);
break;
default:
vtPlayer3.push_back(vtCard[iCard]);
break;
}
if( iCard != vtCard.size()-1 )
{
vtCard[iCard] = vtCard[vtCard.size()-1];
}
vtCard.pop_back();
}
}
// 叫牌
int Bid(vector<st_Card_t>& vtCard, vector<st_Card_t>& vtPlayer1,
vector<st_Card_t>& vtPlayer2, vector<st_Card_t>& vtPlayer3)
{
srand( (unsigned)time( NULL ) );
int iBider = rand() % 3; // 叫牌者,也就是地主
vector<st_Card_t>* pPlayer = NULL;
switch( iBider )
{
case 0:
pPlayer = &vtPlayer1;
break;
case 1:
pPlayer = &vtPlayer2;
break;
default:
pPlayer = &vtPlayer3;
break;
}
for( UINT i = 0; i < vtCard.size(); i++ )
{
pPlayer->push_back(vtCard[i]);
}
return iBider;
}
// 整牌(按紅桃、黑桃、梅花、方塊、小大王的花色順序整理,同一花色再按從小到大的順序整理)
void SortCard(vector<st_Card_t>& vtPlayer)
{
st_Card_t tmp;
for( UINT i=0; i<vtPlayer.size()-1; i++ )
{
for( UINT j=i+1; j<vtPlayer.size(); j++ )
{
if( vtPlayer[i]._emCardClass < vtPlayer[j]._emCardClass )
{
continue;
}
if( vtPlayer[i]._emCardClass == vtPlayer[j]._emCardClass &&
vtPlayer[i]._uCardIndex < vtPlayer[j]._uCardIndex )
{
continue;
}
tmp = vtPlayer[i];
vtPlayer[i] = vtPlayer[j];
vtPlayer[j] = tmp;
}
}
}
void PrintPlayerCard(const string& sPlayerName,
const vector<st_Card_t>& vtPlayer)
{
cout << sPlayerName << " cards:" << endl;
for( UINT i=0; i< vtPlayer.size(); i++ )
{
switch( vtPlayer[i]._emCardClass )
{
case _CC_hearts:
cout << "紅桃";
break;
case _CC_Spade:
cout << "黑桃";
break;
case _CC_Clubs:
cout << "梅花";
break;
case _CC_Diamonds:
cout << "方塊";
break;
default:
cout << "King";
break;
}
cout << vtPlayer[i]._uCardIndex<< " ";
}
cout << endl << endl;
}
void main()
{
vector<st_Card_t> vtCard;
vector<st_Card_t> vtPlayer1;
vector<st_Card_t> vtPlayer2;
vector<st_Card_t> vtPlayer3;
InitCard(vtCard);
DealCard(vtCard, vtPlayer1, vtPlayer2, vtPlayer3);
int iBider = Bid(vtCard, vtPlayer1, vtPlayer2, vtPlayer3);
SortCard(vtPlayer1);
SortCard(vtPlayer2);
SortCard(vtPlayer3);
PrintPlayerCard("Player1", vtPlayer1);
PrintPlayerCard("Player2", vtPlayer2);
PrintPlayerCard("Player3", vtPlayer3);
cout <<"地主是Player"<< iBider+1 << endl << endl;
}