1. 程式人生 > 其它 >c小遊戲-三子棋

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的棋盤,如果棋盤大小改變,那程式碼又要重新修改,不過今天的任務便是先出這樣一份三字棋便可。

感謝大佬觀看到這。如果程式碼中有哪些不足之處也請大家多多指出。