相信大家都玩过五子棋吧,今天我来写一个简易版的三子棋,第一次写超过200行的代码,是自己的一个进步,这算是我的第一个小项目了。
写三子棋首先要有一个简单的思路:
1. 要有棋盘,初始化棋盘,显示棋盘
2. 该下棋了,人和电脑进行对战,那就需要两个函数,分别是人下棋的函数和电脑下棋的函数。
3. 下完棋之后,每一步都要判断输赢。
我们先来看一下运行结果:
O---------玩家
X---------电脑
首先,打印一个菜单供玩家选择int menu( ),当玩家选择玩游戏时,进入游戏函数 game( )。
进入游戏之后,进行初始化棋盘InitBoard(board, ROW, COL)
初始化完成之后,需要下棋,由电脑和玩家进行对战,ComputerMove(board, ROW, COL),电脑和玩家每一次下完棋都要进行判断是否已经赢了。下列为头文件:
#define ROW 3 #define COL 3 #ifndef __三子棋__H__ #define __三子棋__H__ //初始化 void InitBoard(char arr[ROW][COL], int row, int col); //显示棋盘 void DisplayBoard(char arr[ROW][COL], int row, int col); //电脑下棋 void ComputerMove(char arr[ROW][COL], int row, int col); //人下棋 void PlayerMove(char arr[ROW][COL], int row, int col); //判断输赢 char IsWin(char arr[ROW][COL], int row, int col); #endif __三子棋__H__以下是测试函数功能是否编写正确的代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #include "三子棋.h" int menu(void) { int choose; printf("********************\n"); printf(" 0.退出 \n"); printf(" 1.玩游戏 \n"); printf("********************\n"); printf("choose:"); scanf("%d", &choose); return choose; } void game(void) { char ret = 0; char board[ROW][COL]; InitBoard(board, ROW, COL);//初始化面板 do{ ComputerMove(board, ROW, COL); //电脑下棋 DisplayBoard(board, ROW, COL);//显示棋盘 ret = IsWin(board, ROW, COL);//判断输赢 if (ret == 'X') { printf("你输了\n"); break; } else if (ret == 'O') { printf("你赢了\n"); break; } else if (ret == 'E') { printf("水平相当\n"); break; } PlayerMove(board, ROW, COL); ret = IsWin(board, ROW, COL); DisplayBoard(board, ROW, COL); if (ret == 'X') { printf("你输了\n"); break; } else if (ret == 'O') { printf("你赢了\n"); break; } else if (ret == 'E') { printf("水平相当\n"); break; } } while (1); } int main() { int choose = 0; int ret = 0; srand((unsigned int)time(NULL)); do{ choose = menu(); switch (choose){ case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误\n"); break; } } while (choose); system("pause"); return 0; }
接下来就是各个函数的功能实现了
#define _CRT_SECURE_NO_WARNINGS 1 #include "三子棋.h" #include<stdio.h> #include<stdlib.h> void InitBoard(char arr[ROW][COL], int row, int col)//初始化一个三行三列的棋盘 { int i = 0, j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { arr[i][j] = ' '; } } } void DisplayBoard(char arr[ROW][COL], int row, int col)//显示棋盘 { int i = 0, j = 0; printf("-------------\n"); for (i = 0; i < row; i++) { printf(" %c| %c | %c\n", arr[i][0], arr[i][1], arr[i][2]); printf("-------------\n"); } } //电脑下棋 void ComputerMove(char arr[ROW][COL], int row, int col) { int x = 0, y = 0; while (1) { x = rand() % row;//电脑下棋产生随机数,也就是随机坐标 y = rand() % col; if (arr[x][y] == ' ')//判断为空才能下棋 { arr[x][y] = 'X'; break; } } } //玩家下棋 void PlayerMove(char arr[ROW][COL], int row, int col) { int x = 0, y = 0; printf("请输入你想下的坐标(x,y):"); do{ scanf("%d,%d", &x, &y);//玩家输入坐标2,3 x--; //x-1,y-1就是棋盘的真实坐标 y--; if ((0 <= x &&x <= 2) && (0 <= y && y <= 2))//判断坐标输入是否正确 { if ((arr[x][y] == ' '))//输入坐标没有子才能下棋 { arr[x][y] = 'O'; break; } else { printf("该坐标已有子不能输入,请重新输入:"); } } else { printf("输入坐标有误,请重新输入:"); } } while (1); } static int Isfull(char arr[ROW][COL], int row, int col)//静态函数,只能在此源文件内使用 { //判断棋盘是否已下满 int i = 0, j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (arr[i][j] == ' ') return 0; } } return 1; } //判断输赢,三横三竖或两个对角线即为赢 char IsWin(char arr[ROW][COL], int row, int col) { int i = 0,j = 0; for (i = 0; i < row; i++) { if (((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] == 'X')) || ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[2][i] == 'X'))) return 'X'; if (((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] == 'O')) || ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[2][i] == 'O'))) return 'O'; } if(((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'X')) || ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'X'))) return 'X'; if (((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'O')) || ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'O'))) return 'O'; if(Isfull(arr, row, col)) { return 'E'; } }这就是简易版的三子棋的代码了,写完再看发现也不是特别难,就是一定要有一个清晰的思路。加油加油