教你用C語言實現三子棋
三子棋
三子棋的規(guī)則是:在3x3的棋盤里,雙方輪流下子(以X和O表示),先將3個子連成一條線(橫豎斜都可以)的一方獲勝
下面是三子棋C語言實現的幾個問題:
1.要想實現三子棋,我們需要一個棋盤,然后就是棋盤的內容。
2.下棋的時候需要判斷是否該位置合法。
3.玩家和電腦的下棋邏輯不同,玩家需要手動輸入,電腦是自己下棋
4.每下一步棋都需要判斷游戲是否結束(哪方勝利、平局還是繼續(xù)下棋)。
設計方式:
需要創(chuàng)建三個文件:一個頭文件,兩個源文件,頭文件里面放的是函數的聲明以及一系列預處理命令,命名為game.h
兩個源文件,一個里面放的是主函數(游戲大體的運行順序),命名為work.c,一個里面放的是游戲內容的實現邏輯(放大部分執(zhí)行函數),命名為game.c
work.c的設置
首先是進入游戲,為了確保游戲可以重復玩,我們可以以循環(huán)的方式實現
//work.c里面的內容 #include"gmae.h"http://這樣的話,在game.h里面包含的文件,在work.c里面也能使用 int main() { int option = 0;//在主函數里面設計循環(huán),可以保證每次游戲結束后可以選擇繼續(xù)游戲或者退出游戲 do { Menu(); scanf("%d", &option); switch (option) { case 1: game();//如果選擇開始游戲,就會進入到game()函數, /*我們需要定義game函數來存放游戲的實現順序*/ break; case 0: printf("已退出"); break; default : printf("錯誤選擇,請重新輸入"); } } while (option); return 0; }
//work.c里面的內容 void Menu()//定義菜單函數,配合主函數里面的循環(huán),可以實現每次游戲結束會跳到這個界面 { printf("*****************\n"); printf("*** 1.play ****\n"); printf("*** 0.exit ****\n"); printf("*****************\n"); printf("請選擇"); }
然后就是游戲進行的順序需要在game函數里面實現
//work.c里面的內容 void game() { srand((unsigned int)time(NULL));//使用隨機數,便于后面電腦下棋時是隨機出棋 char board[ROW][COL] = { 0 };//創(chuàng)建一個二維數組,用來實現棋盤的內容 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);//判斷是否結束 if (ret == '*') { printf("玩家勝利\n"); break; } computer_move(board, ROW, COL);//電腦下棋 print_board(board, ROW, COL);//打印棋盤 ret = is_win(board, ROW, COL);//判斷是否結束 if (ret == '#')// { printf("電腦勝利\n"); break; }//判斷電腦勝利 if (ret == 'Q')//判斷平局 { printf("平局\n"); break; }//判斷平局 } } //work.c里面的內容 void game() { srand((unsigned int)time(NULL));//使用隨機數,便于后面電腦下棋時是隨機出棋 char board[ROW][COL] = { 0 };//創(chuàng)建一個二維數組,用來實現棋盤的內容 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);//判斷是否結束 if (ret == '*') { printf("玩家勝利\n"); break; } computer_move(board, ROW, COL);//電腦下棋 print_board(board, ROW, COL);//打印棋盤 ret = is_win(board, ROW, COL);//判斷是否結束 if (ret == '#')// { printf("電腦勝利\n"); break; }//判斷電腦勝利 if (ret == 'Q')//判斷平局 { printf("平局\n"); break; }//判斷平局 } }
下面是對這幾點問題的解決方法:
game.h的內容設置
#define _CRT_SECURE_NO_WARNINGS 1 #define ROW 3 #define COL 3//設置了行與列的值,可以更改 #include<stdio.h> #include<time.h>//用來實現時間戳 //下面是游戲實現邏輯所需的函數聲明。 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);
game.c的設置
1.棋盤的內容
我們通過創(chuàng)建一個二維數組來作為棋子,通過輸入坐標的方式來進行下棋的步驟
創(chuàng)建數組:
char board[ROW][COL] ;這里括號里面的值我們用提前處理過的ROW與COL來表示, 通過預處理命令,我們后期可以很方便的更改ROW與COL的值來改變棋盤的大小
2.棋盤以及棋盤的初始化
棋盤是3x3形式,所以我們可以通過循環(huán)的方式打印一個棋盤,下面是棋盤的格式
0 | 0 | 0 ---|---|--- 0 | 0 | 0 ---|---|--- 0 | 0 | 0 //而這個表里面的0就是我們的下的棋子占有的位置 /*而這個棋盤的設計是有明顯的規(guī)律的: 第一行: 空格%c空格 第二行:---|循環(huán)3遍,但是最后遍不打印“|” 然后這樣的兩行在循環(huán)中多次打印,就出現了這樣的三子棋表格 注意:最后一行不用再打印“---”
這里我們定義init_board()函數來初始化棋盤(即讓數組的所有元素的值都為空格)
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] = ' ';//把所有元素賦值為' ' } } }
3.打印棋盤
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("|");//最后一列不打印'|' } } //每次進行上一個循環(huán)時,i的值在變化,打印的是不同的值 printf("\n"); if (i != row - 1)//最后一行不打印字符 { for (j = 0; j < col; j++) { printf("---"); if (j != col - 1) printf("|"); } } printf("\n"); } printf("\n"); }
4.下棋步驟 玩家下棋
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("該坐標被占用,請重新輸入\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; } } }
5.判斷是否勝利
char 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;//用是否還有空格判斷平局 } } } char is_win(char board[ROW][COL], int row, int col)//這里是判斷橫豎斜三種方式是否出現勝利 { 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]; } //一旦出現勝利,就返回勝利一方的棋子字符 if (is_full(board,ROW,COL)) { return 'Q';//平局返回'Q' } else return 'C';//什么情況都沒有就繼續(xù)游戲 }
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!