C語言實作三子棋
C語言實作三子棋要從以下幾個方面進行考慮:
- 列印選單界面
- 列印棋盤
- 玩家下棋
- 電腦下棋
- 判斷輸贏
這次我們仍然采用分檔案進行書寫,建立三個檔案,test.c, game.c,game.h,
test.c用來實作程式的主體
game.c 用來對主體函式進行封裝
game.h存放頭檔案,行數和列數以及對函式的定義
test.c和game.h的代碼如下:
//test.c
#include"game.h"
void menu()
{
printf("\t\t 三子棋小游戲\n" );
printf( "\t\t ---------------------\n");
printf( "\t\t|\t1.play\t |\n");
printf( "\t\t|\t0.exit\t |\n");
printf("\t\t ---------------------\n");
}
void game()
{
char board[ROW][LOW] = { 0 };
char ret = 0;
InBoard(board, ROW, LOW);//初始化陣列
Print_board(board, ROW, LOW);//列印棋盤
while (1)
{
Player_Move(board, ROW, LOW);//玩家走,用*號表示
Print_board(board, ROW, LOW);//電腦走,用#號表示
ret = Is_Winner(board, ROW, LOW);//判斷游戲是否繼續
if (ret != 'c')
{
break;
}
Computer_Move(board, ROW, LOW);
Print_board(board, ROW, LOW);
ret = Is_Winner(board, ROW, LOW);
if (ret != 'c')
{
break;
}
}
//判斷輸贏
if (ret == '*')
{
printf("玩家贏\n");
}
else if (ret == '#')
{
printf("電腦贏\n");
}
else
{
printf("平局\n");
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請輸入您要實作的功能:>\n");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("輸入錯誤,請重新選擇\n");
break;
}
} while (input);
return 0;
}
//game.h
#pragma once
#include<stdio.h>
#include<time.h>
#define ROW 3
#define LOW 3
void InBoard(char board[ROW][LOW], int row, int low);
void Print_board(char board[ROW][LOW], int row, int low);
void Player_Move(char board[ROW][LOW], int row, int low);
void Computer_Move(char board[ROW][LOW], int row,int low);
char Is_Winner(char board[ROW][LOW], int row, int low);
//# 電腦贏
//*玩家贏
//c 代表還要繼續
//Q 代表平局
在程式的主體部分定義一個3*3的陣列,用來存放玩家和電腦所走的內容,將其初始化為空格;然后定義函式實作三子棋基礎功能,
接下來依次分析各個函式的書寫:
1.列印開始選單
定義一個menu函式,里面用最基礎的printf函式列印選單界面,輸入1代表玩游戲,輸入0代表退出游戲,
void menu()
{
printf("\t\t 三子棋小游戲\n" );
printf( "\t\t ---------------------\n");
printf( "\t\t|\t1.play\t |\n");
printf( "\t\t|\t2.exit\t |\n");
printf("\t\t ---------------------\n");
}
顯示效果如下:
2.列印棋盤界面
定義Print_board(board, ROW, LOW)函式,傳入存放所走內容的陣列,行數及列數
```c
```c
void Print_board(char board[ROW][LOW], int row, int low)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < low; j++)
{
printf("%c ",board[i][j]);
if (j < low - 1)
printf(" |");
}
printf("\n");
for (int j = 0; j < low; j++)
{
printf("---");
if (j < low - 1)
printf("|");
}
printf("\n");
}
}
顯示效果如下:

3.玩家下棋
定義Player_Move函式實作玩家下棋的功能
void Player_Move(char board[ROW][LOW], int row, int low)
{
int x = 0, y = 0;
printf("玩家走:>\n");
while (1)
{
printf("請輸入要下的坐標:>");
scanf_s("%d%d", &x, &y);
//判斷x,y坐標的合法性
if (x >= 1 && x <= row && y >= 1 && y <=low)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("該坐標已被占用\n");
}
}
else
{
printf("坐標非法,請重新輸入!\n");
}
}
}
4.電腦下棋
void Computer_Move(char board[ROW][LOW], int row, int low)
{
int x = 0;
int y = 0;
while (1)
{
printf("電腦走\n");
x = rand() % row;
y = rand() % low;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
5.判斷勝負
char Is_Winner(char board[ROW][LOW], int row, int low)
{
//判斷一行元素是否相等
for (int i = 0; i < low; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ')
{
return board[i][0];
}
}
//判斷一列元素是否相等
for (int i = 0; i < row; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[2][i] != ' ')
{
return board[0][i];
}
}
//判斷對角線是否相等
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[1][1];
}
//判斷棋盤是否走滿,為走滿利用Is_Full函式回傳0,然后回傳c代表游戲繼續,否則回傳Q代表平局;
int ret=Is_Full(board, ROW, LOW);
if (ret == 0)
{
return 'c';
}
if (ret == 1)
{
return 'Q';
}
}
game.c源檔案如下
#include"game.h"
void InBoard(char board[ROW][LOW], int row, int low)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < low; j++)
{
board[i][j] = ' ';
}
}
}
void Print_board(char board[ROW][LOW], int row, int low)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < low; j++)
{
printf("%c ",board[i][j]);
if (j < low - 1)
printf(" |");
}
printf("\n");
for (int j = 0; j < low; j++)
{
printf("---");
if (j < low - 1)
printf("|");
}
printf("\n");
}
}
void Player_Move(char board[ROW][LOW], int row, int low)
{
int x = 0, y = 0;
printf("玩家走:>\n");
while (1)
{
printf("請輸入要下的坐標:>");
scanf_s("%d%d", &x, &y);
//判斷x,y坐標的合法性
if (x >= 1 && x <= row && y >= 1 && y <=low)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("該坐標已被占用\n");
}
}
else
{
printf("坐標非法,請重新輸入!\n");
}
}
}
void Computer_Move(char board[ROW][LOW], int row, int low)
{
int x = 0;
int y = 0;
while (1)
{
printf("電腦走\n");
x = rand() % row;
y = rand() % low;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int Is_Full(char board[ROW][LOW], int row, int low)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < low; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char Is_Winner(char board[ROW][LOW], int row, int low)
{
//判斷一行元素是否相等
for (int i = 0; i < low; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ')
{
return board[i][0];
}
}
//判斷一列元素是否相等
for (int i = 0; i < row; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[2][i] != ' ')
{
return board[0][i];
}
}
//判斷對角線是否相等
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[1][1];
}
//判斷棋盤是否走滿,為走滿利用Is_Full函式回傳0,然后回傳c代表游戲繼續,否則回傳Q代表平局;
int ret=Is_Full(board, ROW, LOW);
if (ret == 0)
{
return 'c';
}
if (ret == 1)
{
return 'Q';
}
}
整個代碼實作效果如下:

以上便是C語言實作三子棋的全部內容了,如果你喜歡我的文章請多多評論,轉發,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252215.html
標籤:其他
下一篇:洛谷P2802 回家-最新題解
