文章目录
试玩过程,如遇Bug,请给予反馈。
游戏代码GitHub下载链接
思路整理
这个游戏的棋盘实际是个字符二维数组,你或许会问,二维数组很简单你的棋盘看起来有点复杂,实际上,二维数组就是一般的二维数组,在双方都未曾落子之前这个二维数组的所有元素都被初始化为一个‘ ’
,当玩家下子之后,对玩家输入的坐标判断,如果合法且仍然是‘ ’
,就将二位坐标对应的二维数组下标的元素更改成W
,来表示玩家的棋子。在打印棋盘时候,在数组元素前后留空,行与行之间,列与列之间加上线段即可。
//打印棋盘函数代码
void Printboard(char board[ROW][LIST], int row, int list)
{
for (int i = 0; i < row; i++)
{
printf(" %c | %c | %c\n",
board[i][0], board[i][1], board[i][2]);
if (i < row - 1)
printf(" ---|---|---\n");
}
}
而在电脑下棋函数中,我们采用生成随机数的方法,随机生成合法坐标并落子。
头文件
#ifndef __GAME_H__
#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<cstdlib>
#define ROW 3
#define LIST 3
void Printboard(char board[ROW][LIST], int row, int list);
void Initboard(char board[ROW][LIST], int row, int list);
void PlayerMove(char board[ROW][LIST], int row, int list);
char CheckWin(char board[ROW][LIST], int row, int list);
void ComputerMove(char board[ROW][LIST], int row, int list);
#endif//__GAME_H__
测试代码
#include"game.h"
void menu()
{
printf("\n\n\n");
printf(" *******************************************\n");
printf(" 1、play game 0、exit \n");
printf(" *******************************************\n");
}
void game()
{
char win=' ';
char board[ROW][LIST] = { 0 };
srand((unsigned int)time(nullptr));
Initboard(board, ROW, LIST);
Printboard(board,ROW,LIST);
while (1)
{
PlayerMove(board, ROW, LIST);
Printboard(board, ROW, LIST);
win = CheckWin(board, ROW, LIST);
if (win != ' ')
break;
ComputerMove(board, ROW, LIST);
Printboard(board, ROW, LIST);
win = CheckWin(board, ROW, LIST);
if (win != ' ')
break;
}
if (win == 'P')
printf("很好,你已经和电脑达成了平手!\n");
else if (win == 'W')
printf("恭喜你,玩家赢了!\n");
else
printf("很遗憾,电脑赢取了比赛!\n");
}
void Test()
{
int input;
do
{
menu();
printf(" 请输入选择>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (input);
}
int main()
{
Test();
return 0;
}
游戏实现
#include"game.h"
void Printboard(char board[ROW][LIST], int row, int list)
{
for (int i = 0; i < row; i++)
{
printf(" %c | %c | %c\n", board[i][0], board[i][1], board[i][2]);
if (i < row - 1)
printf(" ---|---|---\n");
}
}
void Initboard(char board[ROW][LIST], int row, int list)
{
memset(board, ' ', row*list*sizeof(board[0][0]));
}
void PlayerMove(char board[ROW][LIST], int row, int list)
{
int x, y;
printf("玩家走:>");
scanf("%d%d", &x, &y);
if (x > 0 && x<ROW + 1 && y>0 && y < LIST + 1)
{
if (board[x - 1][y - 1] == ' ')
board[x - 1][y - 1] = 'W';
else
printf("你输入的位置有棋子,请输入合法坐标\n");
}
else
printf("你输入的数据不合法,横坐标不大于%d,纵坐标不大于%d", ROW, LIST);
}
bool IsFull(char board[ROW][LIST], int row, int list)
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < LIST;j++)
if (board[i][j] == ' ')
return false;
}
return true;
}
char CheckWin(char board[ROW][LIST], int row, int list)
{
int i = 0;
for (i = 0; i < ROW; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ')
return board[i][0];
}
for (i = 0; i < LIST; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[2][i] != ' ')
return board[0][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ')
return board[0][0];
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
return board[1][1];
if (IsFull(board,row,list))
{
return 'P';
}
return ' ';
}
void ComputerMove(char board[ROW][LIST], int row, int list)
{
printf("电脑走:>\n");
int x = rand() % ROW;
int y = rand() % LIST;
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = 'C';
break;
}
else
{
x = rand() % ROW;
y = rand() % LIST;
}
}
}