c++實作簡單三子棋
- 一、問題描述
- 二、步驟
- 1.選單界面
- 2.創建棋盤
- 3.棋盤初始化
- 4.列印棋盤
- 5.玩家下棋
- 6.電腦下棋
- 7.判斷勝負
- 三、結果演示
- 1.玩家勝利
- 2.電腦勝利
- 3.和棋
- 四、代碼實作
一、問題描述
用c++實作簡單三子棋游戲,
二、步驟
1.選單界面
設定一個簡陋的選單界面,
//初始化棋盤
void InitBoard(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
2.創建棋盤
用define定義的常量初始化棋盤的行數為(3)和列數為(3),并創建二維陣列,元素型別是char,
#define ROW 3 //行數
#define COL 3 //列數
3.棋盤初始化
用兩層for回圈來初始化棋盤,并賦值為’ ‘,
//初始化棋盤
void InitBoard(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
在這里棋盤的初始化中也可以用庫函式memset初始化棋盤,我比較懶也就沒寫,
4.列印棋盤
//列印棋盤
void DisChessBoard(char board[ROW][COL])
{
for (int i = 0; i <ROW; i++)
{
for (int j = 0; j <COL; j++)
{
//1.列印一行的資料
cout << ' ' << board[i][j] << ' ';
if (j<COL-1)
{
cout << '|';
}
}
cout << endl;
//2.列印分割行
if (i <ROW- 1)
{
for (int j = 0; j <COL; j++)
{
printf("---");
if (j <COL-1)
{
cout << '|';
}
}
cout << endl;
}
}
}
列印的判斷條件是行(列)數-1防止出現列印不美觀的情況,如下圖所示:

列印好的棋盤如下圖所示:

5.玩家下棋
玩家輸入行列坐標表示落子,使用’*’表示玩家落子,
注意:
1.玩家落子需要在棋盤范圍(3×3)內,
2.玩家要在棋盤空的位置上落子,
3.如果輸入的坐標被占或者輸入的坐標不合法,則需要重新輸入,
//玩家下棋----*
void playerMove(char board[ROW][COL])
{
int i, j;
cout << "玩家下,請輸入坐標:(x y)" << endl;
while (true)
{
cin >> i >> j;
if (i >= 1 && i <= ROW && j >= 1 && j <= COL)
{
//由于玩這個游戲的人不一定就是程式員,知道陣列的下標從0開始,
//所以把橫豎坐標都減了1
if (board[i-1][j-1] == ' ')
{
board[i-1][j-1] = '*';
break;
}
else
{
cout << "位置被占用,請重新輸入" << endl;
}
}
else
{
cout << "您輸入的坐標有誤,請重新輸入" << endl;
}
}
}
6.電腦下棋
電腦隨機生成坐標表示落子,使用’#’表示玩家落子,
由于是電腦隨機生成0-2范圍內的下標,所以不會出現越界的情況,
使用rand()函式需要配合著srand((unsigned int)time(0))一起使用,不然會導致每回合生成的數是固定的值,
//電腦下棋-----#
void computerMove(char board[ROW][COL])
{
cout << "電腦走:>" << endl;
while (true)
{
//通過rand()函式來取余3,得到陣列的下標范圍是0-2之間
int i = rand() % 3;
int j = rand() % 3;
if (board[i][j ] == ' ')
{
board[i][j ] = '#';
break;
}
}
}
7.判斷勝負
//判斷誰贏、誰輸、平局的結果
//告訴我們4種結果
//1.玩家贏----*
//2.電腦贏----#
//3.平局------Q
//4.繼續-----C就是誰都沒有贏,并且棋盤也沒有滿
//判斷是否滿了
bool isFull(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (board[i][j] == ' ')
{
return false; //沒滿
}
}
}
return true; //滿了
}
//判斷誰贏、誰輸、平局的結果
char isWin(char board[ROW][COL])
{
//判斷倆條對角線是否相等
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
//判斷每一行是否相等
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 < ROW; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//判斷是否平局
if (true == isFull(board))
{
return 'Q';
}
return 'C';
}
三、結果演示
1.玩家勝利

2.電腦勝利

3.和棋

四、代碼實作
分檔案撰寫有如下三個:
(1).頭檔案sanzi_chess.h
#include<ctime>
#include<Windows.h>
//選單函式
void menu();
//初始化棋盤
void InitBoard(char board[ROW][COL]);
//列印棋盤函式
void DisChessBoard(char board[ROW][COL]);
//玩家下棋
void playerMove(char board[ROW][COL]);
//電腦下棋
void computerMove(char board[ROW][COL]);
//判斷誰贏、誰輸、平局的結果
//告訴我們4種結果
//1.玩家贏----*
//2.電腦贏----#
//3.平局------Q
//4.繼續-----C就是誰都沒有贏,并且棋盤也沒有滿
char isWin(char board[ROW][COL]);
//判斷是否滿了
bool isFull(char board[ROW][COL]);
(2).源檔案sanzi_chess.cpp
#include"sanzi_chess.h"
//選單函式
void menu()
{
cout << "↑→→→→→→→→→→→→→→→↓" << endl;
cout << "↑ 1.玩游戲 ↓" << endl;
cout << "↑←←←←←←←←←←←←←←←↓" << endl;
cout << "↑ 0.退出程式 ↓" << endl;
cout << "↑←←←←←←←←←←←←←←←↓" << endl;
}
//初始化棋盤
void InitBoard(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
//列印棋盤
void DisChessBoard(char board[ROW][COL])
{
for (int i = 0; i <ROW; i++)
{
for (int j = 0; j <COL; j++)
{
//1.列印一行的資料
cout << ' ' << board[i][j] << ' ';
if (j<COL-1)
{
cout << '|';
}
}
cout << endl;
//2.打印分割行
if (i <ROW- 1)
{
for (int j = 0; j <COL; j++)
{
printf("---");
if (j <COL-1)
{
cout << '|';
}
}
cout << endl;
}
}
}
//玩家下棋----*
void playerMove(char board[ROW][COL])
{
int i, j;
cout << "玩家下,請輸入坐標:(x y)" << endl;
while (true)
{
cin >> i >> j;
if (i >= 1 && i <= ROW && j >= 1 && j <= COL)
{
if (board[i-1][j-1] == ' ')
{
board[i-1][j-1] = '*';
break;
}
else
{
cout << "位置被占用,請重新輸入" << endl;
}
}
else
{
cout << "您輸入的坐標有誤,請重新輸入" << endl;
}
}
}
//電腦下棋-----#
void computerMove(char board[ROW][COL])
{
cout << "電腦走:>" << endl;
while (true)
{
int i = rand() % 3;
int j = rand() % 3;
if (board[i][j ] == ' ')
{
board[i][j ] = '#';
break;
}
}
}
//判斷是否滿了
bool isFull(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (board[i][j] == ' ')
{
return false; //沒滿
}
}
}
return true; //滿了
}
//判斷誰贏、誰輸、平局的結果
char isWin(char board[ROW][COL])
{
//判斷倆條對角線是否相等
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
//判斷每一行是否相等
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 < ROW; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//判斷是否平局
if (true == isFull(board))
{
return 'Q';
}
return 'C';
}
(3).源檔案test.cpp
#include"sanzi_chess.h"
//三子棋游戲函式
void sanzi_chess_game()
{
//字符陣列----用來存放棋盤的資訊
char board[ROW][COL] = {0};
char ret=0;
//初始化棋盤
InitBoard(board);
//列印棋盤
DisChessBoard(board);
while (true)
{
//玩家下完棋后,列印一下棋盤資訊,并判斷一下玩家贏了沒有
playerMove(board);
DisChessBoard(board);
ret=isWin(board);
if (ret != 'C')
{
break;
}
//電腦下完棋后,列印一下棋盤資訊,并判斷一下電腦贏了沒有
computerMove(board);
DisChessBoard(board);
ret=isWin(board);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
cout << "玩家贏" << endl;
cout << "你好,程式將在5秒后將會清屏" << endl;
Sleep(5000);
system("cls");
}
else if (ret == '#')
{
cout << "電腦贏" << endl;
cout << "你好,程式將在5秒后將會清屏" << endl;
Sleep(5000);
system("cls");
}
else
{
cout << "平局" << endl;
cout << "你好,程式將在5秒后將會清屏" << endl;
Sleep(5000);
system("cls");
}
}
int main()
{
srand((unsigned int)time(NULL));
while (true)
{
menu();
int select = 0;
cout << "請選擇:>" << endl;
cin >> select;
switch (select)
{
case 1:
sanzi_chess_game();
break;
case 0:
exit(0);
default:
cout << "您輸入有誤,請重新輸入" << endl;
cout << "您按任意鍵后,將會清屏" << endl;
system("pause");
system("cls");
}
}
system("pause");
return 0;
}
主函式中添加了系統命令system(“cls”);用來清空螢屏,
在此基礎上添加一些演算法,使得電腦下棋更加聰明,使得玩家獲勝難度加大,
如有需要原始碼請點擊:添加鏈接描述
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252591.html
標籤:其他
上一篇:c語言實作掃雷游戲
