目錄
前言
前期的準備
游戲代碼的具體實作
1、text.c
2、game.c
3、game.h
完整版的三子棋入門代碼:
1、game.h
2、text.c
3、game.c
前言
三子棋,又叫九宮棋、圈圈叉叉、一條龍、井字棋等,
將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就會輸了,但是,也避免不了出現和棋的情況......
上篇博客,我們總結了陣列的理論知識,下面,我們就利用陣列等等理論知識具體實作我們的三字棋,一起來玩玩吧 !
前期的準備
在開始準備寫游戲之前,我們需要整理整理思路,
我們需要用模塊化的思想,將這個游戲分為三個模塊:text.c,game.c,game.h,
text.c:游戲的測驗邏輯(主函式;游戲的邏輯實作)
game.c:游戲的實作邏輯(各種所需要的函式的實作)
game.h:游戲實作函式的宣告;行號、列號的宣告;頭檔案的包含
游戲的實作思路:
1.這個游戲需要開始最好就要執行一次,用來判斷是否進行游戲——我們可以使用do...while 回圈來執行,
2.列印出選單模塊,設計選單函式;玩家進入游戲后,可以根據自己的選擇決定是否來玩游戲,
3.當玩家選擇開始游戲后,由玩家先下棋(本次代碼是這樣設計的,但也可以設計電腦先下棋),然后下好棋后,由另一方下棋,注意,開始的時候就應該把棋盤列印一遍,然后每下好一步棋,就把下好的列印一下,
玩家下棋->判斷玩家是否游戲勝利,判斷游戲狀態是否繼續->電腦下棋(隨機落子的方式)->判斷電腦是否游戲勝利,判斷游戲狀態是否繼續,
4.游戲有4種狀態:玩家贏,電腦贏,平局,繼續,
游戲代碼的具體實作
1、text.c
主函式:
int main() { test();//實作是否玩游戲的函式 return 0; }text()函式的具體實作:
void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯誤\n"); break; } } while (input); }選單界面(可呼叫于text函式):
void menu() { printf("************************\n"); printf("***** 1. play ******\n"); printf("***** 0. exit ******\n"); printf("************************\n"); }游戲函式:
void game() { //資料存盤到一個字符的二維陣列中,玩家下棋是'*',電腦下棋是'#', char board[ROW][COL] = { 0 };//陣列的內容應該是全部空格 InitBoard(board, ROW, COL);//初始化棋牌 //列印棋盤 DisplayBoard(board, ROW, COL); //下棋 char ret = 0; while (1) { player_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') { break; } computer_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("恭喜玩家贏了\n"); } else if (ret == '#') { printf("不好意思電腦贏了\n"); } else { printf("平局\n"); } }
2、game.c
初始化棋盤:
void InitBoard(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] = ' '; } } }列印棋盤:
//版本1 void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { //資料 printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); //分割行 if(i<row-1) printf("---|---|---\n"); } } //版本1列印的棋盤不好,已經固定死了,不好獲得以后更加豐富的n字棋//版本2(版本1的優化,可以通過改變ROW、COL的值來形成n字棋的棋盤) void DisplayBoard(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("|"); } printf("\n"); //分割行 if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } } printf("\n"); } }玩家下棋:
//我們需要在這里面判斷輸入坐標的合法性 //并且如果讓一個沒有學過陣列方面知識的人玩,他們是不知道陣列的下標是從0開始的,因此我們應該讓他們 //輸入的從1開始,但我們在內部應該減掉這個1 void player_move(char board[ROW][COL], int row, int col) { printf("玩家下棋:>"); int x = 0; int y = 0; while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("該坐標被占用,請重新輸入!\n"); } } else { printf("坐標非法,請重輸入!\n"); } } }電腦下棋:
void computer_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("電腦下棋>\n"); while (1) { x = rand() % ROW;//0~2 y = rand() % COL;//0~2 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }判斷棋盤是否被占滿:
int 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;//棋盤沒有滿,回傳0 } } } return 1;//棋盤都不是空,就回傳1 }判斷下棋的幾種狀態:
//判斷輸贏的代碼 //玩家贏 - '*' //電腦贏 - '#' //平均 --- 'Q' //繼續 ----'C' char is_win(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][1] != ' ') { return board[i][1]; } } //三列 for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') { return board[1][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 (1 == is_full(board, row, col)) { return 'Q'; } //繼續 return 'C'; }
3、game.h
#pragma once #include <stdio.h> #include <time.h> #include <stdlib.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 player_move(char board[ROW][COL], int row, int col); //電腦下棋 void computer_move(char board[ROW][COL], int row, int col); char is_win(char board[ROW][COL], int row, int col);
完整版的三子棋入門代碼:
1、game.h
#pragma once #include <stdio.h> #include <time.h> #include <stdlib.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 player_move(char board[ROW][COL], int row, int col); //電腦下棋 void computer_move(char board[ROW][COL], int row, int col); char is_win(char board[ROW][COL], int row, int col);
2、text.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("************************\n"); printf("***** 1. play ******\n"); printf("***** 0. exit ******\n"); printf("************************\n"); } void game() { //資料存盤到一個字符的二維陣列中,玩家下棋是'*',電腦下棋是'#', char board[ROW][COL] = { 0 };//陣列的內容應該是全部空格 InitBoard(board, ROW, COL);//初始化棋牌 //列印棋盤 DisplayBoard(board, ROW, COL); //下棋 char ret = 0; while (1) { player_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') { break; } computer_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("恭喜玩家贏了\n"); } else if (ret == '#') { printf("不好意思電腦贏了\n"); } else { printf("平局\n"); } } void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯誤\n"); break; } } while (input); } int main() { test(); return 0; }
3、game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void InitBoard(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 DisplayBoard(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("|"); } printf("\n"); //分割行 if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } } printf("\n"); } } //玩家下棋 void player_move(char board[ROW][COL], int row, int col) { printf("玩家下棋:>"); int x = 0; int y = 0; while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("該坐標被占用,請重新輸入!\n"); } } else { printf("坐標非法,請重輸入!\n"); } } } void computer_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("電腦下棋>\n"); while (1) { x = rand() % ROW;//0~2 y = rand() % COL;//0~2 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } int 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; } } } return 1; } char is_win(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][1] != ' ') { return board[i][1]; } } //三列 for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') { return board[1][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 (1 == is_full(board, row, col)) { return 'Q'; } //繼續 return 'C'; }
說明一哈子啦,這個三字棋小游戲是最最最最最最最簡單得一種游戲模式,電腦隨機下棋,說是隨機就是隨機,不像玩家那么聰明,懂得策略,兩個棋子已經連上了,也不知道堵上......如果有感興趣的小伙伴也可以去嘗試優化一下,
本次博客到這里就接近尾聲了,有啥不足的地方,歡迎提出來一起共同進步哦!如果喜歡這篇博客的話,歡迎鐵汁們動動你們的小手,一鍵三連哦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356851.html
標籤:其他
上一篇:小游戲系列——低配版掃雷

