井字棋游戏
test.c
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include "game.h" 4 //开始菜单 5 void start() 6 { 7 printf("****************************\n"); 8 printf("**** 1. play 0.exit ****\n"); 9 printf("****************************\n"); 10 printf("请选择:\n"); 11 } 12 //游戏实现函数 13 void game() 14 { 15 char ret; 16 //利用二维数组创建棋盘 17 char board[ROW][COL] = { 0 }; 18 //初始化棋盘,使棋盘刚开始的值为空格 19 InitBoard(board,ROW,COL); 20 //调用打印数组函数,display--显示 21 DisplayBoard(board,ROW,COL); 22 //开始下棋 23 while (1) 24 { 25 //玩家下棋 26 PlayerMove(board, ROW, COL); 27 DisplayBoard(board, ROW, COL); 28 //判断游戏状态 29 ret =IsWin(board,ROW,COL); 30 if (ret != 'C') 31 { 32 break; 33 } 34 //电脑下棋 35 ComputerMove(board, ROW, COL); 36 DisplayBoard(board, ROW, COL); 37 //判断游戏状态 38 ret =IsWin(board,ROW,COL); 39 if (ret != 'C') 40 { 41 break; 42 } 43 } 44 if (ret == '*') 45 { 46 printf("恭喜你赢了\n"); 47 } 48 else if (ret == '#') 49 { 50 printf("很抱歉电脑赢了\n"); 51 } 52 else 53 { 54 printf("旗鼓相当!\n"); 55 } 56 } 57 int main() 58 { 59 int input = 0;//定义开始开关 60 srand((unsigned int)time(NULL)); 61 do 62 { 63 start();//调用开始菜单 64 scanf("%d",&input); 65 switch (input) 66 { 67 case 1: 68 //printf("开始游戏\n"); 69 game();//调用游戏 70 break; 71 case 0: 72 printf("退出游戏\n"); 73 break; 74 default: 75 printf("请选择正确的选项\n"); 76 break; 77 } 78 79 } while (input); 80 return 0; 81 }
game.h
1 //定义常量 2 #define ROW 3 3 #define COL 3 4 //引入外部文件 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <time.h> 8 //申明初始化函数 9 void InitBoard(char board[ROW][COL],int row,int col); 10 //申明打印数组函数 11 void DisplayBoard(char board[ROW][COL], int row, int col); 12 //申明玩家下棋函数 13 void PlayerMove(char board[ROW][COL],int row,int col); 14 //申明电脑下棋函数 15 void ComputerMove(char board[ROW][COL],int row ,int col); 16 //申明游戏状态函数 17 char IsWin(char board[ROW][COL],int row,int col);
game.c
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include "game.h" 4 5 //初始化棋盘 6 void InitBoard(char board[ROW][COL], int row, int col) 7 { 8 int i, j; 9 for (i = 0; i < row; i++) 10 { 11 for (j = 0; j < col; j++) 12 { 13 board[i][j] = ' '; 14 } 15 } 16 } 17 //打印棋盘 18 void DisplayBoard(char board[ROW][COL], int row, int col) 19 { 20 int i,j; 21 for (i = 0; i < row;i++) 22 { 23 for (j = 0; j < col; j++) 24 { 25 printf(" %c ",board[i][j]); 26 if (j < col - 1) 27 printf("|"); 28 } 29 printf("\n"); 30 if (i < row - 1) 31 { 32 for (j = 0; j < col; j++) 33 { 34 printf("---"); 35 if (j < col - 1) 36 { 37 printf("|"); 38 } 39 } 40 } 41 printf("\n"); 42 } 43 } 44 45 //玩家下棋,棋子为* 46 void PlayerMove(char board[ROW][COL], int row, int col) 47 { 48 int x,y; 49 do 50 { 51 printf("请输入需要下棋的坐标:\n"); 52 scanf("%d%d", &x, &y); 53 if ((x >= 1 && x <= 3 )&& (y >= 1 && y <= 3)) 54 { 55 if (board[x - 1][y - 1] == ' ') 56 { 57 board[x - 1][y - 1] = '*'; 58 break; 59 } 60 else 61 { 62 printf("您输入的位子已被占用,请从新输入\n"); 63 } 64 } 65 else 66 { 67 printf("您输入的位子不合法,请从新输入\n"); 68 } 69 } while(1); 70 } 71 72 //电脑下棋 73 void ComputerMove(char board[ROW][COL], int row, int col) 74 { 75 int x, y; 76 77 printf("电脑走->\n"); 78 while (1) 79 { 80 x = rand() % row; 81 y = rand() % col; 82 if (board[x][y] == ' ') 83 { 84 board[x][y] = '#'; 85 break; 86 } 87 } 88 } 89 90 //判断游戏状态,'*'表示玩家赢,'#'表示电脑赢,'P'表示平局,'C'表示继续游戏 91 char IsWin(char board[ROW][COL], int row, int col) 92 { 93 int i, j; 94 //横三行 95 for (i = 0; i < row;i++) 96 { 97 if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') 98 return board[i][1]; 99 } 100 //竖三列 101 for (i = 0; i < col; i++) 102 { 103 if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') 104 return board[1][i]; 105 } 106 //两条对角线 107 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') 108 return board[1][1]; 109 if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') 110 return board[1][1]; 111 //继续游戏 112 for (i = 0; i < row; i++) 113 { 114 for (j = 0; j < col;j++) 115 { 116 if (board[i][j] == ' ') 117 return 'C'; 118 } 119 } 120 //平局状态 121 return 'P'; 122 }

浙公网安备 33010602011771号