小遊戲:三子棋
阿新 • • 發佈:2019-02-17
game.h
game.c#ifndef __GAME_H__ #define __GAME_H__ #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void board_display(char arr[ROW][COL], int row, int col);//列印棋盤 void init_board(char arr[ROW][COL], int row, int col);//初始化棋盤 void PlayerMove(char arr[ROW][COL], int row, int col);//玩家走 void ComputerMove(char arr[ROW][COL], int row, int col);//電腦走 int check_win(char arr[ROW][COL], int row, int col);//判斷輸贏 int show(char arr[ROW][COL], int row, int col);//判斷棋盤是否還有空位置 #endif//__GAME_H__
play.c#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void init_board(char arr[ROW][COL], int row, int col)//初始棋盤 { int i = 0; int j = 0; for (i = 0; i<ROW; i++) { for (j = 0; j<COL; j++) { arr[i][j] = ' '; } } } void board_display(char arr[ROW][COL], int row, int col)//列印棋盤 { int i = 0; for (i = 0; i<ROW; i++) { printf("%c %c %c\n", arr[i][0], arr[i][1], arr[i][2]); if (i<ROW - 1) printf("---|---|---\n"); } } void PlayerMove(char arr[ROW][COL], int row, int col)//玩家走一步 { while (1) { printf("請輸入座標:"); scanf("%d%d", &row, &col); row--; col--; if ((row >= 0) && (row <= ROW - 1) && (col >= 0) && (col <= COL - 1)) { if (arr[row][col] == ' ') { arr[row][col] = 'X'; break; } else printf("座標被佔用\n"); } } } void ComputerMove(char arr[ROW][COL], int row, int col)//電腦走一步 { srand((unsigned)time(NULL)); while (1) { row = rand() % ROW;//隨機的位置 col = rand() % COL; if (arr[row][col] == ' ') { arr[row][col] = '$'; break; } }//如果座標被佔用,即if不成立,將一直迴圈,找到一個空位的 } int check_win(char arr[ROW][COL], int row, int col)//判斷是否有贏的結果 { int i = 0; for (i = 0; i<ROW; i++) { if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][1] != ' '))//一行相等 return arr[i][1]; if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[1][i] != ' '))//一列相等 return arr[1][i]; if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[1][1] != ' '))//正對角線相等 return arr[1][1]; if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[1][1] != ' '))//反對角線相等 return arr[1][1]; } if (show(arr, row, col) == 0) return ' ';//還能走,棋盤還有位置,並且沒有相連的 else return 'q';//平局 } int show(char arr[ROW][COL], int row, int col)//判斷棋盤是否還有空位置 { int i = 0; for (i = 0; i<ROW; i++) { int j = 0; for (j = 0; j<COL; j++) { if (arr[i][j] == ' ') return 0; } } return 1; }
#include<stdio.h> #include"game.h" void menu() { printf("********************************\n"); printf("***** 1.play 2.exit ****\n"); printf("********************************\n"); } void game() { int row = 0; int col = 0; char arr[ROW][COL] = { 0 };//棋盤 char ret = 0;//判斷輸贏引數 init_board(arr, row, col);//初始化棋盤 do { board_display(arr, row, col);//列印棋盤 printf("玩家走:\n"); PlayerMove(arr, row, col);//玩家走 board_display(arr, row, col);//列印棋盤 ret = check_win(arr, row, col);//判斷輸贏 if (ret != ' ') break; ComputerMove(arr, row, col);//電腦走 printf("電腦走:\n"); ret = check_win(arr, row, col);//判斷輸贏 if (ret != ' ') break; } while (ret == ' '); board_display(arr, row, col);//列印棋盤 if (ret == 'X') printf("玩家贏了\n"); else if (ret == '$') printf("電腦贏了\n"); else if (ret == 'q') printf("平局\n"); } int main() { int input = 0; do { menu(); printf("請選擇:"); scanf("%d", &input); switch (input) { case 1:game(); break; case 2:return 0; break; default:printf("選擇錯誤\n"); break; } } while (input); getchar();//緩衝一下,不玩遊戲了也不會那麼快關閉視窗 return 0; }