日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三子棋游戏C实现

發布時間:2024/1/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三子棋游戏C实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

三子棋游戲

注:本篇三子棋實現使用C語言,在VS編譯環境下實現。

  • 文件的創建
  • 三子棋代碼框架
  • 初始化和打印函數
  • 玩家下棋
  • 電腦下棋
  • 勝負判斷
  • 效果演示
  • 全部代碼

三子棋詳細步驟講解

1.文件的創建

為了讓代碼更加整潔和分工明確,我們需要在VS上創建三個不同的文件,1.創建test.c的源文件,用于測試三子棋游戲。2.創建game.c的頭文件,實現游戲函數的聲明。3.創建game.c源文件,用于游戲函數的實現。創建好后如下圖。

2.三子棋代碼框架

我們編寫任何一個復雜工程項目,都是先把框架寫出來,然后一步一步去實現它。

如圖,在test.c文件下設計框架:

框架設計好后,開始實現內容,menu作為菜單函數,可以這樣設計: void menu() {printf("******************************\n");printf("********* 1.play *********\n");printf("********* 0.exit *********\n");printf("******************************\n"); }

按F5編譯運行,我們輸入0,結果如下圖:

3.初始化和打印函數實現

如何設計三子棋游戲呢,我們先觀察三子棋樣貌,有三行三列,我們下棋一次棋,保存一下,然后電腦下棋…不難得出棋盤類似于一個二維數組,觀察棋盤圖,定義初始化數組,然后實現打印函數。

我們在test.c中創建初始化和打印函數,在game.h中聲明函數,在game.c中實現數組,之后實現函數同理,創建和聲明將不再贅述。

1.在test文件中創建初始化函數和打印函數

2.在game.h文件中聲明函數

3.初始化函數的實現

4.打印棋盤函數的實現

5.效果如圖

注:改變define中的值可以改變棋盤大小

4.玩家下棋

步驟1.先在test.c中的game()函數中創建。2.在game.h中聲明。3.在game.c中實現。前兩部操作同上,不展開講述,最后我會將全部代碼放到最后,這里詳細講解game.c中玩家下棋的實現。

void player(char board[row][col], int r, int c) {int i = 0;int j = 0;printf("玩家下棋:>\n");while (1) //會出現下棋位置錯誤或重復下棋情況,需要循環{printf("請輸入下棋位置:>");scanf("%d %d", &i, &j);//常人思維第一個位置是1 1,但實踐在數組里是0 0//下棋位置不能越界if ((i >= 1 && i <= row) && (j >= 1 && j <= col)){//下棋位置不能是之前下過的if (board[i-1][j-1] == ' ')//i-1這樣解決常人輸入1 1情況{board[i-1][j-1] = '*';break;}else{printf("該位置已經下過,請重新下棋\n");}}else{printf("下棋位置錯誤,請重新下棋\n");}} }

注:寫完玩家下棋函數后,在其下在接上之前的打印函數,這樣下一個子就可以立刻看到棋盤。

5.電腦下棋

基本步驟同上,rand(),srand(),time()函數可以去這個網站了解:https://legacy.cplusplus.com/

//game.cvoid computer(char board[row][col], int r, int c) {int i = 0;int j = 0;printf("電腦下棋:>\n");while (1){//rand()隨機值函數,任何數模上一個數,得到范圍是0~這個數i = rand() % row; //使用rand函數需要用srand()函數,頭文件<stdlib.h>j = rand() % col; //srand()函數需要調用time()函數,頭文件<time.h>if (board[i][j] == ' '){board[i][j] = '#';break;}} //因為是電腦下棋,不需要提示錯誤,自己會循環 }//test.c 因為srand()函數只調用一次,所以在main()中加如下代碼srand((unsigned int)time(NULL));

6.判斷勝負

首先在game()函數中創建判斷勝負函數is_win(),分別在玩家下棋和電腦下完一次棋后進行判斷,根據判斷值返回值來看是繼續下棋還是誰贏了,或者是平局。

1.設計判斷函數之前game()函數內容

2.設計后game()函數內容

3.判斷函數is_win()的實現
注:因為函數是有返回值,字符,所以聲明是設計為char返回類型,而不是void

判斷滿沒滿full()函數的實現。注:寫在is_win()函數上面

7.效果演示

8.全部代碼

  • test.c
#define _CRT_SECURE_NO_WARNINGS 1 //這是VS使用scanf函數報錯bug應對方法#include "game.h" //頭文件聲明函數,這里引用頭文件,就不用在test上聲明,省事void game() {char board[row][col] = { 0 }; //創建棋盤數組Inital(board,row,col); //初始化棋盤display(board, row, col);//打印棋盤//玩游戲while (1){player(board, row, col);display(board, row, col);//判斷一下情況if ('c' != is_win(board, row, col)){break;}computer(board, row, col);//判斷一下情況if ('c' != is_win(board, row, col)){break;}display(board, row, col);}//跳出循環,不在下棋,根據判斷函數返回值確定結果if ('*' == is_win(board, row, col)){printf("玩家贏\n");}if ('#' == is_win(board, row, col)){printf("電腦贏\n");}if ('p' == is_win(board, row, col)){printf("平局\n");}//最后將結果在輸出一遍display(board, row, col); } void menu() {printf("******************************\n");printf("********* 1.play *********\n");printf("********* 0.exit *********\n");printf("******************************\n");} int main() {int input = 0;srand((unsigned int)time(NULL));do //用do....while循環來構建基本框架{menu(); //創建menu函數,來打印游戲菜單printf("請輸入數字:>");scanf("%d", &input);switch (input){case 1: //輸入1,進入game函數game(); //game函數就是之后的游戲實現break;case 0:printf("退出游戲\n");break; //輸入0,break退出switch函數default:printf("輸入錯誤,請重新輸入\n");break;}} while (input); //正好輸入0退出,while(0)為假,退出游戲return 0; }
  • game.h
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h> //printf,scanf函數聲明 #include <stdlib.h> #include <time.h>#define row 3 //宏定義棋盤長寬,以后修改方便 #define col 3//初始化棋盤函數的聲明,因為不反回值,所以用void void Inital(char board[row][col], int r,int c); //打印棋盤的聲明 void display(char board[row][col], int r, int c); //玩家下棋 void player(char board[row][col],int r,int c); //電腦下棋 void computer(char board[row][col], int r, int c); //判斷輸贏 char is_win(char board[row][col], int r, int c);
  • game.h
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void Inital(char board[row][col], int r, int c) {int i = 0;for (i = 0; i < r; i++) //二維數組初始化兩個for循環{ //第一個for循環代表行,第二個for代表列int j = 0;for (j = 0; j < c; j++){board[i][j] = ' '; //數組賦值為空格‘ ’}} }void display(char board[row][col], int r, int c) {int i = 0;for (i = 0; i < r; i++) //這個大for循環控制的是行,r=3,3行{int j = 0;for (j = 0; j < c; j++) //這個for循環控制列,將' |'作為一組打印{printf(" %c ", board[i][j]);if (j < c - 1) //觀察棋盤,最后一列的|不打印{printf("|");}}printf("\n");if (i < r - 1) //觀察棋盤,最后一行的---和|不打印,但' |'打印了{for (j = 0; j < c; j++) //打印3列‘---’{printf("---");if (j < c - 1) //只打印2列'|'{printf("|");}}printf("\n");} } }void player(char board[row][col], int r, int c) {int i = 0;int j = 0;printf("玩家下棋:>\n");while (1) //會出現下棋位置錯誤或重復下棋情況,需要循環{printf("請輸入下棋位置:>");scanf("%d %d", &i, &j);//常人思維第一個位置是1 1,但實踐在數組里是0 0//下棋位置不能越界if ((i >= 1 && i <= row) && (j >= 1 && j <= col)){//下棋位置不能是之前下過的if (board[i-1][j-1] == ' ')//i-1這樣解決常人輸入1 1情況{board[i-1][j-1] = '*';break;}else{printf("該位置已經下過,請重新下棋\n");}}else{printf("下棋位置錯誤,請重新下棋\n");}} } void computer(char board[row][col], int r, int c) {int i = 0;int j = 0;printf("電腦下棋:>\n");while (1){//rand()隨機值函數,任何數模上一個數,得到范圍是0~這個數i = rand() % row; //使用rand函數需要用srand()函數,頭文件<stdlib.h>j = rand() % col; //srand()函數需要調用time()函數,頭文件<time.h>if (board[i][j] == ' '){board[i][j] = '#';break;}} //因為是電腦下棋,不需要提示錯誤,自己會循環 } int full(char board[row][col], int r, int c) {int i = 0;int j = 0;for (i = 0; i < r; i++){for (j = 0; j < c; j++){if (' ' == board[i][j]){return 0;}}}return 1; } char is_win(char board[row][col], int r, int c) {int i = 0;int j = 0;//判斷行是否相等for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' '){return board[i][0];}}//判斷列是否相等for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' '){return board[i][0];}}//判斷右對角是否相等if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][i] != ' '){return board[0][0];}//判斷左對角是否相等if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' '){return board[0][0];}//判斷棋盤是否滿了if (1 == full(board,row,col)){return 'p'; //滿了,平局}elsereturn 'c';//沒滿,繼續下棋 }

這里三子棋講解就結束啦,當然還有很多不足之處,如:1.三子棋寫死了,不能實現五子棋 2.打印屏幕沒設計清除等等,好了,同志們趕緊沖,搞起來。

總結

以上是生活随笔為你收集整理的三子棋游戏C实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。