一 要实现三子棋有以下几个基本功能:
1.初始化棋盘:用空字符初始化
2.打印棋盘:控制打印九宫格来表示棋盘
3.玩家下棋:用X表示玩家的棋子
4.电脑随机下棋:随机生成坐标,用0表示玩家的棋子
5.判断输赢:分为玩家赢,电脑赢,平局,继续游戏四种情况
二 程序如下:
1.头文件(函数的声明)
#define _CRT_SECURE_NO_WARNINGS 1 #ifndef __SANZIQI_H__ #define __SANZIQI_H__ #define ROW 3 #define COL 3 //初始化 void InitBorad(char arr[ROW][COL], int row, int col); //显示棋盘 void Display(char arr[ROW][COL], int row, int col); //电脑走 void Computer(char arr[ROW][COL], int row, int col); //人走 void Player(char arr[ROW][COL], int row, int col); //判断是否还有空格 int Check_full(char arr[ROW][COL], int row, int col); //判断输赢 char Is_Win(char arr[ROW][COL], int row, int col); #endif
2.子程序
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h> //初始化 void InitBorad(char arr[ROW][COL], int row, int col) { int i; int j; for (i = 0; i < row;i++) for (j = 0; j < col; j++) arr[i][j] = ' '; } //显示棋盘 void Display(char arr[ROW][COL], int row, int col) { int i; int j; printf("----------\n"); for (i = 0; i < row; i++) { printf("|"); for (j = 0; j < col; j++) { printf("%2c|", arr[i][j]); } printf("\n----------\n"); } } //电脑走 void Computer(char arr[ROW][COL], int row, int col) { srand((unsigned int)time(NULL)); //产生随机数 while (1) { int x = rand() % 3; //产生一个小于3的数 int y = rand() % 3; if (arr[x][y] == ' ') //判断这个元素是否为空 { arr[x][y] = 'X'; break; } } } //人走 void Player(char arr[ROW][COL], int row, int col) { int x; int y; while (1) { printf("请输入坐标:"); scanf("%d%d", &x, &y); x--; y--; if ((0 <= x && x <= row - 1) && (0 <= y && y <= col - 1)) //玩家输入的坐标要在棋盘范围内 { if (arr[x][y] == ' ') { arr[x][y] = 'O'; break; } else { printf("你输入的下标被占,请重新输入!\n"); } } else { printf("越界了,请重新输入!\n"); } } } //判断是否还有空格 int Check_full(char arr[ROW][COL], int row, int col) { int i; int j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (arr[i][j] == ' ') //判断数组中有没有空格,如果出现一次空格,就已经可以证明数组没满 return 0; } } return 1; } //判断输赢 char Is_Win(char arr[ROW][COL], int row, int col) { int i; if (Check_full(arr, ROW, COL) == 1) //棋盘满了没有空格,平局 return 'Q'; for (i = 0; i < row; i++)//某一行连3 { if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2]) return arr[i][1]; } for (i = 0; i < col; i++) //某一列连3 { if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i]) return arr[1][i]; } if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]) //右对角线\连3 return arr[1][1]; if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0]) //左对角线/连3 return arr[1][1]; return ' '; //如果没有判断出谁赢并且棋盘还没满,则继续进行游戏 }
3.主函数 即main
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> void menu() { printf("**************************************\n"); printf("*************** 1.play ***************\n"); printf("*************** 0.exit ***************\n"); printf("**************************************\n"); } void game() { char arr[ROW][COL]; InitBorad(arr,ROW,COL);//初始化棋盘 //Display(arr, ROW, COL); do{ Computer(arr, ROW, COL); //电脑先走 Display(arr, ROW, COL); //打印棋盘 if (Is_Win(arr, ROW, COL) != ' ') //如果棋盘不为空的话,即判断出谁赢或平局,就跳出循环 { break; } Player(arr, ROW, COL); //玩家走 Display(arr, ROW, COL); //打印棋盘 if (Is_Win(arr, ROW, COL) != ' ') //如果棋盘不为空的话,即判断出谁赢或平局,就跳出循环 { break; } } while (Is_Win(arr, ROW, COL) == ' '); //如果棋盘没有满,同时也没有判断出输赢的话,继续执行循环,否则跳出循环 if (Is_Win(arr, ROW, COL) == 'O') printf("玩家赢\n"); else if (Is_Win(arr, ROW, COL) == 'X') printf("电脑赢\n"); else if (Is_Win(arr, ROW, COL) == 'Q') printf("平局\n"); } int main() { int choose = 0; do{ menu(); printf("请选择>"); scanf("%d", &choose); switch (choose) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,重新输入!\n"); } } while (choose); system("pause"); return 0; }
程序运行结果如下: