三子棋
目录
三子棋
三子棋含义:
基本思路:
1.创建用户交互菜单界面
2.初始化棋盘
3.显示棋盘面板
4.用户落子
5.电脑随机正确落子
6.判断胜负
7.创建Game界面
完整代码
代码结果显示
三子棋含义:
三子棋是黑白棋的一种。三子棋又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。图例如下:
基本思路:
1.创建用户交互菜单界面
2.初始化棋盘
3.显示棋盘面板(为了不重复显示棋盘,使用清屏操作)
4.用户落子
5.判断胜负
6.电脑随机正确落子
7.判断胜负
(在每次写程序之前,可以向如下图所示,写出思路或伪代码)
创建多文件项目:
写代码之前,首先建立三个文件,以方便后序代码更加完整清晰地呈现。
1.创建用户交互菜单界面
void Meau(){printf("+------ meau ----------+\n");printf("|---- 1.play --------|\n");printf("|---- 0.quit --------|\n");printf("+----------------------+\n");}
2.初始化棋盘
使用宏定义,将棋盘中的内容初始化为空。
static void InitBoard(char board[][COL], int row, int col){for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){board[i][j] = INIT;}}}
3.显示棋盘面板
为了不重复显示棋盘,使用清屏操作,使得每次现实的棋盘只有一张。
通过不断调试,使得最终界面,与预期所需界面一致。
static void ShowBoard(char board[][COL],int row,int col){system("cls");//清屏操作printf(" ");for (int i = 0; i < col; i++){printf(" %3d", i + 1);}printf("\n----------------\n");for (int i = 0; i < row; i++){printf("%-2d", i + 1);for (int j = 0; j < col; j++){printf("| %c ", board[i][j]);}printf("\n----------------\n");}}
4.用户落子
落子只能落在为空的位置上,所以在落子前需要判空,若为空,则落子,否则提示重新落子。
static void PlayerMove(char board[][COL], int row, int col){int x = 0;int y = 0;while (1){printf("please enter your postion<x,y>: ");scanf("%d %d", &x, &y);if (x<1 || x>3 || y<1 || y>3){printf("Postion Error!");continue;}if (board[x - 1][y - 1] == INIT){board[x - 1][y - 1] = WHITE;break;}else{printf("Postion Is Not Empty!\n");}}}
5.电脑随机正确落子
使用随机数,在正确位置落子。
static void ComputerMove(char board[][COL], int row, int col){while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == INIT){board[x][y] = BLACK;break;}}}
6.判断胜负
static char IsEnd(char board[][COL], int row, int col){for (int i = 0; i < row; i++){if (board[i][0] == board[i][1] && \board[i][1] == board[i][2] && \board[i][0] != INIT){return board[i][0];}}for (int j = 0; j < col; j++){if (board[0][j] == board[1][j] && \board[1][j] == board[2][j] && \board[0][j] != INIT){return board[0][j];}}if (board[0][0] == board[1][1] && \board[1][1] == board[2][2] && \board[0][0] != INIT){return board[0][0];}if(board[0][2] == board[1][1] && \board[1][1] == board[2][0] && \board[1][1] != INIT){return board[1][1];}for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){if (board[i][j] == INIT);return NEXT;}}return DRAW;}
7.创建Game界面
void Game(){char board[ROW][COL];InitBoard(board, ROW, COL);srand((unsigned long)time(NULL));char result = 0;while (1){ShowBoard(board, ROW, COL);PlayerMove(board, ROW, COL);result = IsEnd(board, ROW, COL);if (result != NEXT){break;}ShowBoard(board, ROW, COL);ComputerMove(board, ROW, COL);result = IsEnd(board, ROW, COL);if (result != NEXT){break;}}ShowBoard(board, ROW, COL);switch (result){case WHITE:printf("You win!\n");break;case BLACK:printf("you lose!\n");break;case DRAW:printf("it ends in a draw\n"); break;defult:printf("bug\n");break;}}
完整代码
//main.c文件#include"game.h"void Meau(){printf("+------ meau ----------+\n");printf("|---- 1.play --------|\n");printf("|---- 0.quit --------|\n");printf("+----------------------+\n");}int main(){int select = 0;int quit = 0;while (!quit){Meau();printf("please enter your choose: ");scanf("%d", &select);switch (select){case 1:Game();break;case 0:quit = 1;break;defult:printf("Select error!Try again!\n");break;}}printf("byebye!\n");system("pause");return 0;}//game.c 文件#include"game.h"static void InitBoard(char board[][COL], int row, int col){for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){board[i][j] = INIT;}}}static void ShowBoard(char board[][COL],int row,int col){system("cls");printf(" ");for (int i = 0; i < col; i++){printf(" %3d", i + 1);}printf("\n----------------\n");for (int i = 0; i < row; i++){printf("%-2d", i + 1);for (int j = 0; j < col; j++){printf("| %c ", board[i][j]);}printf("\n----------------\n");}}static char IsEnd(char board[][COL], int row, int col){for (int i = 0; i < row; i++){if (board[i][0] == board[i][1] && \board[i][1] == board[i][2] && \board[i][0] != INIT){return board[i][0];}}for (int j = 0; j < col; j++){if (board[0][j] == board[1][j] && \board[1][j] == board[2][j] && \board[0][j] != INIT){return board[0][j];}}if (board[0][0] == board[1][1] && \board[1][1] == board[2][2] && \board[0][0] != INIT){return board[0][0];}if(board[0][2] == board[1][1] && \board[1][1] == board[2][0] && \board[1][1] != INIT){return board[1][1];}for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){if (board[i][j] == INIT);return NEXT;}}return DRAW;}static void PlayerMove(char board[][COL], int row, int col){int x = 0;int y = 0;while (1){printf("please enter your postion<x,y>: ");scanf("%d %d", &x, &y);if (x<1 || x>3 || y<1 || y>3){printf("Postion Error!");continue;}if (board[x - 1][y - 1] == INIT){board[x - 1][y - 1] = WHITE;break;}else{printf("Postion Is Not Empty!\n");}}}static void ComputerMove(char board[][COL], int row, int col){while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == INIT){board[x][y] = BLACK;break;}}}void Game(){char board[ROW][COL];InitBoard(board, ROW, COL);srand((unsigned long)time(NULL));char result = 0;while (1){ShowBoard(board, ROW, COL);PlayerMove(board, ROW, COL);result = IsEnd(board, ROW, COL);if (result != NEXT){break;}ShowBoard(board, ROW, COL);ComputerMove(board, ROW, COL);result = IsEnd(board, ROW, COL);if (result != NEXT){break;}}ShowBoard(board, ROW, COL);switch (result){case WHITE:printf("You win!\n");break;case BLACK:printf("you lose!\n");break;case DRAW:printf("it ends in a draw\n"); break;defult:printf("bug\n");break;}}//game.h文件#ifndef __GAME_H__#define __GAME_H__#include<stdio.h>#include <time.h>#include <stdlib.h>#include<windows.h>#pragma warning(disable:4996)#define ROW 3#define COL 3#define INIT ' '#define WHITE 'X'//player#define BLACK 'O'//computer#define DRAW 'D'#define NEXT 'N'extern void Game();#endif