1.创建初始菜单页面
2.初始化棋盘(3*3)
3.打印棋盘内容
4.玩家下棋
5.电脑随机下棋
6.判断输赢
#pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 //行 #define COL 3 //列 //菜单函数 void meau(); //初始化棋盘 void InitChess(char board[ROW][COL]); //打印棋盘 void Showboard(char board[ROW][COL]); //玩家下棋 void Player(char board[ROW][COL]); //电脑下棋 void Computer(char board[ROW][COL]); //判断输赢 //玩家赢 W //玩家数 L //平局 F //游戏继续 C char JudgeWin(char board[ROW][COL]); //进行游戏 void Game();
//菜单函数 void meau() { printf("******************************************\n"); printf("******* 1. PLAY *********\n"); printf("******* 0. EXIT *********\n"); printf("******************************************\n"); }
将3*3的棋盘内容初始化为空格
//初始化棋盘 初始化为空格 void InitChess(char board[ROW][COL]) { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { board[i][j] = ' '; } } }
//打印棋盘 void Showboard(char board[ROW][COL]) { int i; for (i = 0; i < ROW; i++) { int j; for (j = 0; j < COL; j++) { printf(" %c ", board[i][j]); //打印每一行的每一个数据和后面分隔符 printf("|"); } printf("\n"); //换行 if (i < ROW-1) { int j; for (j = 0; j < COL; j++) { printf("---"); printf("|"); } printf("\n"); } } }
这种方法可以打印n*n式的棋盘
效果演示:
考虑内容:
1.在棋盘范围内落子,若不在范围内,重新输入
2.输入坐标为玩家主观感受,并非二维数组正常下标、例如(0,0)位置玩家需输入(1,1)
代码演示:
void Player(char board[ROW][COL]) { int x = 0; int y = 0; printf("请玩家落子\n"); while (1) { printf("请输入棋子的坐标:"); scanf("%d %d", &x, &y); //判断坐标是否合法 (玩家输入的坐标从1开始并非二维数组的0开始) 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"); } } }
使用时间函数,产生随机值(不过此方法电脑想赢玩家太难),在棋盘范围内落子
在主函数内下时间戳srand函数
void Computer(char board[ROW][COL]) { printf("电脑落子\n"); while (1) { int x = rand() % ROW; int y = rand() % COL; if (board[x][y] == ' ') { board[x][y] = '+'; break; } } }
效果演示:
//玩家赢 返回W
//玩家数返回 L
//平局返回F (判断是否和棋)
//游戏继续返回 C
1.判断输赢,从各行,各列,对角线是否满足
2.判断和棋,需要判断棋盘内容是否已满创建IsFull函数,此函数只应用于判断输赢,可设置为static静态保护,隐藏文件。
代码实现:
//判断棋盘是否满了 static int Isfull(char board[ROW][COL])//只服务与判断输赢 利用static静态 { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == ' ') return 0; //没有满 } } return 1; //满了 } //判断输赢 char JudgeWin(char board[ROW][COL]) { //判断三行 for (int row = 0; row < ROW; row++) { if (board[row][0] != ' '&& board[row][0] == board[row][1]&& board[row][1] == board[row][2]) { if (board[row][0] == '*') return 'W'; else return 'L'; } } //判断三列 for (int col = 0; col < COL; col++) { if (board[0][col] != ' '&& board[0][col] == board[1][col]&& board[0][col] == board[2][col]) { if (board[0][col] == '*') return 'W'; else return 'L'; } } //判断对角线 if (board[1][1] != ' '&& board[0][0] == board[1][1]&& board[1][1] == board[2][2]) { if (board[1][1] == '*') return 'W'; else return 'L'; } if (board[2][0] != ' '&& board[2][0] == board[1][1]&& board[2][0] == board[0][2]) { if (board[2][0] == '*') return 'W'; else return 'L'; } //判断平局 //如果棋盘满了 返回1 没满返回0 if (Isfull(board) ==1) { return 'F'; } else return 'C'; }
void Game() { //储存数据 二维数组 char board[ROW][COL]; char net = 0; //接受游戏状态 InitChess(board); Showboard(board); while (1) { //玩家下棋 Player(board); Showboard(board); net = JudgeWin(board); if (net != 'C') break; //电脑下棋 Computer(board); Showboard(board); net = JudgeWin(board); if (net != 'C') break; } if (net == 'W') { printf("恭喜玩家获胜\n"); } else if (net == 'L') { printf("真可惜玩家输了\n"); } else if(net=='F') printf("平局\n"); }
#define _CRT_SECURE_NO_WARNINGS #include"play.h" int main() { int num; srand((unsigned int)time(NULL)); do { meau(); printf("请选择>"); scanf("%d", &num); switch (num) { case 1: Game(); break; case 0: printf("退出游戏^*^\n"); break; default: printf("选择错误,请重新输入\n"); break; } } while (num); return 0; }
游戏效果展示:
这种方法满足基本实现,但是电脑过于笨重,可以在电脑落子的函数进行针对于于玩家获胜的算法设计
//头文件 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 //菜单函数 void meau(); //初始化棋盘 void InitChess(char board[ROW][COL]); //打印棋盘 void Showboard(char board[ROW][COL]); //玩家下棋 void Player(char board[ROW][COL]); //电脑下棋 void Computer(char board[ROW][COL]); //判断输赢 //玩家赢 W //玩家数 L //平局 F //游戏继续 C char JudgeWin(char board[ROW][COL]); //进行游戏 void Game(); //函数实现 #define _CRT_SECURE_NO_WARNINGS #include"play.h" //菜单函数 void meau() { printf("******************************************\n"); printf("******* 1. PLAY *********\n"); printf("******* 0. EXIT *********\n"); printf("******************************************\n"); } //初始化棋盘 初始化为空格 void InitChess(char board[ROW][COL]) { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { board[i][j] = ' '; } } } //打印棋盘 void Showboard(char board[ROW][COL]) { int i; for (i = 0; i < ROW; i++) { int j; for (j = 0; j < COL; j++) { printf(" %c ", board[i][j]); //打印每一行的每一个数据和后面分隔符 printf("|"); } printf("\n"); //换行 if (i < ROW-1) { int j; for (j = 0; j < COL; j++) { printf("---"); printf("|"); } printf("\n"); } } } //玩家下棋 void Player(char board[ROW][COL]) { int x = 0; int y = 0; printf("请玩家落子\n"); while (1) { printf("请输入棋子的坐标:"); scanf("%d %d", &x, &y); //判断坐标是否合法 (玩家输入的坐标从1开始并非二维数组的0开始) 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(char board[ROW][COL]) { printf("电脑落子\n"); while (1) { int x = rand() % ROW; int y = rand() % COL; if (board[x][y] == ' ') { board[x][y] = '+'; break; } } } //判断棋盘是否满了 static int Isfull(char board[ROW][COL])//只服务与判断输赢 利用static静态 { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == ' ') return 0; //没有满 } } return 1; //满了 } //判断输赢 char JudgeWin(char board[ROW][COL]) { //判断三行 for (int row = 0; row < ROW; row++) { if (board[row][0] != ' '&& board[row][0] == board[row][1]&& board[row][1] == board[row][2]) { if (board[row][0] == '*') return 'W'; else return 'L'; } } //判断三列 for (int col = 0; col < COL; col++) { if (board[0][col] != ' '&& board[0][col] == board[1][col]&& board[0][col] == board[2][col]) { if (board[0][col] == '*') return 'W'; else return 'L'; } } //判断对角线 if (board[1][1] != ' '&& board[0][0] == board[1][1]&& board[1][1] == board[2][2]) { if (board[1][1] == '*') return 'W'; else return 'L'; } if (board[2][0] != ' '&& board[2][0] == board[1][1]&& board[2][0] == board[0][2]) { if (board[2][0] == '*') return 'W'; else return 'L'; } //判断平局 //如果棋盘满了 返回1 没满返回0 if (Isfull(board) ==1) { return 'F'; } else return 'C'; } //进行游戏 void Game() { //储存数据 二维数组 char board[ROW][COL]; char net = 0; //接受游戏状态 InitChess(board); Showboard(board); while (1) { //玩家下棋 Player(board); Showboard(board); net = JudgeWin(board); if (net != 'C') break; //电脑下棋 Computer(board); Showboard(board); net = JudgeWin(board); if (net != 'C') break; } if (net == 'W') { printf("恭喜玩家获胜\n"); } else if (net == 'L') { printf("真可惜玩家输了\n"); } else if(net=='F') printf("平局\n"); } //测试用例(主函数) #include"play.h" int main() { int num; srand((unsigned int)time(NULL)); do { meau(); printf("请选择>"); scanf("%d", &num); switch (num) { case 1: Game(); break; case 0: printf("退出游戏^*^\n"); break; default: printf("选择错误,请重新输入\n"); break; } } while (num); return 0; }