晨夕老師 · 程式 ·

C語言打造 ——緊張刺激的五子棋

今天帶來一個小遊戲——五子棋,用C語言打造,裡面涉及的知識點也並不是很多的。數組 循環 圖形庫 函數調用 註:不要忘了安裝好圖形庫。

別說了來一把緊張刺激的五子棋吧!有興趣的同學可以加C語言C++學習交流群 496926338 群內有大量的項目開發和新手教學影片!

/*----------------------------------------------圖形庫 五子

棋--------------------------------------------------------------

晨夕

----------------------------------------------------------------------------------------------

--------------------------------*/

#include<stdio.h>

#include<graphics.h>

/*

思路:

1.內部實現運算

構造數組 賦值黑白棋

掃描數組 判斷

2.外部繪圖 接收用戶輸入

繪圖 輸入

遊戲過程

1.繪製棋盤

2.獲取用戶下子

3.判斷輸贏

*/

struct chess{

int x;

int y;

}ch, *pch;

#define M 10 //五子棋的大小

void game();//遊戲函數

struct chess* play(int map[][M+2], struct chess*pch);

int scan(int map[][M+2], int x, int y, int num);

int main()

{

initgraph(640, 480);//界面大小

while (1){

game();

if (MessageBox(0, L"重玩?", L"AGAIN", MB_OKCANCEL) == IDCANCEL)

break;

}

closegraph();

return 0;

}

void game()

{

pch = &ch;

int map[M+2][M+2] = { 0 };//初始化地圖數組

//黑棋為-1 白棋為1

//繪圖函數 根據數組繪製棋盤

setfillcolor(LIGHTGRAY);

//繪製棋盤

fillrectangle(0, 0,480,480);

for (int i = 40; i <= 440; i += 40)

{

line(40, i, 440, i);

line(i, 40, i,440);

}

setfillcolor(CYAN);

fillrectangle(480,0,640,160);

setfillcolor(DARKGRAY);

fillrectangle(480, 160, 640, 320);

setfillcolor(WHITE);

fillrectangle(480, 320, 640, 480);

//floodfill(2, 2,BLUE);

//每次點一下就描點

int i, j;

while (1)

{

setfillcolor(WHITE);

play(map,pch);

i = pch->x;

j = pch->y;

fillcircle(40 * i, 40 * j, 15);

map[i][j] = 1;

if (scan(map, i, j, 1))

{

MessageBox(0, L"白棋勝利", L"win", MB_OK);

break;

}

setfillcolor(BLACK);

play(map, pch);

i = pch->x;

j = pch->y;

fillcircle( 40 * i, 40 * j, 15);

map[i][j] = -1;

scan(map, i, j, -1);

if (scan(map, i, j, -1))

{

MessageBox(0, L"黑棋勝利", L"win", MB_OK);

break;

}

}

//掃描 描點

//int i, j;

//setfillcolor(WHITE);

//for (i = 0; i < 10; i++)

//{

//for (j = 0; j < 10; j++)

//{

//if (map[i][j] == 1)

//{

//fillcircle(40 + 40 * i, 40 + 40 * j, 15);

//}

//}

//}

//setfillcolor(BLACK);

//for (i = 0; i < 10; i++)

//{

//for (j = 0; j < 10; j++)

//{

//if (map[i][j] == -1)

//{

//fillcircle(40 + 40 * i, 40 + 40 * j, 15);

//}

//}

//}

}

//獲取用戶點的信息

struct chess* play(int map[][M+2],struct chess*pch)

{

MOUSEMSG msg;

while (1)

{

msg = GetMouseMsg();

switch (msg.uMsg)

{

case WM_LBUTTONDOWN:

//合適的滑鼠信息

//1.沒有下子 2.在棋盤上

if (msg.x <= 460 && msg.y <= 460 && msg.x >= 20 && msg.y >= 20)

{

//在棋盤裡面表示需要判斷是否下子 轉換為對應坐標

if (map[(msg.x - 20) / 40+1][(msg.y - 20) / 40+1] == 0)

{

//返回對應的x y的值

pch->x= (msg.x - 20) / 40+1;

pch->y = (msg.y - 20) / 40+1;

return pch;

}

}

break;

}

}

}

//判斷輸贏 1為贏

//兩個思路 每一次都掃描一次 或是直接掃描新點的部分

//這個地方有bug 待調試

int scan(int map[][M+2],int x,int y,int num)//掃描函數 直接掃描新點xy為坐標

{

//只需掃描四個方向 上下左右 外圈為0

int i,win1=1,win2=1,win3=1,win4=1;

//橫向判斷

for (i = 1; map[x][y - i] == num; i++, win1++);

for (i = 1; map[x][y + i] == num; i++, win1++);

//縱向判斷

for (i = 1; map[x-i][y] == num; i++, win2++);

for (i = 1; map[x+i][y] == num; i++, win2++);

//左斜

for (i = 1; map[x-i][y - i] == num; i++, win3++);

for (i = 1; map[x+i][y +i] == num; i++, win3++);

//右斜

for (i = 1; map[x+i][y - i] == num; i++, win4++);

for (i = 1; map[x-i][y +i] == num; i++, win4++);

if (win1 >= 5 || win2 >= 5 || win3 >= 5 || win4 >= 5)

{

//贏了

return 1;

}

else return 0;

}

//int scanfun(int map[][M], int num)

//{

//int i, j;

////分三個區域掃描

////左上

//for (i = 0; i < M - 5; i++)

//{

//for (j = 0; j < M - 5; j++)

//{

////

//}

//}

////左下

//for (i = M-5; i < M; i++)

//{

//for (j = 0; j < M - 5; j++)

//{

//

//}

//}

////右上

//for (i = 0; i < M - 5; i++)

//{

//for (j = M-5; j < M; j++)

//{

//

//}

//}

////右下不需檢查

//}

圖為網圖實例以實際操作為準!

有興趣的同學可以加C語言C++學習交流群 496926338 群內有大量的項目開發和新手教學影片!

聲明:文章觀點僅代表作者本人,PTTZH僅提供信息發布平台存儲空間服務。
喔!快樂的時光竟然這麼快就過⋯