摘要:文章目錄三子棋的設(shè)置的內(nèi)容設(shè)置的設(shè)置棋盤的內(nèi)容棋盤以及棋盤的初始化打印棋盤下棋步驟玩家下棋電腦下棋判斷是否勝利三子棋三子棋的規(guī)則是在的棋盤里,雙方輪流下子以和表示,先將個(gè)子連成一條線橫豎斜都可以的一方獲勝下面是三子棋語(yǔ)
三子棋的規(guī)則是:在3x3的棋盤里,雙方輪流下子(以X和O表示),先將3個(gè)子連成一條線(橫豎斜都可以)的一方獲勝
下面是三子棋C語(yǔ)言實(shí)現(xiàn)的幾個(gè)問題:
1.要想實(shí)現(xiàn)三子棋,我們需要一個(gè)棋盤,然后就是棋盤的內(nèi)容。
2.下棋的時(shí)候需要判斷是否該位置合法。
3.玩家和電腦的下棋邏輯不同,玩家需要手動(dòng)輸入,電腦是自己下棋
4.每下一步棋都需要判斷游戲是否結(jié)束(哪方勝利、平局還是繼續(xù)下棋)。
設(shè)計(jì)方式:
需要?jiǎng)?chuàng)建三個(gè)文件:一個(gè)頭文件,兩個(gè)源文件,頭文件里面放的是函數(shù)的聲明以及一系列預(yù)處理命令,命名為game.h
兩個(gè)源文件,一個(gè)里面放的是主函數(shù)(游戲大體的運(yùn)行順序),命名為work.c,一個(gè)里面放的是游戲內(nèi)容的實(shí)現(xiàn)邏輯(放大部分執(zhí)行函數(shù)),命名為game.c
首先是進(jìn)入游戲,為了確保游戲可以重復(fù)玩,我們可以以循環(huán)的方式實(shí)現(xiàn)
//work.c里面的內(nèi)容#include"gmae.h"//這樣的話,在game.h里面包含的文件,在work.c里面也能使用int main(){ int option = 0;//在主函數(shù)里面設(shè)計(jì)循環(huán),可以保證每次游戲結(jié)束后可以選擇繼續(xù)游戲或者退出游戲 do { Menu(); scanf("%d", &option); switch (option) { case 1: game();//如果選擇開始游戲,就會(huì)進(jìn)入到game()函數(shù), /*我們需要定義game函數(shù)來(lái)存放游戲的實(shí)現(xiàn)順序*/ break; case 0: printf("已退出"); break; default : printf("錯(cuò)誤選擇,請(qǐng)重新輸入"); } } while (option); return 0;}
//work.c里面的內(nèi)容void Menu()//定義菜單函數(shù),配合主函數(shù)里面的循環(huán),可以實(shí)現(xiàn)每次游戲結(jié)束會(huì)跳到這個(gè)界面{ printf("*****************/n"); printf("*** 1.play ****/n"); printf("*** 0.exit ****/n"); printf("*****************/n"); printf("請(qǐng)選擇");}
然后就是游戲進(jìn)行的順序需要在game函數(shù)里面實(shí)現(xiàn)
//work.c里面的內(nèi)容void game(){ srand((unsigned int)time(NULL));//使用隨機(jī)數(shù),便于后面電腦下棋時(shí)是隨機(jī)出棋 char board[ROW][COL] = { 0 };//創(chuàng)建一個(gè)二維數(shù)組,用來(lái)實(shí)現(xiàn)棋盤的內(nèi)容 printf("游戲開始:/n"); init_board(board,ROW,COL);//初始化棋盤 print_board(board, ROW, COL);//打印棋盤 while (1) { char ret = "0"; player_move(board, ROW, COL);//玩家下棋 print_board(board, ROW, COL);//打印棋盤 ret = is_win(board, ROW, COL);//判斷是否結(jié)束 if (ret == "*") { printf("玩家勝利/n"); break; } computer_move(board, ROW, COL);//電腦下棋 print_board(board, ROW, COL);//打印棋盤 ret = is_win(board, ROW, COL);//判斷是否結(jié)束 if (ret == "#")// { printf("電腦勝利/n"); break; }//判斷電腦勝利 if (ret == "Q")//判斷平局 { printf("平局/n"); break; }//判斷平局 }}
下面是對(duì)這幾點(diǎn)問題的解決方法:
#define _CRT_SECURE_NO_WARNINGS 1#define ROW 3#define COL 3//設(shè)置了行與列的值,可以更改#include #include //用來(lái)實(shí)現(xiàn)時(shí)間戳//下面是游戲?qū)崿F(xiàn)邏輯所需的函數(shù)聲明。void init_board(char board[ROW][COL], int row, int col);void player_move(char board[ROW][COL], int row, int col);void computer_move(char board[ROW][COL], int row, int col);void print_board(char board[ROW][COL], int row, int col);char is_win(char board[ROW][COL], int row, int col);
我們通過創(chuàng)建一個(gè)二維數(shù)組來(lái)作為棋子,通過輸入坐標(biāo)的方式來(lái)進(jìn)行下棋的步驟
創(chuàng)建數(shù)組:
char board[ROW][COL] ;這里括號(hào)里面的值我們用提前處理過的ROW與COL來(lái)表示, 通過預(yù)處理命令,我們后期可以很方便的更改ROW與COL的值來(lái)改變棋盤的大小
棋盤是3x3形式,所以我們可以通過循環(huán)的方式打印一個(gè)棋盤,下面是棋盤的格式
0 | 0 | 0 ---|---|--- 0 | 0 | 0---|---|--- 0 | 0 | 0 //而這個(gè)表里面的0就是我們的下的棋子占有的位置 /*而這個(gè)棋盤的設(shè)計(jì)是有明顯的規(guī)律的: 第一行: 空格%c空格 第二行:---|循環(huán)3遍,但是最后遍不打印“|” 然后這樣的兩行在循環(huán)中多次打印,就出現(xiàn)了這樣的三子棋表格 注意:最后一行不用再打印“---”
這里我們定義init_board()函數(shù)來(lái)初始化棋盤(即讓數(shù)組的所有元素的值都為空格)
void init_board(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++) { board[i][j] = " ";//把所有元素賦值為" " } }}
void print_board(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++) { printf(" %c ", board[i][j]); if (j != col - 1) { printf("|");//最后一列不打印"|" } } //每次進(jìn)行上一個(gè)循環(huán)時(shí),i的值在變化,打印的是不同的值 printf("/n"); if (i != row - 1)//最后一行不打印字符 { for (j = 0; j < col; j++) { printf("---"); if (j != col - 1) printf("|"); } } printf("/n"); } printf("/n");}
void player_move(char board[ROW][COL], int row, int col){ printf("玩家下棋:/n"); int x = 0; int y = 0; int i = 0; int j = 0; while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y <= col & y >= 1) { if (board[x-1][y-1] == " ") { board[x-1][y-1] = "*"; break; } else { printf("該坐標(biāo)被占用,請(qǐng)重新輸入/n"); } } } }
void computer_move(char board[ROW][COL], int row, int col){ char x = 0; char y = 0; while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == " ") { board[x][y] = "#"; break; } }}
char is_full(char board[ROW][COL], int row, int col) //判斷是否格子占滿了,格子占滿了還沒有出現(xiàn)勝利的話就會(huì)判斷平局{ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] = " ") return 0;//用是否還有空格判斷平局 } }}char is_win(char board[ROW][COL], int row, int col)//這里是判斷橫豎斜三種方式是否出現(xiàn)勝利{ int i = 0; int j = 0; int count = 0; for (i = 0; i < row; i++) { if ((board[i][0] == board[i][1])&&(board[i][1]==board[i][2])&&board[i][1]!=" "); { return board[i][0]; } } for (i = 0; i < row; i++) { if ((board[0][i] == board[1][i])&&(board[2][i]==board[1][i]) && board[1][i] != " ") { return board[0][i]; } } if ((board[0][0] == board[1][1]) &&( board[1][1] == board[2][2]) && board[1][1] != " ") { return board[1][1]; } if ((board[0][2] == board[1][1] )&& (board[1][1] == board[2][0]) && board[1][1] != " ") { return board[1][1]; } //一旦出現(xiàn)勝利,就返回勝利一方的棋子字符 if (is_full(board,ROW,COL)) { return "Q";//平局返回"Q" } else return "C";//什么情況都沒有就繼續(xù)游戲}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/123074.html
摘要:簡(jiǎn)單介紹了三子棋原理后接下來(lái)為大家講解分步目標(biāo)及代碼如何實(shí)現(xiàn)。電腦下棋我們實(shí)現(xiàn)了玩家和電腦的下棋后,我們需要編寫一個(gè)函數(shù)來(lái)判斷雙方的輸贏。我們使用函數(shù)來(lái)實(shí)現(xiàn)這一目標(biāo)。 目錄 1.三子棋原理 2.分塊代碼實(shí)現(xiàn) 3.總結(jié) 1.首先向大家介紹一下三子棋的原理 首先我們需要有一個(gè)棋盤,初始時(shí)棋...
摘要:三子棋目錄一問題介紹三子棋,在民間又叫井字棋。因?yàn)槿藗冊(cè)谟瓮鏁r(shí)常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。 三子棋 目錄 一、問題介紹 ? ? ? ? 三子棋,在民間又叫井字棋。因?yàn)槿藗冊(cè)谟瓮鏁r(shí)常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。 三子棋的游戲規(guī)則十分的簡(jiǎn)單: ...
摘要:今天博主將為大家?guī)?lái)語(yǔ)言入門級(jí)小游戲三子棋井字棋的詳細(xì)介紹,希望這篇文章對(duì)大家能有幫助。在這里,我們使用函數(shù)來(lái)實(shí)現(xiàn)這一功能。 ?? ? ??今天博主將為大家?guī)?lái)C語(yǔ)言入門級(jí)小游戲——三子棋(井字棋)的詳細(xì)介紹,希望這篇文章對(duì)大家能有幫助?。?? ? ? 在編程的學(xué)習(xí)過程中,編寫一些中這樣...
摘要:前言本篇文章記錄了用語(yǔ)言實(shí)現(xiàn)三子棋小游戲,主要目的是對(duì)之前語(yǔ)言知識(shí)學(xué)習(xí)的鞏固,聯(lián)系各個(gè)知識(shí),以及怎么樣實(shí)際使用各個(gè)知識(shí)。效果顯示函數(shù)當(dāng)玩家輸入時(shí),跳入到游戲的實(shí)現(xiàn)代碼之中。這里調(diào)用了函數(shù),實(shí)現(xiàn)代碼如下由于在這里強(qiáng)制轉(zhuǎn)化為正整數(shù)。 前言 本篇文章記錄了用C語(yǔ)言實(shí)現(xiàn)三子棋小游戲,主要目...
閱讀 649·2021-11-11 16:55
閱讀 2160·2021-11-11 16:55
閱讀 1951·2021-11-11 16:55
閱讀 2341·2021-10-25 09:46
閱讀 1598·2021-09-22 15:20
閱讀 2268·2021-09-10 10:51
閱讀 1702·2021-08-25 09:38
閱讀 2612·2019-08-30 12:48