今天写了五子棋的代码,虽然这个程序不是特别的难,但是对于我这个C语言小白来说还真的是有点开心,写这个程序的时候最重要的是先搭建框架,再一步步实现具体代码.
基本思路:
用一个二维数组表示棋盘(5 * 5),默认初始化成空格' ',
用字符'x'表示玩家的落子,用'o'表示电脑打的落子,
轮到玩家落子,就提示玩家进行落子(输入一组坐标),
轮到电脑落子,随机下(随机找一个空白的位置落子)
游戏结束判定:
1.玩家胜利
2.电脑胜利
3.和棋
具体代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 5
#define COL 5
char qipan[ROW][COL];
void init(char qipan[ROW][COL]) //初始化函数
{
//初始化成空格;
for (int row = 0; row < ROW; ++row)
{
for (int col = 0; col < COL; ++col)
{
qipan[row][col] = ' ';
}
}
}
void Print(char qipan[ROW][COL]) //打印函数
{
//打印出边框;
printf(" --- --- --- --- ---\n");
for (int row = 0; row < ROW; ++row)
{
printf("| %c | %c | %c | %c | %c |\n", qipan[row][0], qipan[row][1], qipan[row][2],qipan[row][3],qipan[row][4]);
printf(" --- --- --- --- ---\n");
}
}
void playermove(char qipan[ROW][COL]) //玩家下棋函数
{
//玩家下,输入一组坐标;判断坐标是否越界,判断是否已经下过(是否等于空格)
//输入符合 该格' ' = 'x';
while (1)
{
int row = 0;
int col = 0;
printf("请玩家输入坐标[row][col]:");
scanf("%d %d", &row, &col);
if (row < 0 || row >(ROW - 1) || col < 0 || col >(COL - 1))
{
printf("输入错误,请重新输入:\n");
continue;
}
if (qipan[row][col] != ' ')
{
printf("此位置已经下过,请重新输入坐标:\n");
continue;
}
else
{
qipan[row][col] = 'x';
break;
}
}
}
void computermove(char qipan[ROW][COL]) //电脑下棋函数
{
//判断是否已经下过;
//输入符合 该格' ' = 'o';
while (1)
{
int row = rand() % ROW;
int col = rand() % COL;
if (qipan[row][col] != ' ')
{
continue;
}
else
{
qipan[row][col] = 'o';
break;
}
}
}
int isfull(char qipan[ROW][COL]) //判断格子是否下满了;
{
//如果有一个格是' ',就没满,return0;
//如果全部满了 return1;
for (int row = 0; row < ROW; ++row)
{
for (int col = 0; col < COL; ++col)
{
if (qipan[row][col] == ' ')
{
return 0;
}
}
}
return 1;
}
int checkwinner(char qipan[ROW][COL]) //检查函数
{
//检查(遍历);
//三个棋连在一起的所有情况(行和列和对角线);
//检查和棋,所有格都不是' ';
for (int row = 0; row < ROW; ++row)
{
if (qipan[row][0] == qipan[row][1]
&& qipan[row][0] == qipan[row][2]
&& qipan[row][0] == qipan[row][3]
&& qipan[row][0] == qipan[row][4]
&& qipan[row][0] != ' ')
{
return qipan[row][0];
}
}
for (int col = 0; col < COL; ++col)
{
if (qipan[0][col] == qipan[1][col]
&& qipan[0][col] == qipan[2][col]
&& qipan[0][col] == qipan[3][col]
&& qipan[0][col] == qipan[4][col]
&& qipan[0][col] != ' ')
{
return qipan[0][col];
}
}
if (qipan[0][0] == qipan[1][1]
&& qipan[0][0] == qipan[2][2]
&& qipan[0][0] == qipan[3][3]
&& qipan[0][0] == qipan[4][4]
&& qipan[0][0] != ' ')
{
return qipan[0][0];
}
if (qipan[0][4] == qipan[1][3]
&& qipan[0][4] == qipan[2][2]
&& qipan[0][4] == qipan[3][1]
&& qipan[0][4] == qipan[4][0]
&& qipan[0][4] != ' ')
{
return qipan[0][4];
}
if (isfull(qipan) == 1)
{
return 'p';
}
return ' ';
}
int menu() //菜单
{
printf("**********************************\n");
printf("*************1,开始游戏***********\n");
printf("*************0.退出游戏***********\n");
printf("**********************************\n");
int choice = 0;
printf("请输入您的选择:\n");
scanf("%d", &choice);
return choice;
}
void game() //游戏入口
{
//1.初始化棋盘;
init(qipan);
char winner = ' ';
while (1)
{
//2.打印棋盘(第一次是一个空棋盘);
Print(qipan);
//3.玩家下,检测是否结束;
playermove(qipan);
winner = checkwinner(qipan);
if (winner != ' ')
{
break;
}
//4.电脑落子,检测游戏是否结束;
computermove(qipan);
winner = checkwinner(qipan);
if (winner != ' ')
{
break;
}
}
Print(qipan);
//在游戏结束之前再打印一下地图;
if (winner == 'x')
{
printf("^_^玩家胜利!^_^\n");
}
else if (winner == 'o')
{
printf("~_~电脑胜利!~_~\n");
}
else if (winner == 'p')
{
printf("平局\n");
}
else
{
printf("程序错误\n");
}
//循环执行第二步;
}
int main() //主函数
{
//随机种子的设置,一次就行了;
srand((unsigned int)time(0));
while (1)
{
int choice = menu();
if (choice == 1)
{
game();
}
else if (choice == 0)
{
printf("byebye^_^\n");
break;
}
else
{
printf("您的输入有误,请重新输入:\n");
continue;
}
}
system("pause");
return 0;
}