c語言程式設計實現簡單三子棋遊戲
阿新 • • 發佈:2019-01-27
分別建立test.c game.c 兩個原始檔,以及game.h標頭檔案
這裡的三子棋遊戲是指棋盤為3*3,玩家與電腦之間的對決,先將各自的棋下為一排(橫/豎/斜)者獲勝,電腦所 下位置是隨機產生
1. game.h中用於函式定義,如下:
2. test.c用於存放主函式,如下:#ifndef __GAME_H__ #define __GMME_H__ #define ROWS 3 #define COLS 3 void init_board(char board[ROWS][COLS], int rows,int cols);//初始化棋盤 void display_board(char board[ROWS][COLS], int rows, int cols);//列印棋盤 void player_move(char board[ROWS][COLS], int rows, int cols);//實現玩家下棋的函式 void computer_move(char board[ROWS][COLS], int rows, int cols);//實現電腦下棋的函式 char check_win(char board[ROWS][COLS], int rows, int cols);//判斷輸贏的函式 #endif //__GAME_H__
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include"game.h" void menu() //列印選單 { printf("********* 1.PLAY ********\n"); printf("********* ********\n"); printf("********* 0.EXIT ********\n"); } void game() { int ret = 0; char board[ROWS][COLS] = { 0 }; init_board(board, ROWS, COLS); display_board(board, ROWS, COLS); while (1) { printf("player move;\n"); player_move(board, ROWS, COLS); display_board(board, ROWS, COLS); ret = check_win(board, ROWS, COLS); if (ret != ' ') break; printf("computer move:\n"); computer_move(board, ROWS, COLS); display_board(board, ROWS, COLS); check_win(board, ROWS, COLS); if (ret != ' ') break; } if (ret == 'X') { printf("Congratulatons! player win!\n"); } else if (ret == '0') { printf("Undortunately! player lost!\n"); } else { printf("It's tie,play again?\n"); } } enum Option { EXIT,//0 PLAY //1 }; int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("please chose:>"); scanf("%d", &input); switch(input) { case PLAY: game(); break; case EXIT: break; default: printf("default!please chose again!\n"); break; } } while (input); system("pause\n"); return 0; }
3.game.c中實現遊戲的函式
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> void init_board(char board[ROWS][COLS], int rows, int cols) { memset(board, ' ', sizeof(char)*rows*cols);//用來設定記憶體的函式(指定記憶體地址,初始化,記憶體大小) } void display_board(char board[ROWS][COLS], int rows, int cols) { int i = 0; for (i = 0; i < rows; i++) { printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); if (i != rows - 1) printf("---|---|---\n"); } } void player_move(char board[ROWS][COLS], int rows, int cols) { int x = 0; int y = 0; /*printf("please enter the coordinates:>"); scanf("%d%d", &x, &y);*/ /*x--; y--;*/ while (1) { printf("please enter the coordinates:>"); scanf("%d%d", &x, &y); x--; y--; if ((x >= 0) && (x <= rows - 1) && (y >= 0) && (y <= cols - 1)) { if (board[x][y] == ' ') { board[x][y] = 'X'; break; } else { printf("please enter again:>\n"); } } } } void computer_move(char board[ROWS][COLS], int rows, int cols) { while (1) { int x = rand() % 3; int y = rand() % 3; if (board[x][y] == ' ') { board[x][y] = '0'; break; } } } static int is_full(char board[ROWS][COLS], int rows, int cols)//僅在此檔案內使用 { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { if (board[i][j] == ' ') return 0; } } return 1;//表示棋盤已滿 } char check_win(char board[ROWS][COLS], int rows, int cols)//三行三列和兩個交叉行 { int i = 0; for (i = 0; i < rows; 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 < cols; 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[2][2] != ' ')) { return board[1][1]; } if (is_full(board, rows, cols)) { return 'q';//棋盤滿了 } return ' '; }