c小遊戲-三子棋
三子棋小遊戲
經過幾天學習,為了將之前學習的知識加以運用,於是寫了一個簡單的三子棋。
在寫之前,先將遊戲實現流程梳理一遍,
按照我們平常的遊戲經驗,進入遊戲後,首先得有選單,可以讓玩家知道如何進入遊戲。
在進入遊戲後,需要一個3*3的棋盤。遊戲一開始,棋盤內的內容需要初始化為空格
將棋盤打印出來後,等待玩家下棋後,電腦在接著下。在每一步下棋後,都需要確認遊戲是否已出現勝負或者和棋。
在確認棋盤內還有空格,且沒有出現三字連線的情況,那就要再重複玩家下棋,確認棋盤,電腦下棋,確認棋盤,直到出現勝負為止。
勝負確認後,再重新列印選單,確認是否重新開始遊戲。
分析完流程後,便可以開始寫三子棋了。
#include<stdio.h> #include<windows.h> #define ROW 3 #define COW 3 #include<stdlib.h> #include<time.h> void Initboard(char board[ROW][COW], int row, int cow); void Print(char board[ROW][COW], int row, int cow); void Playchess(char board[ROW][COW], int row, int cow); void computer(char board[ROW][COW], int row, int cow); char Is`win(char board[ROW][COW], int row, int cow);
先將遊戲的選單頁面給出。在列印選單前順便將螢幕清屏。
void menu()
{
system("cls");
printf("\n************************************\n");
printf("*************1 開始遊戲*************\n");
printf("*************0 退出遊戲*************\n");
printf("************************************\n");}`
選單列印完後,便要由玩家選擇是否開始遊戲了
int main() {int n; do { menu(); scanf("%d", &n); switch (n) { case 1: game(); break; case 0: printf("退出遊戲"); break; default: printf("輸入錯誤"); break; } } while (n); //通過玩家選擇的值,確定是否進入遊戲。或者退出遊戲。
在進入遊戲後。就要進入遊戲主體,而三子棋的遊戲思路就是玩家下棋,判斷勝負,電腦下棋,判斷勝負,每一次下完棋後,都將棋盤當前畫面列印,那麼用程式碼表示就是:
void game() { char a; char board[ROW][COW] = { 0 }; Initboard(board, ROW, COW); system("cls"); Print(board, ROW, COW); while (1) { Playchess(board, ROW, COW); a = Iswin(board, ROW, COW); if (a == 'a') { printf("和局\n"); break; } else if (a == '*') { printf("玩家勝"); break; } else if (a == '#') { printf("電腦勝"); break; } Print(board, ROW, COW); computer(board, ROW, COW); Print(board, ROW, COW); a = Iswin(board, ROW, COW); if (a == 'a') { printf("和局\n"); break; } else if (a == '*') { printf("玩家勝"); break; } else if (a == '#') { printf("電腦勝"); break; } } printf("按任意鍵繼續\n"); getch(); }
現在為止已經將大致的邏輯寫清,只剩將每個函式的內容補充。
首先是建立一個3* 3的棋盤。也就是一個3*3的二維陣列,再將陣列內容全部初始化為空格’ ’;
void Initboard(char board[ROW][COW], int row, int cow)//初始化棋盤
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < cow; j++)
{
board[i][j] = ' ';
}
}
}
初始化好之後,自然要將棋盤打印出來,這樣才能讓使用者選擇座標。
void Print(char board[ROW][COW], int row, int cow)//列印棋盤
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < cow; j++)
{
printf(" %c ", board[i][j]);
if (j != cow - 1)//在棋盤列印到最後一排時不列印 ’|’
{
printf("|");
}
}
printf("\n");
for (j = 0; j < cow; j++)
{
if (i < row - 1)
{
printf("---");
if (j < cow - 1)
{
printf("|");
}
}
}printf("\n");
}
}
列印完棋盤後,需要使用者輸入座標下棋,那我們就寫一個下棋函式
void Playchess(char board[ROW][COW], int row, int cow)//玩家下棋
{
int x = 0, y = 0;
while (1)
{
printf("請輸入座標:>\n");
scanf("%d%d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= cow)
{
if (board[x-1][y-1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("座標重複!");
}
}
else
{
printf("輸入錯誤!\n");
}
}
}
每下完一步,遊戲就有可能出現勝負,或者棋盤已被下滿的情況,所以我們要再寫一個函式確認。
char deuce(char board[ROW][COW], int row, int cow)//判斷棋盤是否還要空位
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < cow; j++)
{
if (board[i][j] == ' ')
{
return 'C';
}
}
}
return 'a';
}
char Iswin(char board[ROW][COW], int row, int cow)//判斷遊戲是否出現勝利條件或者棋盤是否還有空位
{
int i;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
return board[i][1];
}
else if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[1][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] || board[2][0] == board[1][1] && board[0][2])
{
return board[1][1];
}
return(deuce(board, row, cow));//當遍歷完沒有出現勝利條件,便判斷棋盤內是否還有空位。
}
通過函式返回的值進行確認。
while (1)
{
Playchess(board, ROW, COW);
a = Iswin(board, ROW, COW);
if (a == 'a')
{
printf("和局\n");
break;
}
else if (a == '*')
{
printf("玩家勝");
break;
}
else if (a == '#')
{
printf("電腦勝");
break;
}
如果遊戲繼續,那就回到玩家下棋,再進行迴圈,直到出現勝負或者和局break跳出後再結束迴圈,回到選單介面詢問是否進入下次遊戲。
到此,一個三子棋便新鮮出爐了。但是在這個三子棋中,判斷勝利的程式碼是鎖死只能判斷3*3的棋盤,如果棋盤大小改變,那程式碼又要重新修改,不過今天的任務便是先出這樣一份三字棋便可。
感謝大佬觀看到這。如果程式碼中有哪些不足之處也請大家多多指出。