三子棋小游戲
- 三子棋游戲簡介
- 一、分析及實作
- 1.棋盤
- 2.落子
- 3.判斷輸贏
- 二、程式演示
- 三.完整代碼
- 1.main.c
- 2.game.c
- 3.game.h
- 總結
三子棋游戲簡介

這是一個簡單的三子棋小游戲,估計大家小時候都玩兒過,只要能連成三個,無論是行,列還是對角線,就可以勝利了,是不是很簡單呢,那我們來嘗試一下用C語言來寫一個簡單的三子棋游戲,
一、分析及實作
1.棋盤
想要玩游戲,那首先應該有一個棋盤吧,因為我們玩兒的是三子棋,所以來說一個3X3的棋盤應該可以滿足要求,這里使用了一個三行三列的二維陣列來模擬三子棋的棋盤,
有了棋盤之后在開始游戲之前先把棋盤初始化一下,這樣看起來更方便,
//初始化棋盤
void InitBoard(char board[][COL], int row, int col)
{
int i = 0;
for (i = 0; i < ROW; i++)
{
int j = 0;
for (j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
之后呢,再來列印看看,要優化一下再列印出來
//列印棋盤
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
printf("+---+---+---+\n");
int j = 0;
for (j = 0; j < col; j++)
{
printf("| %c ", board[i][j]);
}
printf("|\n");
}
printf("+---+---+---+\n");
}
這是我設計的一個簡單的小棋盤

棋盤的風格和樣式可以根據自己的喜好更改,
好了,現在我們有了棋盤,有了列印出來的樣子,那接下來就應該向棋盤上落子了!
2.落子
下棋呢可以是兩個人下,當然也可以自己和電腦下棋,這里我選擇和電腦對弈,這樣就需要兩個功能了,一個是玩家下棋,一個就是電腦下棋了,
//玩家下棋
void Player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:->");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'O';
break;
}
else
{
printf("坐標已被占用!\n");
}
}
else
{
printf("坐標非法,請重新輸入!\n");
}
}
}
為了將玩家和電腦區分開,需要使用兩個不一樣的符號來代表玩家的落子和電腦的落子 玩家----O,電腦----X
//電腦下棋
void Computer_move(char board[ROW][COL], int row, int col)
{
printf("電腦下棋:\n");
while (1)
{
int x = rand() % ROW;
int y = rand() % COL;
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
}
}
玩家的落子可以通過輸入坐標,而電腦呢,我們讓他隨機選擇合理的坐標范圍進行落子,
那隨著玩家和電腦相繼落子,我們就需要判斷誰獲勝了,或者平局的情況,
3.判斷輸贏
//判斷輸贏
char Is_win(char board[ROW][COL], int row, int col)
{
//判斷行列
int i = 0;
for (i = 0; i < ROW; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
return board[i][0];
}
if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[0][i];
}
}
//判斷對角線
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2])
|| (board[0][2] == board[1][1] && board[1][1] == board[2][0]))
{
return board[1][1];
}
if (Is_full(board, row, col))
{
return 'D'; //平局
}
return 'C'; //Continue表示繼續
}
如果棋盤滿了,還沒有分出勝負的話就是平局的情況,
為了判斷棋盤是否滿了,我們也需要相應的功能來簡化我們的代碼,
//判斷棋盤是否滿了
int Is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < ROW; i++)
{
int j = 0;
for (j = 0; j < COL; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
二、程式演示

三.完整代碼
以下是完整代碼,有需要的可以查看,我用了三個檔案來存盤,兩個.c檔案用來書寫主要代碼,一個.h檔案用來存盤預處理指令和宏定義
1.main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main()
{
test();
return 0;
}
2.game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("**********************************\n");
printf("********** 1.play ************\n");
printf("********** 0.exit ************\n");
printf("**********************************\n");
}
void game()
{
char board[ROW][COL] = {0};
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
char ret = 0;
while (1)
{
Player_move(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Is_win(board, ROW, COL);
if (ret == 'O')
{
printf("玩家贏!\n");
break;
}
if (ret == 'D')
{
printf("平局\n");
break;
}
Computer_move(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Is_win(board, ROW, COL);
if (ret == 'X')
{
printf("電腦贏!\n");
break;
}
}
}
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("請選擇:->");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲!\n");
break;
default:
printf("輸入錯誤,請重新輸入!\n");
break;
}
} while (input);
}
//初始化棋盤
void InitBoard(char board[][COL], int row, int col)
{
int i = 0;
for (i = 0; i < ROW; i++)
{
int j = 0;
for (j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
//列印棋盤
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
printf("+---+---+---+\n");
int j = 0;
for (j = 0; j < col; j++)
{
printf("| %c ", board[i][j]);
}
printf("|\n");
}
printf("+---+---+---+\n");
}
//玩家下棋
void Player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:->");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'O';
break;
}
else
{
printf("坐標已被占用!\n");
}
}
else
{
printf("坐標非法,請重新輸入!\n");
}
}
}
//電腦下棋
void Computer_move(char board[ROW][COL], int row, int col)
{
printf("電腦下棋:\n");
while (1)
{
int x = rand() % ROW;
int y = rand() % COL;
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
}
}
//判斷棋盤是否滿了
int Is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < ROW; i++)
{
int j = 0;
for (j = 0; j < COL; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
//判斷輸贏
char Is_win(char board[ROW][COL], int row, int col)
{
//判斷行列
int i = 0;
for (i = 0; i < ROW; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
return board[i][0];
}
if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[0][i];
}
}
//判斷對角線
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2])
|| (board[0][2] == board[1][1] && board[1][1] == board[2][0]))
{
return board[1][1];
}
if (Is_full(board, row, col))
{
return 'D'; //平局
}
return 'C'; //Continue表示繼續
}
3.game.h
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<math.h>
#include<time.h>
void test();
void menu();
void InitBoard(char board[ROW][COL], int, int);
void DisplayBoard(char board[ROW][COL], int, int);
void Player_move(char board[ROW][COL], int, int);
void Computer_move(char board[ROW][COL], int, int);
char Is_win(char board[ROW][COL], int, int);
總結
以上就是一個完整的三子棋小游戲的C語言實作版本,謝謝觀看!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356194.html
標籤:其他
上一篇:不成熟掃雷的實作
下一篇:用模塊化思維方式打出掃雷游戲
