蟲子 三子棋 眾神起步,萬語之基,軟硬橋梁,帝國大廈

      網友投稿 704 2022-05-28

      三子棋

      test.c文件

      菜單函數

      game函數

      三子棋

      test.c文件

      菜單函數

      game函數

      game.c文件

      InitBoard初始化棋盤函數

      DisplayBoard打印棋盤函數

      PlayerMove玩家移動函數

      ComputerMove電腦移動函數

      IsFull判斷棋盤是否下滿函數

      IsWin判斷是否贏函數

      game.h文件

      函數聲明

      測試圖

      三子棋

      這是一個用C語言寫的簡單小游戲,也是我第一個用C語言寫的小游戲,游戲雖小,代碼俱全。

      test.c文件

      為了方便自述,還是從main進入(我也優化過三子棋代碼,不能無限輸錯)

      int main() { int input = 0; int timer = 3;//游戲剩余次數 int flag = 1;//進入游戲標志 srand((unsigned)time(NULL));//設置隨機起點(運用時間戳) /*為了體會一下游戲的可玩性,先玩一把然后再決定玩與不玩 因此用do while循環*/ do { Menu(); //菜單函數 printf("請選擇:>"); scanf("%d",&input); switch (input)//選擇模式 { case 1: flag = 0; //玩游戲時游戲標志清零 game(); break; case 0: printf("退出\n"); break; default: if (flag == 0) //將游戲標記置一 { flag = 1; timer = 3;//可玩次數重新置三 } timer--; if (timer == 0)//當沒有游戲次數時就不能玩了 { printf("沒有選擇機會了,已退出游戲。"); break; } printf("選擇錯誤,可以重新選擇,還有%d錯誤就強制退出。time = %d\n",timer,timer); break; } } while(input&&timer);//可玩次數為0,自己不想玩都可以退出游戲 return 0; }

      菜單函數

      void Menu() { printf("**********************\n"); printf("***1.play 2.exit***\n"); printf("**********************\n"); }

      game函數

      void game() { char ret = 0; char board[ROW][COL];//棋盤數組 InitBoard(board,ROW,COL);//初始化棋盤 DisplayBoard(board,ROW,COL);//打印棋盤 /*玩家和電腦對打是有來有回的因此循環*/ while (1) { PlayerMove(board, ROW, COL); //玩家移動 DisplayBoard(board, ROW, COL);//打印棋盤 ret = IsWin(board, ROW, COL); //判斷輸贏函數 if (ret != 'C') //不能繼續就退出 { break; } ComputerMove(board, ROW, COL);//電腦移動 DisplayBoard(board, ROW, COL);//打印棋盤 ret = IsWin(board, ROW, COL); //判斷輸贏函數 if (ret != 'C') //不能繼續就退出 { break; } } if (ret == '*') { printf("玩家贏\n"); } else if (ret == '#') { printf("電腦贏\n"); } else { printf("平局\n"); } }

      game.c文件

      InitBoard初始化棋盤函數

      這里為什么要用傳過來的row,col呢,有人會說不是有ROW,COL嗎理論上是沒有問題的,但不用自己傳過來的參數,用COL,ROW是被限制了的,獨立性下降了許多,受到到了限制,用自己傳過來的參數,是靈活變化的,不是依賴于COL,ROW的

      void InitBoard(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] = ' '; } } }

      DisplayBoard打印棋盤函數

      棋盤設計每個人可能多多少少有點不同,這個就是棋盤界面,沒有花里胡哨,只有普通的分割行,數據行

      void DisplayBoard(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++) { printf("%c", board[i][j]); } printf("\n"); }*/ int i = 0; for (i = 0; i <= row; i++) { int j = 0; for ( j = 0; j <= col; j++) { //打印分割行 printf("*"); if(j

      PlayerMove玩家移動函數

      玩家移動,為了體現自己的價值,所以先手永遠都是給玩家先走,誒我可以給電腦走可是就不給,就是玩。為了方便視覺觀察,玩家移動電腦移動都用漢字提示

      void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; int time = 3;//我們也不能放縱玩家瞎玩,連續瞎移動3次也讓你此局報廢 int flag = 1; printf("玩家移動:>\n"); while (time) { printf("請輸入坐標;>"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (flag == 0)//到了這里說明你還是想玩的,標記置1,次數充滿 { flag = 1; time = 3; } if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("已經被占用,請重新落子:\n"); } } else { flag = 0;//到了這個代碼塊首先標記置0 time--;//可玩次數減少 if (time == 0)//這里我們也賦予棋盤爆怒情緒 { printf("你不想玩就滾,當我沒脾氣啊.\n"); break; } printf("坐標非法,超出范圍:你還有%d次機會\n", time); } } }

      ComputerMove電腦移動函數

      蟲子 三子棋 眾神起步,萬語之基,軟硬橋梁,帝國大廈

      電腦移動,你永遠都是后手

      void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("電腦移動:>"); while (1) { x = rand() % row;//這里的rand是和srand配合使用的 y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }

      IsFull判斷棋盤是否下滿函數

      int IsFull(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;//兩層循環都沒有空格說明滿了 }

      IsWin判斷是否贏函數

      判斷游戲輸贏 返回4種不同的狀態: return ‘*’ 玩家贏 return ‘#’ 電腦贏 return ‘Q’ 平局 return ‘C’ 繼續

      char IsWin(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 < col; i++)//列判斷 { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') return board[0][i]; } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//對角線判斷 return board[0][0]; if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')//對角線判斷 return board[1][1]; //判斷平局,只需要看一下棋盤是不是滿了就行 if (IsFull(board, row, col)) return 'Q'; //游戲繼續 return 'C'; }

      game.h文件

      宏的出現大大加大了代碼的可移植性

      #define ROW 3//行 #define COL 3//列

      函數聲明

      void InitBoard(char board[ROW][COL], int row, int col); void DisplayBoard(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); void ComputerMove(char board[ROW][COL], int row, int col); char IsWin(char board[ROW][COL], int row, int col); int IsFull(char board[ROW][COL], int row, int col);

      測試圖

      瞎選的后果

      只要在最后以后選正確,次數充滿

      下面多條測試

      5G游戲 軟件開發

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:泛型和類型安全的容器的基本認知
      下一篇:一天就可以擁有自己的論壇,你心動了嗎?
      相關文章
      亚洲国产精品无码久久98| 亚洲中文字幕乱码一区| 免费在线观看亚洲| 亚洲国产精品无码第一区二区三区| 亚洲成a人不卡在线观看| 久久夜色精品国产噜噜噜亚洲AV| 亚洲s色大片在线观看| 国产成人无码综合亚洲日韩| 亚洲色精品vr一区二区三区| 亚洲人成伊人成综合网久久久 | 亚洲日韩国产精品第一页一区| 久久国产成人亚洲精品影院| 亚洲美女高清一区二区三区| 亚洲人成影院在线无码观看| 亚洲一区二区视频在线观看| 亚洲日韩VA无码中文字幕| 久久青青草原亚洲av无码| 亚洲无线码一区二区三区| 亚洲人成亚洲人成在线观看| 亚洲AV无码专区国产乱码4SE| 久久精品亚洲一区二区| 亚洲最大成人网色| 91亚洲国产成人久久精品网址 | 亚洲午夜未满十八勿入网站2| 亚洲大尺度无码无码专区| 亚洲国产成人久久综合一| 久久综合亚洲鲁鲁五月天| 亚洲成aⅴ人片在线观| 日韩亚洲产在线观看| 亚洲精华国产精华精华液网站| 国产精品亚洲精品久久精品 | 国产AV日韩A∨亚洲AV电影| 亚洲国产婷婷香蕉久久久久久| 国内精品久久久久久久亚洲| 亚洲国产精品成人精品无码区| 亚洲网址在线观看你懂的| 亚洲丝袜中文字幕| 亚洲国产成人无码AV在线影院| 亚洲av片在线观看| 中文字幕亚洲一区二区三区| 亚洲AV中文无码字幕色三|