序
很多時候,心里明明不是那樣想的,卻控制不了自己而說出相反的話,
嗨,這里是狐貍~~
今天是2021年的12月16日,今天不知為啥充滿了圣誕節的氛圍,明明距離圣誕節還有一段時間,不知道大家有沒有這種感覺,但有一說一,這快到圣誕節,你們想好對圣誕老人許下什么愿望了嘛,過幾天我看有沒有時間出一期圣誕特輯,教大家用代碼來過圣誕節,
扯得有點遠了,回歸正題,前幾天發了有關資料結構的兩個實驗,反響并不是很好,是因為大家覺得太難,還是有其他原因呢,希望大家可以盡早告知,好叭,今天整點簡單的,我們來寫個游戲專案——《五子棋》,
專案簡介
五子棋的棋具與圍棋通用,是一種傳統的棋種,有兩種玩法,
一種是雙方分別使用黑白兩色的棋子,下在棋盤直線與橫線的交叉點上,先形成五子連線者獲勝,還有一種是自己形成五子連線就替換對方任意一枚棋子,被替換的棋子可以和對方交換棋子,最后以先出完所有棋子的一方為勝,
五子棋容易上手,老少皆宜,而且趣味橫生,引人入勝:它不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養性,
我們今天來完成第一種玩法,讓我們一起來實作它,
游戲規則
(1)對局雙方各執一色棋子,
(2)空棋盤開局,
(3)黑先、白后,交替下子,每次只能下一子,
(4)棋子下在棋盤的空白點上,棋子下定后,不得向其它點移動,不得從棋盤上拿掉或拿起另落 別處,
(5)黑方的第一枚棋子必須下在天元點上,即中心交叉點
(6)輪流下子是雙方的權利,但允許任何一方放棄下子權(即:PASS權),
五子棋對局,執行黑方指定開局、三手可交換、五手兩打的規定,整個對局程序中黑方有禁手,白方無禁手,黑方禁手有三三禁手、四四禁手和長連禁手三種,
專案思路
1、繪制棋盤 void drawqp(void)
2、定義棋子的結構體 struct Sor、
3、游戲初始化 void init(void)
4、判斷輸贏 void win(void)
5、游戲更新 void gameplay(void)
6、游戲結束 void gameover(void)
專案代碼
1、結構體
struct Sor
{
int x;
int y;/*x,y表示當前游標的位置*/
int yes[N][N];/* 0表示無棋子,1表示白色棋子,2表示黑色棋子*/
int kao;/* 1表示白棋準備落子,2表示黑棋落子*/
int ok;/*1表示白棋勝出,2表示黑棋勝出*/
}sor;
2、初始化
void init(void)
{
int driver=DETECT,mode=0;
registerbgidriver(EGAVGA_driver);
initgraph(&driver,&mode,"");
}
3、繪畫函式
void drawqp(void)/*畫棋盤*/
{
setcolor(3);
for(i=50;i<=(N-1)*20+30;i+=20)
{
line(50,i,(N-1)*20+30,i);
line(i,50,i,(N-1)*20+30);
}
setcolor(11);
for(i=1;i<3;i++)
{
circle((N-1)*10+40,(N-1)*10+40,i);
circle(130,130,i);
circle(130,330,i);
circle(330,130,i);
circle(330,330,i);
}
}
4、游標位置
void place(void)/*畫出游標的位置*/
{
line(sor.x-10,sor.y-10,sor.x-7,sor.y-10);
line(sor.x-10,sor.y-10,sor.x-10,sor.y-7);
line(sor.x-10,sor.y+10,sor.x-10,sor.y+7);
line(sor.x-10,sor.y+10,sor.x-7,sor.y+10);
line(sor.x+10,sor.y-10,sor.x+10,sor.y-7);
line(sor.x+10,sor.y-10,sor.x+7,sor.y-10);
line(sor.x+10,sor.y+10,sor.x+7,sor.y+10);
line(sor.x+10,sor.y+10,sor.x+10,sor.y+7);
}
5、輸贏判斷
void win(void)/*判斷是否勝出*/
{
for(i=1;i<N;i++)
{
for(j=1;j<N;j++)
{
if(((j+4)<N&&sor.yes[i][j]!=0&&
sor.yes[i][j]==sor.yes[i][j+1]&&
sor.yes[i][j+1]==sor.yes[i][j+2]&&
sor.yes[i][j+2]==sor.yes[i][j+3]&&
sor.yes[i][j+3]==sor.yes[i][j+4])||
((i+4)<N&&sor.yes[i][j]!=0&&
sor.yes[i][j]==sor.yes[i+1][j]&&
sor.yes[i+1][j]==sor.yes[i+2][j]&&
sor.yes[i+2][j]==sor.yes[i+3][j]&&
sor.yes[i+3][j]==sor.yes[i+4][j])||
((i+4)<N&&(j+4)<N&&sor.yes[i][j]!=0&&
sor.yes[i][j]==sor.yes[i+1][j+1]&&
sor.yes[i+1][j+1]==sor.yes[i+2][j+2]&&
sor.yes[i+2][j+2]==sor.yes[i+3][j+3]&&
sor.yes[i+3][j+3]==sor.yes[i+4][j+4])||
((i+4)<N&&j>4&&sor.yes[i][j]!=0&&
sor.yes[i][j]==sor.yes[i+1][j-1]&&
sor.yes[i+1][j-1]==sor.yes[i+2][j-2]&&
sor.yes[i+2][j-2]==sor.yes[i+3][j-3]&&
sor.yes[i+3][j-3]==sor.yes[i+4][j-4]))
{
if(sor.yes[i][j]==1)
sor.ok=1;
else
sor.ok=2;
break;
}
}
if(sor.ok!=0)
break;
}
}
6、游戲結束
void gameover(void)
{
if(sor.ok==1)
{
drawmat(bai64H,64,488,119,0);
drawmat(bai64H,64,490,120,4);
}
else
{
drawmat(hong64H,64,488,119,0);
drawmat(hong64H,64,490,120,4);
}
drawmat(fang64H,64,488,189,0);
drawmat(huo64H,64,488,259,0);
drawmat(sheng64H,64,488,329,0);
drawmat(fang64H,64,490,190,4);
drawmat(huo64H,64,490,260,4);
drawmat(sheng64H,64,490,330,4);
}
7、游戲更新
void gameplay(void)
{
for(i=1;i<N;i++)/*棋盤初始化*/
for(j=1;j<N;j++)
sor.yes[i][j]=0;
sor.kao=1; /*白棋先走*/
sor.ok=0;/*雙方勝負未分*/
sor.x=(N-1)*10+40;
sor.y=(N-1)*10+40;/*初始化游標,將游標定位在棋盤的中心*/
setcolor(15);
place();
while(1)
{
xandy();
key=bioskey(0);
if(key==esc)
break;
/*白棋鍵盤移動*/
else if(key==up&&sor.y>50&&sor.kao==1)
{
setcolor(0);place();
sor.y-=20;
}
else if(key==down&&sor.y<(N-1)*20+30&&sor.kao==1)
{
setcolor(0);place();
sor.y+=20;
}
else if(key==left&&sor.x>50&&sor.kao==1)
{
setcolor(0);place();
sor.x-=20;
}
else if(key==right&&sor.x<(N-1)*20+30&&sor.kao==1)
{
setcolor(0);place();
sor.x+=20;
}
/*紅方鍵盤移動*/
else if(key==W&&sor.y>50&&sor.kao==2)
{
setcolor(0);place();
sor.y-=20;
}
else if(key==S&&sor.y<(N-1)*20+30&&sor.kao==2)
{
setcolor(0);place();
sor.y+=20;
}
else if(key==A&&sor.x>50&&sor.kao==2)
{
setcolor(0);place();
sor.x-=20;
}
else if(key==D&&sor.x<(N-1)*20+30&&sor.kao==2)
{
setcolor(0);place();
sor.x+=20;
}
else if(key==space&&sor.yes[(sor.x-30)/20][(sor.y-30)/20]==0&&sor.kao==2)
{
setcolor(13);
for(i=1;i<=9;i++)
{
circle(sor.x,sor.y,i);
delay(10000);
}
sor.yes[(sor.x-30)/20][(sor.y-30)/20]=2;
sor.kao=1;
win();
if(sor.ok!=0)
{
gameover();
break;
}
}
else if(key==enter&&sor.yes[(sor.x-30)/20][(sor.y-30)/20]==0&&sor.kao==1)
{
setcolor(15);
for(i=1;i<=9;i++)
{
circle(sor.x,sor.y,i);
delay(10000);
}
sor.yes[(sor.x-30)/20][(sor.y-30)/20]=1;
sor.kao=2;
win();
if(sor.ok!=0)
{
gameover();
break;
}
}
else
continue;
if(sor.ok!=0)
break;
if(sor.kao==1)
setcolor(15);
else
setcolor(13);
place();
}/*endwhile(1)*/
}
8、主函式
main()
{
while(1)
{
init();
cleardevice();
clew();
drawqp();
setfillstyle(SOLID_FILL,7);
bar(430,50,620,410);
show();
gameplay();
setcolor(15);
settextstyle(0,0,2);
outtextxy(230,450,"CONTINUE(Y/N)?");
while(1)
{
key=bioskey(0);
if(key==Y||key==n||key==esc)
break;
}
if(key==n||key==esc)
break;
}
closegraph();
}
效果演示

總結
這個專案難度還是有一些的,大家也知道只要有關棋類的都會包含點演算法進去,這里面也是有一些關于演算法的知識,不知道大家看完后有沒有完全理解,不能理解的歡迎在評論區一起討論,我會盡我所能的去回復大家,
好了,大家還想看什么一定要在評論區告訴我,后續我還會發布更多的專案源或者學習資料,希望大家可以持續關注,有什么問題可以回帖留言,想要C/C++學習資料以及其他專案的原始碼的可以加群【1083227756】了解,想要對程式員的未來發展有興趣的可以關注微信公眾號:【狐貍的編碼時光】,希望和大家一起學習進步!!!
另外還有
視頻講解
https://www.bilibili.com/video/BV1aF411z75g/https://www.bilibili.com/video/BV1aF411z75g/
https://www.bilibili.com/video/BV1aF411z75g/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/384419.html
標籤:其他
上一篇:專注于嵌入式/物聯網的webrtc native庫metaRTC
下一篇:二、計算機就是數學
