前言
正所谓“兵马未动,粮草先行”,我们再写一个程序之前,应先想清楚他的流程,再动手。
下面是我想的游戏流程,供大家参考:
1.创建棋盘,并且初始化,首先把所有位置都设为空格。
2.打印棋盘。
3.玩家落子,让玩家输入一组坐标(row,col)进行落子。
4.判定获胜。
5.电脑进行落子,随机落子。
6.判定获胜。
一、创建棋盘
首先解决如何表示棋盘
我们便想到了二维数组,创建一个3*3的二维数组,每一个元素是一个char类型,因为后续落子时,‘x’表示玩家一,‘o’表示玩家二,空格表示未落子。
#define MAX_ROW 3
#define MAX_COL 3
//初始化棋盘
void init(char chess[MAX_ROW][MAX_COL]) {
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++){
chess[row][col] = ' ';
}
}
}
二、打印棋盘
代码如下(示例):
//打印棋盘
void print(char chess[MAX_ROW][MAX_COL]) {
printf("+---+---+---+\n");
for (int row = 0; row < MAX_ROW; row++) {
printf("|");
for (int col = 0; col < MAX_COL; col++) {
printf(" %c |", chess[row][col]);
}
printf("\n+---+---+---+\n");
}
}
三、玩家落子
在此过程中需要考虑多种情况,玩家有可能会乱输.
代码如下(示例):
//玩家落子
void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {
while (1) {
int row = 0;
int col = 0;
printf("请输入落子位置(row,col)\n");
scanf("%d %d", &row, &col);
if (row < 0 || row >= 3 || col < 0 || col >= 3) {
printf("您的输入非法!请重新输入\n");
continue;
}
if (chessBoard[row][col] != ' ') {
printf("该位置已经落子,请重新输入\n");
continue;
}
system("cls");//在下一个结果显示之前清屏
chessBoard[row][col] = 'x';
break;
}
}
四、电脑落子
//电脑落子
void computerMove(char chessBoard[MAX_ROW][MAX_COL]) {
srand((char)time(0));
while (1) {
system("cls");
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (chessBoard[row][col] != ' ') {
continue;
}
chessBoard[row][col] = 'o';
break;
}
}
五、判断胜负
我们都知道三子棋判断胜负的标准,横三个,竖三个或者对角线.我们设定:玩家赢,输出’x’,电脑赢,输出’o’,胜负未分,还要继续输出’ ‘,和棋输出’p’.
另外,判断胜负未分的时候,我们就需要判断这个棋盘是否满,如果满了,就是和棋,未满就是胜负未分,需要继续.
//判断棋盘是否满
int isFull(char chessBoard[MAX_ROW][MAX_COL]) {
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++) {
if (chessBoard[row][col] == ' ')
return 0;
}
}
return 1;
}
//判断获胜
char isGameover(char chessBoard[MAX_ROW][MAX_COL]) {
for (int row = 0; row < MAX_ROW; row++) {
if (chessBoard[row][0] != ' ' &&
chessBoard[row][1] == chessBoard[row][0] && chessBoard[row][2] == chessBoard[row][0])
return chessBoard[row][0];
}
for (int col = 0; col < MAX_COL; col++) {
if (chessBoard[0][col] != ' ' &&
chessBoard[1][col] == chessBoard[0][col] && chessBoard[2][col] == chessBoard[0][col])
return chessBoard[0][col];
}
if (chessBoard[0][0] != ' ' && chessBoard[1][1] == chessBoard[0][0] && chessBoard[2][2] == chessBoard[0][0])
return chessBoard[0][0];
if (chessBoard[0][2] != ' ' && chessBoard[1][1] == chessBoard[0][2] && chessBoard[2][0] == chessBoard[0][2])
return chessBoard[0][2];
if (isFull(chessBoard))
return 'q';
else return ' ';
}
五、完整程序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_ROW 3
#define MAX_COL 3
//初始化棋盘
void init(char chess[MAX_ROW][MAX_COL]) {
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++){
chess[row][col] = ' ';
}
}
}
//打印棋盘
void print(char chess[MAX_ROW][MAX_COL]) {
printf("+---+---+---+\n");
for (int row = 0; row < MAX_ROW; row++) {
printf("|");
for (int col = 0; col < MAX_COL; col++) {
printf(" %c |", chess[row][col]);
}
printf("\n+---+---+---+\n");
}
}
//玩家落子
void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {
while (1) {
int row = 0;
int col = 0;
printf("请输入落子位置(row,col)\n");
scanf("%d %d", &row, &col);
if (row < 0 || row >= 3 || col < 0 || col >= 3) {
printf("您的输入非法!请重新输入\n");
continue;
}
if (chessBoard[row][col] != ' ') {
printf("该位置已经落子,请重新输入\n");
continue;
}
system("cls");//在下一个结果显示之前清屏
chessBoard[row][col] = 'x';
break;
}
}
//电脑落子
void computerMove(char chessBoard[MAX_ROW][MAX_COL]) {
srand((char)time(0));
while (1) {
system("cls");
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (chessBoard[row][col] != ' ') {
continue;
}
chessBoard[row][col] = 'o';
break;
}
}
//判断棋盘是否满
int isFull(char chessBoard[MAX_ROW][MAX_COL]) {
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++) {
if (chessBoard[row][col] == ' ')
return 0;
}
}
return 1;
}
//判断获胜
char isGameover(char chessBoard[MAX_ROW][MAX_COL]) {
for (int row = 0; row < MAX_ROW; row++) {
if (chessBoard[row][0] != ' ' &&
chessBoard[row][1] == chessBoard[row][0] && chessBoard[row][2] == chessBoard[row][0])
return chessBoard[row][0];
}
for (int col = 0; col < MAX_COL; col++) {
if (chessBoard[0][col] != ' ' &&
chessBoard[1][col] == chessBoard[0][col] && chessBoard[2][col] == chessBoard[0][col])
return chessBoard[0][col];
}
if (chessBoard[0][0] != ' ' && chessBoard[1][1] == chessBoard[0][0] && chessBoard[2][2] == chessBoard[0][0])
return chessBoard[0][0];
if (chessBoard[0][2] != ' ' && chessBoard[1][1] == chessBoard[0][2] && chessBoard[2][0] == chessBoard[0][2])
return chessBoard[0][2];
if (isFull(chessBoard))
return 'q';
else return ' ';
}
int main() {
char winner = ' ';
printf("欢迎来到三子棋游戏\n");
char chessBoard[MAX_ROW][MAX_COL];
init(chessBoard);
while (1) {
print(chessBoard);
playerMove(chessBoard);
winner=isGameover(chessBoard);
if (winner != ' ')
break;
computerMove(chessBoard);
winner = isGameover(chessBoard);
if (winner != ' ')
break;
}
print(chessBoard);
if (winner == 'x')
printf("恭喜您获胜\n");
else if (winner == 'o')
printf("很遗憾,电脑获胜\n");
else
printf("此局为和局\n");
system("pause");
return 0;
}