前面的話:
作者水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!
我相信很多人都玩過三子棋,與朋友,家人,同學或者其他的人享受過三子棋的歡樂,
博主將會通過本文對C語言實作三子棋小游戲的簡單應用,
三子棋是黑白棋的一種,三子棋是一種民間傳統游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等,將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了,但是,有很多時候會出現和棋的情況,
如果兩個人都掌握了技巧,那么一般來說就是平棋,最大的好處就是隨便找個地方就可以玩這個簡單而有趣的游戲了,
三子棋小游戲設計目的
- 小游戲能夠反復玩,并且有一個簡單的選單,
- 玩家輸入棋盤坐標的形式下棋,與電腦(非常菜)能夠比賽,
- 能夠顯示實時棋況,
三子棋小游戲設計思路
-
使用do…while回圈和switch陳述句實作小游戲反復玩,并且玩家可以從選單選擇退出還是繼續游戲,
-
使用字符型二維陣列(3x3)儲存對戰程序中的字符,初始化的二維陣列內的資料全部為空格,’*‘代表玩家下的棋,’#'代表電腦下的棋,
-
棋盤的列印拆分成{【空格+陣列資料+空格】+【|】}+{【- - -】+【|】},然后通過回圈列印成棋盤,

-
玩家下棋部分根據輸入的有效坐標(玩家輸入的坐標一般從1開始,所以對資料處理時要將玩家輸入坐標減一),判斷陣列中是否為空格,如果是則替換成’*’,否則重新輸入,
-
電腦下棋部分通過亂數的生成,然后使用兩個亂數分別對行數(3)列數(3)取余得到余陣列成的坐標即電腦下棋的坐標,同理判斷對應陣列資料是否是空格,如果是則替換成’#’,否則重新生成隨機坐標,
-
裁決勝負部分通過判斷成行成列,對角線是否連續三個都是’*‘或者’#’,如果是回傳對應字符,否則再通過判斷陣列是否填滿來判斷是平局還是繼續下棋,
三子棋小游戲實作代碼
頭檔案 game.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//選單
void meau();
//游戲
void game();
//初始化陣列
void InitBoard(char pch[ROW][COL], int row, int col);
//列印三子棋棋盤
void PrintChess(char pch[ROW][COL], int row, int col);
//玩家下棋
void PlayerChess(char pch[ROW][COL], int row, int col);
//電腦下棋
void ComputerChess(char pch[ROW][COL], int row, int col);
//判決勝負
//'#'電腦贏,'*'玩家贏,'Q'平局,'C'繼續游戲
char IsWin(char pch[ROW][COL], int row, int col);
//判斷二維陣列是否滿
int IsFull(char pch[ROW][COL], int row, int col);
函式實作檔案 game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void meau()
{
printf("***********************************************\n");
printf("************* 歡迎來到三子棋游戲!*************\n");
printf("***********************************************\n");
printf("************* 1 進入游戲 **************\n");
printf("************* 0 退出游戲 **************\n");
printf("***********************************************\n");
}
void game()
{
char board[ROW][COL];//定義字符二維陣列
InitBoard(board, ROW, COL);//初始化陣列,將里面填滿空格
PrintChess(board, ROW, COL);//列印棋盤
//下棋
char ret = 0;
while (1)
{
PlayerChess(board, ROW, COL);
PrintChess(board, ROW, COL);//列印棋盤
//判決勝負
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
ComputerChess(board, ROW, COL);
PrintChess(board, ROW, COL);//列印棋盤
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
printf("玩家獲勝!\n");
else if (ret == '#')
printf("電腦獲勝!\n");
else
printf("平局!\n");
}
//初始化陣列
void InitBoard(char pch[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
pch[i][j] = ' ';
}
}
}
//列印三子棋棋盤
void PrintChess(char pch[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ",pch[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
for (j = 0; j < col; j++)
{
if (i < row - 1)
{
printf("---");
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
//玩家下棋
void PlayerChess(char pch[ROW][COL], int row, int col)
{
printf("玩家下棋>\n");
int x = 0;
int y = 0;
while (1)
{
printf("請輸入目的坐標:>");
scanf("%d%d", &x, &y);
if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
{
if (pch[x - 1][y - 1] == ' ')
{
pch[x - 1][y - 1] = '*';
break;
}
else
printf("棋盤目的坐標位置被占用,請重新輸入坐標,\n");
}
else
{
printf("坐標越界,請重新輸入!\n");
}
}
}
//電腦下棋
void ComputerChess(char pch[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦下棋>\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (pch[x][y] == ' ')
{
pch[x][y] = '#';
break;
}
}
}
//判決勝負
//'#'電腦贏,'*'玩家贏,'Q'平局,'C'繼續游戲
char IsWin(char pch[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)//行
{
if ((pch[i][0] == pch[i][1] && pch[i][1] == pch[i][2]) && pch[i][1] != ' ')
return pch[i][1];
}
for (i = 0; i < col; i++)//列
{
if ((pch[0][i] == pch[1][i] && pch[1][i] == pch[2][i]) && pch[1][i] != ' ')
return pch[1][i];
}
if ((pch[0][0] == pch[1][1] && pch[1][1] == pch[2][2]) && pch[1][1] != ' ')//對角線
return pch[1][1];
else if ((pch[0][2] == pch[1][1] && pch[1][1] == pch[2][0]) && pch[1][1] != ' ')
return pch[1][1];
else if (IsFull(pch, row, col))//判斷后如果沒有分出勝負如果滿了則平局
return 'Q';
else
return 'C';
}
//判斷二維陣列是否滿
int IsFull(char pch[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 (pch[i][j] == ' ')
return 0;
}
}
return 1;
}
測驗檔案 test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
meau();//選單
printf("請根據選單輸入:>");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戲!\n");
break;
case 1:
printf("進入游戲三子棋!\n");
game();
break;
default:
printf("輸入不合法,請重新輸入!\n");
break;
}
}while (input);
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290753.html
標籤:其他
