C语言实现“人工智障”三子棋
文章目錄
- 前言
- 一、成品展示
- 主界面展示:
- 二、實(shí)現(xiàn)步驟
- 1.初始化棋盤
- 2.打印棋盤
- 3.玩家電腦落子
- 4. 判斷勝負(fù)
- 5.游戲邏輯實(shí)現(xiàn)
- 總結(jié)
前言
相信不少小伙伴在學(xué)校上的時候肯定都玩過三子棋吧,不用問我咋知道的,這是青春好吧,因?yàn)榘承r候就因?yàn)檫@個不少女孩子關(guān)系挺好的,好啦~~~禁止八卦!言歸正傳進(jìn)入到我們今天的主題,我們增么用從語言來實(shí)現(xiàn)一個簡易的三子棋了?下面就誘發(fā)俺來給大家講解下。
一、成品展示
我們直接來看效果,然后再來反推它是怎么實(shí)現(xiàn)的吧!
主界面展示:
這個主界面設(shè)計(jì)存在一定的邏輯,但今天不是我們講解的重點(diǎn),三子棋突突突!
這里我選擇1,進(jìn)入三子棋游戲然后可以看到控制臺輸出了一個棋盤,仔細(xì)觀察到它是33的一個棋盤,然后在未落子時,盤面基本時空的,除了一定的打印修飾外!那么加入我們按照控制臺的提示來輸入一個坐標(biāo)試試了,那就(2,2)吧,因?yàn)槲冶旧砭捅容^2;來看看效果:
當(dāng)我輸入(2,2)時,棋盤的內(nèi)容更新了,(2,2)這個位置多了一個號,這也是玩家的棋子,然后人工智障不假思索的在(2,3)這個位置下了個!,我們來戰(zhàn)勝它!
智商在線了一波,我贏了,這不贏的建議回爐重造!后面還有重開游戲的邏輯,都比較簡單,我們步入正題,三子棋的實(shí)現(xiàn)步驟;
二、實(shí)現(xiàn)步驟
1.初始化棋盤
其實(shí)我們存儲的棋子本質(zhì)上是存儲在二維數(shù)組中的字符,所以在開始游戲或者重新開始一局新的游戲時,我們必須初始化數(shù)組中的內(nèi)容,初始化為什么了,我們這邊 剛剛看到在游戲剛開始時控制臺只是打印了棋盤,所以剛開始數(shù)組中存儲的便是空格,只需要簡簡單單的遍歷一下就可以了:上個代碼看看吧
void initboard(char board[ROW][COL], int row, int col) {for (int i = 0;i < row;i++) {for (int j = 0;j < col;j++) {board[i][j] = ' ';}} }二維數(shù)組傳參,數(shù)組名表示的時一行數(shù)組的地址,所以我們必須把行,列,全部傳過去,然后在通過兩個for循環(huán)對其中的每個元素進(jìn)行初始化!我們在vs中去看一下:
可以i看到經(jīng)過初始化后,board數(shù)組中的元素為空格:
2.打印棋盤
打印棋盤在控制臺上這一步我覺得時最難的,它需要你花不少的心思去仔細(xì)琢磨!不過總體來說我們還是按照分組的形式來理解它,一行加一個分割行為一組,然后再邊界出要仔細(xì)思考臨界值到底應(yīng)該如何設(shè)置,才是正確打印棋盤的訣竅:我們用圖片與代碼相結(jié)合的方式來來表示一下:
需要我們注意的是,每一行和沒一列的最后不需要打印相關(guān)的東西,這一這點(diǎn)邏輯并在代碼的相關(guān)部分實(shí)現(xiàn)是很重要的!
3.玩家電腦落子
這個就比較簡單,相當(dāng)于是改一下二維數(shù)組當(dāng)中的內(nèi)容就好了,有一點(diǎn)需要注意的是,數(shù)組的下標(biāo)是從0開始的,需要一定的轉(zhuǎn)化,需要判斷輸入的左邊是否合法,還需要判斷此處的是否是空的,滿足兩項(xiàng),則就可以來進(jìn)行落子了!上代碼:
void player_move(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;printf("你的落子:\n");while (1) {printf("請輸入你要落子的坐標(biāo):\n");scanf("%d%d", &x, &y);//判斷坐標(biāo)合法性if (x >= 1 && x <= col && y >= 1 & y <= row) {if (board[x - 1][y - 1] == ' ') {board[x - 1][y - 1] = '*';break;}else {printf("坐標(biāo)被占用,請重新輸入!");}}else {printf("坐標(biāo)不合法,請重新輸入!");}} }其實(shí)也就是簡單的選擇分支語句,掌握了邏輯,都能寫出來,有的事看著難,其實(shí)也就那樣,你們說是嗎?
4. 判斷勝負(fù)
這一點(diǎn)就需要仔細(xì)想一想了,生活中的三子棋游戲規(guī)則我們都知道,那么怎么樣轉(zhuǎn)化成合適的計(jì)算機(jī)及語言了?
我當(dāng)初想的是直接遍歷二維數(shù)組中的每一個元素,比較橫向和縱向,以及兩個45度的方向,這些都可以通過坐標(biāo)來實(shí)現(xiàn),但我后面又一想,似乎會導(dǎo)致下標(biāo)越界,加入你就正在遍歷第一行的最后一個元素,你對他進(jìn)行加一判斷,是不是就越界了了?于是我便想到了列舉每一方向,是不是很搓,我也沒想到啥好辦法,又小伙伴有好主意的花,歡迎在評論區(qū)留言哦!當(dāng)然判斷之前的看看棋盤是不是滿了,滿了就平局唄。我們來看看吧:
5.游戲邏輯實(shí)現(xiàn)
就是簡簡單單的一個人下一個棋子,判斷一下,打印棋盤,直到一方勝出或者平局;放在一個while循環(huán)里面就可以了然后設(shè)置一下返回值來實(shí)現(xiàn)游戲后續(xù)的邏輯:
void game() {char board[ROW][COL] = { 0 }; begin:initboard(board, ROW, COL);//初始化棋盤print_board(board,ROW,COL);//打印棋盤while (1) {//循環(huán)實(shí)現(xiàn)重復(fù)下棋player_move(board, ROW, COL);int me=judge_win(board, ROW, COL);//有一方勝出返回1,平局返回0if (me) {printf("nb,再來一把?(1/0)\n");int input2 = 0;scanf("%d", &input2);if (input2) {goto begin;}else {return;}}print_board(board, ROW, COL);//打印棋盤computer_move(board, ROW, COL);//電腦下棋int it=judge_win(board, ROW, COL);//判斷if (it) {printf("別灰心,再來一把?(1/0)\n");int input2 = 0;scanf("%d", &input2);if (input2) {goto begin;}else {return;}}print_board(board, ROW, COL);} }總結(jié)
三子棋的簡單實(shí)現(xiàn)就到這里了,因?yàn)殡娔X落子是隨機(jī)數(shù)生成的,所以有點(diǎn)呆,堪稱“人工智障”,俺也會繼續(xù)想想辦法,能不能讓電腦變得聰明點(diǎn),后續(xù)還會在該項(xiàng)目中加入一些經(jīng)典的游戲,歡迎大家到我的碼云link上一起來試毒!!!
總結(jié)
以上是生活随笔為你收集整理的C语言实现“人工智障”三子棋的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql语句的查询
- 下一篇: 知识图谱入门 (三) 知识抽取