目錄
1.所需工具
2.實作思路:
3、功能介紹部分
(1)、選單列印:
(2)、 列印棋盤:
(3)、玩家下棋
(4)、電腦下棋
(5)、判斷輸贏:
4、游戲實作程序部分
5、原始碼:
1.所需工具
小編運用的是VS2019版本
2.實作思路:
(1)、首先我們知道在計算機上實作三子棋,我們需要有一個可以下棋的棋盤,
(2)、我們實作三子棋游戲的基本程序為玩家下棋之后到電腦下棋這樣回圈,最后判斷輸贏(劃重點是回圈),
(3)、所以我們可以知道我們所撰寫的代碼功能部分為:列印選擇選單、列印棋盤、玩家下棋、電腦下棋、判斷輸贏,
(4)、其中我們要注意的幾個方面是:在玩家下棋以及電腦下棋的部分的棋盤落子的相關判斷,判斷是否可以落子,落子完成后是否判斷輸贏,
3、功能介紹部分
(1)、選單列印:
這個功能的實作是在螢屏上列印一個選擇選單讓玩家選擇玩游戲還是退出游戲,

(2)、 列印棋盤:
通常我們在玩三子棋的時候棋盤的規格類似于九宮格形式

根據上面的列印結果我們可以看出這是利用一個二維陣列在螢屏上列印 ‘ ’、‘ -’、' | '的符號

知道了大致思路所以接下來我們要初始化棋盤,利用二維陣列將棋盤的大小利用 ' ' (空格)全部列印出來

這里說明一下,我們傳進來的引數中字符型二維陣列char checkerboard[ROW][COL]是定義了棋盤的大小其中函式引數中的ROW,COL在代碼的頭檔案中定義如下:

注意:
第一行的#pragma once是一個比較常用的 C/C++ 預處理指令,只要在頭檔案的最開始加入這條預處理指令,就能夠保證頭檔案只被編譯一次,
只要在頭檔案中定義,程式在其他檔案的代碼只要包含頭檔案就行,
我們可以把#define理解成簡單的文本替換(當然不止這個意思!)后續如果需要改變棋盤的大小時可以比較方便,這樣定義后編譯器遇到ROW,COL時會是你所定義的值
接下來我們就把棋盤列印出來

這里我們應該注意的是我們需要的效果是外圍一行不列印的,所以我們需要增加限制條件如上圖中代碼30,38,43行,老鐵們主要換行作用,
(3)、玩家下棋
玩家下棋老鐵們應該要想到在空格的地方輸入一個符號‘*’,由于我們初始化棋盤時輸入的都是空格,所以我們可以選擇把棋盤中的空格替換成代表我們玩家的符號,
玩家不是計算機(陣列下標從0開始),所以玩家輸入的坐標對應的位置應該是計算機加1,如玩家輸入1,計算機陣列的位置是0,
在下棋的時候我們還要考慮幾種狀況例如這個位置是否已落子或者玩家輸入的坐標是否會超出范圍(可以利用判斷陳述句)

(4)、電腦下棋
電腦下棋我們要考慮的是如何讓電腦生成一個亂數,我們可以運用rand()函式,(老鐵們可以去搜索一下rand的用法)

(5)、判斷輸贏:
老鐵們,在進行三子棋游戲時我們會遇到的情況是:玩家贏、電腦贏、平局,
玩家贏、電腦贏:三個一樣符號的在同一行、同一列、對角線,
平局:棋盤被符號填滿
所以我們的實作思路可以是:函式回傳‘*’則玩家贏,函式回傳‘#’則電腦贏,函式回傳'Q‘則平局,函式回傳‘C’則游戲繼續玩家和電腦繼續下棋

判斷棋盤是否滿的函式實作如下:

4、游戲實作程序部分
游戲的實作部分函式我們命名為game(),在game()中我們最需要注意的是玩游戲的程序,三子棋游戲我們要考慮螢屏是否會每一步落子都列印在螢屏上我們可以考慮用while()回圈來實作,

5、原始碼:
test.c部分:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//列印選單
meau()
{
printf("**********************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("**********************************\n");
}
void game()
{
//三子棋游戲的實作
char checkerboard[ROW][COL];//棋盤陣列
//初始化棋盤,因為一開始還沒下棋,把checkerboard全部給成空格列印出來
InitBoard(checkerboard,ROW,COL);
//列印棋盤
PrintBoard(checkerboard,ROW,COL);//列印棋盤的時候本質還是列印陣列內容
//玩家下棋
char result = 0;
while (1)
{
Player(checkerboard, ROW, COL);
PrintBoard(checkerboard, ROW, COL);
result = Win(checkerboard, ROW, COL);
if(result != 'C')
{
break;
}
ComputerMove(checkerboard, ROW, COL);
PrintBoard(checkerboard, ROW, COL);
result = Win(checkerboard, ROW, COL);
if(result != 'C')
{
break;
}
}
//判斷輸贏
if(result == '*')
{
printf("玩家贏\n");
}
else if(result == '#')
{
printf("電腦贏\n");
}
else
{
printf("平局");
}
}
int main()
{
int n = 0;//選項輸入
srand((unsigned int)time(NULL));//rand()使用之前要呼叫srand()不然rand()每次生成的亂數都與上一個相同
do
{
meau();
printf("請選擇:");//讓用戶選擇選項
scanf("%d", &n);
//利用switch陳述句來控制選項
switch (n)
{
case 1:
game();
break;
case 0:
printf("游戲結束!\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (n);//n作為條件,當輸入0的時候程式會自動跳出回圈
return 0;
}
game()功能函式實作部分:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//初始化棋盤
void InitBoard(char checkerboard[ROW][COL], int row, int col)
{
int i = 0;
for(i = 0;i < row;i++)
{
int j = 0;
for(j = 0;j < col;j++)
{
checkerboard[i][j] = ' ';
}
}
}
//列印棋盤
void PrintBoard(char checkerboard[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 ", checkerboard[i][j]);
if (j < col - 1)
{
printf("|");//列印每一列的分割行
}
}
printf("\n");
//列印分割行
if(i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
//玩家下棋
void Player(char checkerboard[ROW][COL], int row, int col)
{
printf("玩家走:");
int x = 0;
int y = 0;
while (1)
{
printf("請玩家輸入坐標:");
scanf("%d %d", &x, &y);//因為玩家是從1開始算的,玩家不是計算機所以x = 1-->陣列下標的0
if(x >= 1 && x <= row && y >= 1 && y <= col)
{
//還需要考慮下棋的位置是否已經被下過了
if(checkerboard[x - 1][y - 1] == ' ')//在Boolean背景關系常量賦值是應該考慮用“==”
{
checkerboard[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐標被占用,請重新輸入新的坐標\n");
}
}
else
{
printf("玩家輸入坐標超出范圍,請重新輸入坐標");
}
}
}
//電腦下棋
void ComputerMove(char checkerboard[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦走:\n");
while(1)
{
x = rand() % row;//生成x坐標,利用rand產生的隨機值模上3那它的值范圍在0-2之間
y = rand() % col;//生成y坐標
if (checkerboard[x][y] == ' ')
{
checkerboard[x][y] = '#';
break;
}
}
}
//判斷棋盤是否滿了
int IsFull(char checkerboard[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for(i = 0;i < row;i++)
{
for(j = 0;j < col;j++)
{
if(checkerboard[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char Win(char checkerboard[ROW][COL], int row,int col)
{
//行
int i = 0;
for(i = 0;i < row;i++)
{
if(checkerboard[i][0] == checkerboard[i][1] && checkerboard[i][1] == checkerboard[i][2] && checkerboard[i][1] != ' ')
{
return checkerboard[i][0];
}
}
//列
for(i = 0;i < col;i++)
{
if(checkerboard[0][i] == checkerboard[1][i] && checkerboard[1][i] == checkerboard[2][i] && checkerboard[1][i] != ' ')
{
return checkerboard[0][i];
}
}
//對角線
if(checkerboard[0][0] == checkerboard[1][1] && checkerboard[1][1] == checkerboard[2][2] && checkerboard[1][1] != ' ')
{
return checkerboard[1][1];
}
if(checkerboard[0][2] == checkerboard[1][1] && checkerboard[1][1] == checkerboard[2][0] && checkerboard[1][1] != ' ')
{
return checkerboard[1][1];
}
//判斷平局
if(IsFull(checkerboard,row,col))
{
return 'Q';
}
//游戲繼續
return 'C';
}
game.h頭檔案包含部分:
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//初始化棋盤
void InitBoard(char checkerboard[ROW][COL],int row,int col);//ROW可以省略但是COL不可以
//列印棋盤
void PrintBoard(char checkerboard[ROW][COL], int row, int col);
//玩家下棋
void Player(char checkerboard[ROW][COL], int row, int col);
//電腦下棋
void ComputerMove(char checkerboard[ROW][COL], int row, int col);
//判斷輸贏
char Win(char checkerboard[ROW][COL], int row, int col);
//判斷棋盤是否滿了
int Is_Full(char checkerboard[ROW][COL], int row, int col);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292587.html
標籤:其他
上一篇:python之流程圖和思維導圖
下一篇:2021百度之星初賽三
