void Menu() { printf("|--------------------------------|\n"); printf("|1.ThreeChess 0.Exit |\n"); printf("|--------------------------------|\n"); }
也可以添加2,3,4…选项添加更多游戏选项。
有了菜单我们还需要一个棋盘,但这个棋盘是用一个二维数组实现的但是这个二位数组我们该用什么实现呢?经过我多次思考决定用字符型比较好,我们分别用O表示玩家的棋子,X表示电脑的棋子。我们创建了一个函数得初始化,初始化我决定封装成函数,来提升代码的可读性。
int main() { int select = 0; int quit = 0; while (!quit){ //输入错误数字不能退出 Menu(); printf("Please Select# "); scanf("%d", &select); switch (select){ case 1: Game(); break; case 0: quit = 1; break; default: printf("Enter Error, Try Again!\n"); break; } } printf("ByeBye!\n"); system("pause"); return 0; }
#define ROW 3 #define COL 3 #define INIT ' ' //此处表示空格 #define BLACK 'X' #define WHITE 'O' //表示人和电脑棋子 #define DRAW 'D' //此为平局 #define NEXT 'N' //若棋子落盘正确进入下一步
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("You == Computer!\n"); break; default: printf("BUG!\n"); //Do Nothing! break; } }
void InitBoard(char board[][COL],int row,int col) { int i,j; for (i = 0; i < row; i++){ for (j = 0; j < col; j++){ board[i][j] = INIT; } } }
这里将棋盘全设置为空白
void ShowBoard(char board[][COL],int row,int col) { int i,j; system("cls"); printf(" "); for (i = 0; i < col; i++){ printf("%4d", i+1); } printf("\n--------------\n"); for (i = 0; i < row; i++){ printf("%-2d", i+1); //2 for (j = 0; j < col; j++){ printf("| %c ", board[i][j]); //12 } printf("\n--------------\n"); } }
游戏开始时第一次展示棋盘
char IsEnd(char board[][COL], int row, int col) { int i,j; for (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 (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[1][1] != INIT){ return board[1][1]; } if (board[0][2] == board[1][1] && \ board[1][1] == board[2][0] && \ board[1][1] != INIT){ return board[1][1]; } for (i = 0; i < row; i++){ for (j = 0; j < col; j++){ if (board[i][j] == INIT){ return NEXT; } } } return DRAW; //若以上情况都不是,则判为平局 }
若最终无胜负则判为平局
void PlayerMove(char board[][COL], int row, int col) { int x = 0; int y = 0; while (1){ printf("Please Enter Postion<x,y># "); scanf("%d %d", &x, &y); if (x < 1 || y < 1 || x > 3 || y > 3){ //判断落子是否合法 printf("Enter Postion Error!\n"); continue; } if (board[x - 1][y - 1] == INIT){ //若此处无子,则在此处落子 board[x - 1][y - 1] = WHITE; break; } else{ printf("Postion Is Not Empty!\n"); } } }
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; } } }
#ifndef __GAME_H__ #define __GAME_H__ #include <stdio.h> #include <time.h> #include <stdlib.h> #include <windows.h> #define ROW 3 #define COL 3 #define INIT ' ' #define WHITE 'X' //Player #define BLACK 'O' //Computer #define DRAW 'D' #define NEXT 'N' #pragma warning(disable:4996) extern void Game(); #endif
首先我们需要一个菜单这个菜单能根据你的输入决定是要开始游戏还是退出游戏,再是棋盘这一定是一个二维数组的棋盘。再是玩家下棋和电脑下棋最后再是判断输赢。