三子棋
- 三子棋簡介
- 具體思路
- 代碼實作
- 頭檔案game.h
- 主函式main.c
- 游戲檔案game.c
- 棋盤顯示函式
- 玩家落子函式
- 電腦落子函式
- 判斷函式
- 具體代碼
三子棋簡介
是黑白棋的一種,三子棋是一種民間傳統游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等,將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了,但是,有很多時候會出現和棋的情況,
具體思路
玩家和電腦各自執棋,首先在螢屏上顯示棋盤狀況(規定玩家的棋子為’x‘,電腦的棋子為’0‘),玩家通過輸入坐標選擇下一步落子的位置,代碼判斷局勢情況,若沒有分出勝負且棋盤未滿則電腦落子,電腦以生成亂數的方式走,在每一次玩家或者電腦落子后都要判斷當前情況,若棋盤滿則為和棋,
代碼實作
這個小游戲我采用的是多檔案編程,所有的頭檔案整合在game.h中,game.c為所有的游戲模塊函式,main函式為主體部分,
頭檔案game.h
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<time.h>
#include<windows.h>
#define ROW 3
#define COL 3
#define P_COLOR 'X'
#define C_COLOR 'O'
void Menu(); //選單顯示函式
void DrawBoard(char board[][COL], int row, int col); //棋盤顯示函式
void PlayMove(char board[][COL], int row, int col); //玩家落子函式
void ComputerMove(char board[][COL], int row, int col); //電腦落子函式
char Judge(char board[][COL], int row, int col); //判斷哪一方勝出函式
void Game(); //主游戲函式
#pragma warning(disable:4996)
#endif
在頭檔案中定義棋盤的大小,3行3列 #define ROW 3,#define COL 3,玩家落子為’x‘,電腦落子為’o‘
主函式main.c
int main() {
int quit=0;
while (!quit) {
int select;
Menu();
printf("請輸入你的選項\n");
scanf("%d", &select);
switch (select) {
case 1:
Game();
break;
case 2:
printf("退出!");
quit =1 ;
break;
default:
printf("你輸入的有誤,請重新輸入\n");
break;
}
}
printf("Bye,Bye!\n");
system("pause");
return 0;
}
主函式為整個游戲的控制部分,通過玩家輸入的數字來執行各部分代碼,
游戲檔案game.c
棋盤顯示函式
void DrawBoard(char board[][COL], int row, int col) {
printf("\n\n\n");
printf(" | 1 | 2 | 3 |\n");
printf("--------------\n");
for (int i = 0; i < row; i++) {
printf("%d|", i + 1);
for (int j = 0; j < col; j++) {
printf(" %c |", board[i][j]);
}
printf("\n--------------\n");
}
}
對棋盤進行顯示,在每一行每一列標上序號,并且棋盤內容為空,
顯示如下

玩家落子函式
void PlayMove(char board[][COL], int row, int col) {
int x = 0;
int y = 0;
while (1) {
printf("請輸入你下一步的位置");
scanf("%d %d", &x, &y);
if (x < 1 || x>3 || y < 1 || y>3) {
printf("輸入有誤,請重新輸入\n");
continue;
}
if (board[x - 1][y - 1] != ' ') {
printf("該位置已有棋子,請重新輸入\n");
continue;
}
board[x - 1][y - 1] = P_COLOR;
return;
}
}
玩家通過鍵盤輸入落子的左邊,代碼判斷此位置是否輸入正確,輸入超過棋盤范圍會讓玩家重新輸入,如該位置已有棋子,也會讓玩家重新輸入,若判斷都沒有問題,則在棋盤該位置落子,
電腦落子函式
void ComputerMove(char board[][COL], int row, int col) {
while (1) {
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ') {
board[x][y] = C_COLOR;
break;
}
}
}
電腦落子的位置用<time.h>頭檔案的srand()函式的亂數種子生成亂數并取橫豎列的模除來滿足上述條件,并且在該位置為空的情況下落子,
判斷函式
char Judge(char board[][COL], int row, int col) {
for (int i = 0; i < row; i++) {
if (board[i][0] == board[i][1] && \
board[i][1] == board[i][2] && \
board[i][0] !=' ')
return board[i][0];
}
for (int i = 0; i < col; i++) {
if (board[0][i] == board[1][i] && \
board[1][i] == board[2][i] && \
board[0][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[0][2];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 'N';
}
}
}
return 'P';
}
三子棋獲勝的條件是橫或者豎或交叉連續三個棋子一樣則為獲勝,若棋盤滿后還未分出勝負,則為平局,滿足獲勝條件回傳’N‘,平局則回傳’P‘

具體代碼
// game.h
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<time.h>
#include<windows.h>
#define ROW 3
#define COL 3
#define P_COLOR 'X'
#define C_COLOR 'O'
void Menu(); //選單顯示函式
void DrawBoard(char board[][COL], int row, int col); //棋盤顯示函式
void PlayMove(char board[][COL], int row, int col); //玩家走
void ComputerMove(char board[][COL], int row, int col); //電腦走
char Judge(char board[][COL], int row, int col); //判斷哪一方勝出函式
void Game(); //主游戲函式
#pragma warning(disable:4996)
#endif
// game.c
#include"game.h"
void Menu() {
printf("------------------------------\n");
printf("------1.Enter Game------------\n");
printf("------2.Quit------------------\n");
printf("------------------------------\n");
}
void DrawBoard(char board[][COL], int row, int col) {
printf("\n\n\n");
printf(" | 1 | 2 | 3 |\n");
printf("--------------\n");
for (int i = 0; i < row; i++) {
printf("%d|", i + 1);
for (int j = 0; j < col; j++) {
printf(" %c |", board[i][j]);
}
printf("\n--------------\n");
}
}
void PlayMove(char board[][COL], int row, int col) {
int x = 0;
int y = 0;
while (1) {
printf("請輸入你下一步的位置");
scanf("%d %d", &x, &y);
if (x < 1 || x>3 || y < 1 || y>3) {
printf("輸入有誤,請重新輸入\n");
continue;
}
if (board[x - 1][y - 1] != ' ') {
printf("該位置已有棋子,請重新輸入\n");
continue;
}
board[x - 1][y - 1] = P_COLOR;
return;
}
}
void ComputerMove(char board[][COL], int row, int col) {
while (1) {
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ') {
board[x][y] = C_COLOR;
break;
}
}
}
char Judge(char board[][COL], int row, int col) {
for (int i = 0; i < row; i++) {
if (board[i][0] == board[i][1] && \
board[i][1] == board[i][2] && \
board[i][0] !=' ')
return board[i][0];
}
for (int i = 0; i < col; i++) {
if (board[0][i] == board[1][i] && \
board[1][i] == board[2][i] && \
board[0][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[0][2];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 'N';
}
}
}
return 'P';
}
void Game() {
srand((unsigned long)time(NULL));
char board[ROW][COL];
memset(board, ' ',sizeof(board));
char win = '\0';
do {
DrawBoard(board, ROW, COL);
PlayMove(board, ROW, COL);
win = Judge(board, ROW, COL);
if (win != 'N') {
break;
}
ComputerMove(board, ROW, COL);
win = Judge(board, ROW, COL);
if (win != 'N') {
break;
}
} while (1);
switch (win) {
case(P_COLOR):
printf("You win\n");
break;
case(C_COLOR):
printf("You lose\n");
break;
case('P'):
printf("平局\n");
default:
break;
}
DrawBoard(board, ROW, COL);
return;
}
// main.c
#include "game.h"
int main() {
int quit=0;
while (!quit) {
int select;
Menu();
printf("請輸入你的選項\n");
scanf("%d", &select);
switch (select) {
case 1:
Game();
break;
case 2:
printf("退出!");
quit =1 ;
break;
default:
printf("你輸入的有誤,請重新輸入\n");
break;
}
}
printf("Bye,Bye!\n");
system("pause");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/204188.html
標籤:其他
