文章目錄
創(chuàng)新互聯(lián)是一家專業(yè)提供內(nèi)丘企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、成都網(wǎng)站設(shè)計、HTML5建站、小程序制作等業(yè)務(wù)。10年已為內(nèi)丘眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進行中。隨著C語言學習的不斷深入,我們接觸了數(shù)組的應用。本次三子棋的模擬實現(xiàn)就是通過二維數(shù)組等數(shù)組相關(guān)知識實現(xiàn)。
一、三子棋是什么?三子棋,即是在一張3X3的棋盤上,進行1V1的對戰(zhàn)。橫列、豎列與對角線列上3個相同的旗子連為一條直線則為獲勝。
二、實現(xiàn)過程 1.引入庫代碼如下:
#pragma once
#define ROW 3
#define COL 3
#include#include#includevoid player_move(char board[ROW][COL], int row, int col);
//
void computer_move(char board[ROW][COL], int row, int col);
\ No newline at end of file
void computer_move(char board[ROW][COL], int row, int col);
//ж?
char is_win(char board[ROW][COL], int row, int col);
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void init_board(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++)
{
board[i][j] = ' ';
}
}
}
void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0;i< row;i++)
{
//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
int j = 0;
for (j = 0;j< col;j++)
{
printf(" %c ", board[i][j]);
if(j= 1 && x<= row && y >= 1 && y<= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("該坐標已被占用,請重新輸入:\n");
}
}
else
{
printf("坐標非法\n");
}
}
}
//電腦下棋
//隨機生成坐標,只要坐標沒被占用,就下棋
void computer_move(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
printf("電腦下棋:\n");
board[x][y] = '#';
break;
}
}
}
//希望is_full這個函數(shù)只是為了支持is_win函數(shù)內(nèi)部使用
//那我們沒必要在頭文件中聲明
//判斷棋盤是否滿了
static int is_full(char board[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 (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] && board[i][0] != ' ')
{
return board[i][0];
}
}
//判斷三列
for(i=0;i
void game()
{
char board[ROW][COL];
char ret = 0;
//初始化一下棋盤,全空格。
init_board(board,ROW,COL);
print_board(board,ROW,COL);
@@ -20,14 +21,45 @@ void game()
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
//判斷輸贏
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
computer_move(board, ROW, COL);
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家贏。\n");
}
else if (ret == '#')
{
printf("電腦贏。\n");
}
else if (ret == 'Q')
{
printf("平局\n");
}
}
//判斷輸贏
//判斷輸贏的代碼要告訴我:電腦贏了?玩家贏了?平局了?游戲繼續(xù)?
//玩家贏了:*
//電腦贏了:#
//平局:Q
//繼續(xù)游戲:C
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("選擇錯誤!\b");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
2.代碼的實現(xiàn)運行后結(jié)果如下:
三、關(guān)于程序的編寫思路: 1、關(guān)于頭文件和源文件本次的代碼編寫,我們采用了一個頭文件加上兩個源文件的方式。
頭文件的主要作用是串聯(lián)起主函數(shù)所在源文件與game函數(shù)所在源文件。
兩則源文件的創(chuàng)立則各有所用。
2、關(guān)于具體內(nèi)容的編寫首先是主函數(shù)的創(chuàng)建:整個三子棋游戲的實現(xiàn)我們都將他安排在了一個名叫test的函數(shù)中,進入test文件中后,設(shè)計了一個menu函數(shù),即菜單,用Switch語句提供玩家兩種選擇,1為開始游戲,0則為退出游戲,并且為了玩家能多次重復玩本游戲,我們將其設(shè)計在了一個do—while循環(huán)的語句中,以便玩家可重復游玩。當選擇了case 1的時候,程序則進入了下一步:game函數(shù)。
一局棋,最重要的就是棋盤,所以使用了一個二維數(shù)組定義了一個方陣形棋盤。緊接著就是棋盤的設(shè)計思路:為了保證本程序日后的可修改性,我們將棋盤的行數(shù)定義為ROW,列數(shù)定義為COL,在game.h這個頭文件中使用#define,便于日后修改為五子棋等其他類似的游戲。在棋盤的設(shè)計上采用了“ %c ”的辦法,使得每一個格子大小足夠,并且用了“|”將每一個格子分割開來。每兩行格子之間還特地多打印了一行“---|”作為占位,隔開上下行。又為了避免多打出一行“---”或一列“|”,則在for循環(huán)中采取了row-1與col-1來限制其打印,讓棋盤更加美觀更加合理。
在完成了棋盤的設(shè)計之后,就順理成章的來到了下棋環(huán)節(jié):
在本次設(shè)計中我們優(yōu)先玩家下棋,所以設(shè)計了一個player_move的函數(shù),首先提示玩家下棋,并提示玩家輸入下棋的坐標。對于程序員與電腦來說,二位數(shù)組的第一個元素是board[0][0],而對于玩家來說則是1,1。因此,我們重新定義了一個x和y,即下棋坐標的橫坐標與縱坐標,并控制其數(shù)目在棋盤的行數(shù)與列數(shù)之間,否則則提示“輸入非法”。在控制在行數(shù)與列數(shù)都合理的情況下,又考慮到有可能坐標已被占用,則使用了if-else的判斷語句進行判斷,如果未被占用,則輸入一個“*”代表玩家下棋,如果已被占用,則提示坐標已被占用,請重新輸入。
玩家下棋之后則是電腦下棋,由于本次設(shè)計為基礎(chǔ)版本,電腦的難度幾乎可以歸為0,意為完全隨機,所以我們在此使用了時間戳。即使用了srand函數(shù),在game.h頭文件中使用了庫函數(shù)stdlib.h和time.h,便于我們使用隨機和時間函數(shù),使得電腦下棋更加隨機。rand()函數(shù)在%3,所得結(jié)果為0,1,2就是符合該數(shù)組的元素,通過這種方法巧妙地解決了電腦下棋隨機性的問題。
? 在完成了玩家和電腦下棋的程序編寫后,我們還需要思考一個問題,就是判斷輸贏。在三子棋的規(guī)則下,分為贏,輸與平局。輸贏很好解釋,而平局則是下滿棋盤仍未分出勝負。因此我們在此基礎(chǔ)上仍應添加一個函數(shù),即判斷輸贏的函數(shù):is_win。即判斷三行同列,三列同行與對角線的三個元素是否相同,只需要通過if語句判斷相鄰是否相同即可。最后通過判斷函數(shù)的返回值來判斷輸贏或是平局。
總結(jié)以上就是本次我對三子棋的程序的編寫過程與講解,通過這次三子棋的程序的編寫讓我對我自己的邏輯分析能力有了進一步的認識,并且借此機會鍛煉了自己的能力。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧