日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

ege函数库_基于c++ ege图形库实现五子棋游戏

發布時間:2025/3/15 c/c++ 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ege函数库_基于c++ ege图形库实现五子棋游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文分享的五子棋實例,制作基于ege圖像庫, 首先需要安裝配置ege環境 就可以編寫小游戲了. 用到的ege庫函數不多 , 主要是基于c++的.

先看界面效果:

輸入界面:(就是控制臺)

游戲勝利界面:

文檔如下:

關于五子棋的構思:

實現人人對戰的五子棋游戲.使用面向對象的c++ 和 ege庫實現.

ege的安裝過程不在說明 , 在添加編譯鏈接時去掉 -mwindows 選項.

dev c++ 的運行環境設置為 TDM-GCC 4.8.1.32-bit Debug

為保險起見,編譯時選擇菜單欄里的? 運行-全部重新編譯(F12)

需要3個對象 :

1:棋盤對象

2:黑方棋手對象

3:白方棋手對象

需要說明,對五子棋的實現來說,棋子的數據結構和游戲使用界面相互分離.對棋子的操作基于二維數組,棋盤和棋子的顯示用單獨的方法實現.

棋盤對象名: chessboard

屬性:

1:所有棋子-allchessman? 二維數組,用來存放整個棋盤上棋子的分布和選手信息

數組元素值為0 表示該位置無子?? 值為1表示該位置為白方落子? 值為-1表示該位置為黑方落子

二維數組元素以結構體來表示 , 存X, Y坐標和身份標識.要注意的是 ,標識值為2標識是棋盤邊界.不能落子

方法:

1:添加棋子 - bool? addchessman(int , int , int message)?? //message指示落子黑白方身份識別

2:畫棋盤 - void? drawchessboard()

3:判勝? - int bunko(int , int , int message)

4:void? playchess()? 運行代碼的總程序

黑方對象:

屬性:

1: 棋子橫向位置? int chessman_X

2: 棋子縱向位置? int chessman_Y

3: 落子總個數??? black_chessman_count

4: 身份標識????? int black_chessplayer

方法:

1: 提交棋子? submit_chessman(int , int)

白方對象:

屬性:

1:棋子橫向位置? int chessman_X

2:棋子縱向位置? int chessman_Y

3:落子總個數??? white_chessman_count

4:身份標識????? int white_chessplayer

方法:

1: 提交棋子???? submit_chessman(int ,int )

三個頭文件對應三個對象:

黑棋選手:

#include

using namespace std;

class black

{

int chessman_X; //橫向位置

int chessman_Y; //縱向位置

int black_chessman_count ; //落子總數

int black_chessmanplayer ;

public:

black()

{

black_chessman_count=0;

black_chessmanplayer=-1;

}

bool submit_chessman(int chessman_X , int chessman_Y )

{

if(chessman_X>15 || chessman_X<1 || chessman_Y>15 ||chessman_Y<1)

{

return false;

}

else

{

this->chessman_X = chessman_X;

this->chessman_Y = chessman_Y;

black_chessman_count++;

return true;

}

}

int getIdentity()

{

return black_chessmanplayer;

}

int getChessman_X()

{

return chessman_X-1; //這里設置減一是因為畫圖從0位置開始

}

int getChessman_Y()

{

return chessman_Y-1;

}

int getChessmanCount()

{

return black_chessman_count ;

}

};

白棋選手:

#include

using namespace std;

class white

{

int chessman_X; //橫向位置

int chessman_Y; //縱向位置

int white_chessman_count; //落子總數

int white_chessmanplayer;

public:

white()

{

white_chessman_count=0;

white_chessmanplayer=1;

}

bool submit_chessman(int chessman_X , int chessman_Y )

{

if(chessman_X>15 || chessman_X<1 || chessman_Y>15 || chessman_Y<1)

{

return false;

}

else

{

this->chessman_X = chessman_X;

this->chessman_Y = chessman_Y;

white_chessman_count++;

return true;

}

}

int getIdentity()

{

return white_chessmanplayer;

}

int getChessman_X()

{

return chessman_X-1;

}

int getChessman_Y()

{

return chessman_Y-1;

}

int getChessmanCount()

{

return white_chessman_count ;

}

};

棋盤對象:

#include

#include "graphics.h"

#include"black.h"

#include"white.h"

#include

#define singleGirdSize 40

#define girdLength 15

using namespace std;

class chessboard

{

//int allchessman[girdLength][girdLength] = {{0 ,0}};

struct allchessman

{

int point_X; //記錄棋子X軸位置

int point_Y; //記錄棋子Y軸位置

int message; //識別棋子身份 (黑方? 白方 ? 空子? )

}allchessman[girdLength][girdLength];

public : bool win =false; //玩家輸贏的標記

black b; //定義黑方對象

white w; //定義白方對象

//這里b , w 是全局的 ,局部的話會對black_chessman_count這種屬性的變化有影響

public:

//在構造方法中初始化所有棋子

chessboard()

{

int x=100 , y=100; //棋盤左上端點100 ,100

for(int i=0 ; i<15 ; i++ , y+=singleGirdSize)

{

for(int u=0; u<15 ; u++ , x+=singleGirdSize)

{

allchessman[i][u].point_X = x;

allchessman[i][u].point_Y = y;

if(allchessman[i][u].point_X == 100 || allchessman[i][u].point_X == 660 || allchessman[i][u].point_Y == 100 || allchessman[i][u].point_Y == 660)

{

allchessman[i][u].message =2; //棋盤邊界標識記為2 , 不能落子

}

else

{

allchessman[i][u].message =0; //初始化為空子

}

}

x=100; //讓X重新回到端點位置

}

}

//添加棋子

bool addchessman(int chessman_X , int chessman_Y , int message)

{

if(message == -1) //黑方落子

{

if(allchessman[chessman_X][chessman_Y].message== 0) //預落子位置無子

{

allchessman[chessman_X][chessman_Y].message = -1; //落子

setfillcolor(RED);

fillellipse(allchessman[chessman_X][chessman_Y].point_X , allchessman[chessman_X][chessman_Y].point_Y , 20 , 20); //界面上顯示落子 .半徑20

if(is_run()) delay_fps(10);

return true; //落子成功

}

else return false; //添加棋子失敗 重復落子的處理

}

else

{

if (message == 1)

{

if(allchessman[chessman_X][chessman_Y].message == 0 )

{

allchessman[chessman_X][chessman_Y].message =1;

setfillcolor(WHITE);

fillellipse(allchessman[chessman_X][chessman_Y].point_X , allchessman[chessman_X][chessman_Y].point_Y , 20 , 20); //界面上顯示落子 .半徑20

if(is_run()) delay_fps(10);

return true; //落子成功

}

else return false;

}

else

{

return false; //應對意外情況 --message身份出錯時

}

}

} //addchessman

void drawchessboard()

{

setinitmode(INIT_WITHLOGO, CW_USEDEFAULT, CW_USEDEFAULT);

//畫布大小暫定800 ,800

initgraph(800 , 800);

setfont(50 ,0 ,"宋體");

outtextxy(250 , 0 , "簡易五子棋");

setfont(20 , 0 , "宋體");

//畫出棋盤

//預定棋盤左上端點是100 ,100 像素點

int startpoint_X =100 , startpoint_Y =100 ;

char str[10];

for(int i=0; i<15 ; i++)

{

sprintf(str , "%d" , i+1);

outtextxy(startpoint_X-20 , startpoint_Y-7, str);

line(startpoint_X , startpoint_Y , startpoint_X+( girdLength*singleGirdSize-singleGirdSize) , startpoint_Y); //線段畫出屏幕會出錯:什么也畫不出來

startpoint_Y+=singleGirdSize;

}

startpoint_Y = 100; //重置起始點Y

for(int i=0 ; i<15 ; i++)

{

sprintf(str , "%d" , i+1);

outtextxy(startpoint_X-7, startpoint_Y-20 , str);

line(startpoint_X , startpoint_Y , startpoint_X , startpoint_Y+(girdLength*singleGirdSize-singleGirdSize) );

startpoint_X+=singleGirdSize;

}

/*

for(int i=0 ; i<15 ; i++)

{

for(int u=0 ; u<15 ; u++)

{

if(allchessman[i][u].message == 2) {}

else

{

circle(allchessman[i][u].point_X , allchessman[i][u].point_Y , 20);

}

}

}

*/

}//drawchessboard

void playchess()

{

if(is_run()) delay_fps(10);

int x ,y ; //接收落子的位置

int identity=1; // 標識黑方 白方身份 identity取余不為0 則是黑方

do

{

cout<

black_entry(x ,y);

if(is_run()) delay_fps(10);

if(!win)

{

white_entry(x ,y);

}

system("cls");

} while(!win);

getch();

}

void black_entry(int &x , int &y)

{

//bool addchessman(int chessman_X , int chessman_Y , int message);

cout<

cout<

cout<

cin>>x;

cout<

cout<

cin>>y;

if( ! b.submit_chessman(x ,y) )

{

cout<

black_entry(x ,y);

}

if( !addchessman(b.getChessman_X(), b.getChessman_Y() , b.getIdentity()) )

{

cout<

black_entry( x ,y);

}

else

{

if(bunko( b.getChessman_X(), b.getChessman_Y() , b.getIdentity()) )

{

setfont(50 , 0 ,"宋體");

setfontbkcolor(GREEN);

outtextxy(300 ,300 ,"黑方勝!");

setfont(20 ,0 ,"宋體");

outtextxy(300 ,750 ,"按任意鍵退出!");

win = true;

}

}

cout<

cout<

}

void white_entry(int &x , int &y)

{

// bool addchessman(int chessman_X , int chessman_Y , int message);

cout<

cout<

cout<

cout<

cin>>x;

cout<

cout<

cin>>y;

if( ! w.submit_chessman(x ,y) )

{

cout<

black_entry(x ,y);

}

if( !addchessman(w.getChessman_X() ,w.getChessman_Y() ,w.getIdentity()) )

{

cout<

white_entry(x ,y);

}

else

{

if(bunko( w.getChessman_X(), w.getChessman_Y() , w.getIdentity()) )

{

setfont(50 , 0 ,"宋體");

setfontbkcolor(LIGHTGRAY);

outtextxy(300 ,300 ,"白方勝!");

setfont(20 ,0 ,"宋體");

outtextxy(300 ,720 ,"按任意鍵退出!");

win = true;

}

}

}

bool bunko(int x, int y , int message) //判勝

{

int xReturnZero =x;

int yReturnZero =y;

int accumulative=0; //用來記錄黑方或白方累計連在一起的 棋子個數

//先以該子位置為基點,向上(X軸不動 ,Y軸反方向) 逐一判斷

while(allchessman[--x][y].message == message)

{

accumulative++;

//cout<

}

/*

if(accumulative == 5)

{

accumulative=0; //重置計數為0

return true;

}

else

{

return false;

}

*/

x = xReturnZero;

y = yReturnZero;

//先以該子位置為基點 , 向下( X軸不動 , Y軸正方向) 逐一判斷

while(allchessman[++x][y].message == message)

{

accumulative++;

//cout<

}

if(accumulative == 5)

{

accumulative=0; //重置計數為0

return true;

}

else

{

// return false;

}

x = xReturnZero;

y = yReturnZero;

//先以該子位置為基點 , 向左(Y軸不動 , X軸反方向) 逐一判斷

while(allchessman[x][--y].message == message)

{

accumulative++;

//cout<

}

/*

if(accumulative == 5)

{

accumulative=0; //重置計數為0

return true;

}

else

{

return false;

}

*/

x = xReturnZero;

y = yReturnZero;

//先以該子位置為基點, 向右(Y軸不動 , X軸正方向) 逐一判斷

while(allchessman[x][++y].message == message)

{

accumulative++;

//cout<

}

if(accumulative == 5)

{

accumulative=0; //重置計數為0

return true;

}

else

{

// return false;

}

x = xReturnZero;

y = yReturnZero;

//右下方

while(allchessman[++x][++y].message == message)

{

accumulative++;

//cout<

}

/*

if(accumulative == 5)

{

accumulative=0; //重置計數為0

return true;

}

else

{

return false;

} */

x = xReturnZero;

y = yReturnZero;

//左上方

while(allchessman[--x][--y].message == message)

{

accumulative++;

//cout<

}

if(accumulative == 5)

{

accumulative=0; //重置計數為0

return true;

}

else

{

//return false;

}

x = xReturnZero;

y = yReturnZero;

//右上方

while(allchessman[--x][++y].message == message)

{

accumulative++;

//cout<

}

/*

if(accumulative == 5)

{

accumulative=0; //重置計數為0

return true;

}

else

{

return false;

} */

x = xReturnZero;

y = yReturnZero;

//左下方

while(allchessman[++x][--y].message == message)

{

accumulative++;

//cout<

}

if(accumulative == 5)

{

accumulative=0; //重置計數為0

return true;

}

else

{

return false;

}

}

//要在界面上顯示黑方已下棋子個數

//這個方法目前沒有實現 , 實際運行有bug , 棋子數一直為初始值沒有改變 , 所以沒有用這個方法

char* showBlackChessmanCount(black b)

{

char str[50];

sprintf(str , "black role chessman count:%d" , b.getChessmanCount());

return str;

}

};

主函數運行:

#include

#include"chessboard.h"

using namespace std;

int main()

{

chessboard chman;

chman.drawchessboard();

chman.playchess();

}

用時兩天,希望大家喜歡!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的ege函数库_基于c++ ege图形库实现五子棋游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。