今天帶來一個小遊戲——五子棋,用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 群內有大量的項目開發和新手教學影片!