在学习了二维数组后,为了对学过的知识进行巩固,我做了一个三子棋小游戏,这里把代码以及思路写在这里,供大家参考交流。
棋盘设计主要使用二维数组,通过输入坐标来定位落子位置,将对应数组元素改为相应符号模拟下棋的过程。
下面是代码运行结果:


下面是游戏的具体代码:
game.c
这里存放的是实现游戏功能的代码
#include "game.h"
void InitBoard(char board[ROW][COL], int row, int col)//棋盘数组值初始化
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';//将每个未落子的格子设为空字符
}
}
}
void DispalyBoard(char board[ROW][COL], int row, int col)//打印棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ",board[i][j]); //落子打印
if (j < col - 1)
printf("|"); //竖边框打印
}
printf("\n");
if(i<row-1) //横边框打印
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
void PlayerMove(char board[ROW][COL], int row, int col)//玩家下棋
{
int x, y;
while(1)
{
printf("请输入坐标:\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标是否在范围内
{
if (board[x - 1][y - 1] == ' ')//判断所选坐标是否被占用
{
board[x - 1][y - 1] = '*';
break; //落子成功后跳出循环
}
else printf("位置已有棋子\n");
}
else printf("超出棋盘范围\n");
}
}
void ComputerMove(char board[ROW][COL], int row, int col)//电脑落子
{
int x, y;
printf("电脑落子:\n");
while (1)
{
x = rand() % row; //生成随机数作为坐标
y = rand() % col;
if (board[x][y] == ' ')//判断坐标是否被占用
{
board[x][y] = '#';
break; //落子成功跳出循环
}
}
}
//返回*:玩家赢
//返回#:电脑赢
//返回c:无输赢
//返回q:平局
char IsWin(char board[ROW][COL], int row, int col)//输赢判断
{
int x = 0;
int y = 0;
int z = 0;
int i = 0;
int j = 0;
for (i = 0; i < row; i++) //判断是否行满赢
{
x = 0;
for (j = 1; j < col; j++)
{
if (board[i][j] != ' ')
if (board[i][j] == board[i][j - 1])
x++;
}
if (x == col - 1)
return board[i][i];//返回‘*’或‘#’
}
for (j = 0; j < col; j++) //判断是否列满赢
{
y = 0;
for (i = 1; i < row; i++)
{
if (board[i][j] != ' ')
if (board[i][j] == board[i - 1][j])
y++;
}
if (y == row - 1)
return board[j][j];
}
for (i = 1; i < row; i++) //判断正对角线
{
if (board[i][i] != ' ')
if (board[i][i] == board[i-1][i-1])
z++;
}
if (z == row - 1)
return board[0][0];
for (i = 1; i < row; i++) //判断反对角线
{
int a = col -1- i;
if (board[i][a] != ' ')
if (board[i][a] == board[i-1][a+1])
z++;
}
if (z == row - 1)
return board[0][col-1];
for (i = 0; i < row; i++) //判断是否下满平局
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 'c';//未下满返回‘C’
}
}
}
return 'q';//下满平局返回‘q’
}
test.c
这里是游戏进程控制函数
#include<stdio.h>
#include "game.h"
void start_game() //开始游戏
{
char ca ;
char board[ROW][COL];
InitBoard(board, ROW, COL); //初始化棋盘
DispalyBoard(board, ROW, COL); //打印棋盘
while (1)
{
PlayerMove(board, ROW, COL);//玩家下棋
DispalyBoard(board, ROW, COL);
ca=IsWin(board, ROW, COL);
if (ca !='c') //判断输赢,输赢产生时跳出循环
break;
ComputerMove(board, ROW, COL);//电脑下棋
DispalyBoard(board, ROW, COL);
ca = IsWin(board, ROW, COL);
if (ca !='c') //判断输赢,输赢产生时跳出循环
break;
}
switch (ca)//游戏结果打印
{
case '*':printf("玩家胜利\n"); break;
case '#':printf("电脑胜利\n"); break;
case 'q':printf("平局\n"); break;
default:break;
}
}
void start_print() { //游戏开始界面打印
printf("————————————————————\n");
printf("********** 欢迎进入三子棋游戏 *********\n");
printf("********** 开始游戏请输入:1 *********\n");
printf("********** 退出游戏请输入:0 *********\n");
printf("————————————————————\n");
}
int main() //游戏主函数
{
int ma = 0;
srand((unsigned int)time(NULL));//随机数随机起始时间设定
do
{
start_print();
printf("请选择:\n");
scanf("%d",&ma);
switch (ma)//判断玩家选择
{
case 1:
start_game(); //进入游戏
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
} while (ma);//选择退出时ma为0,跳出循环退出游戏
return 0;
}
game.h
函数声明及宏定义
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3//定义棋盘为三行三列,且输赢判断棋子数为三
#define COL 3
void InitBoard(char board[ROW][COL],int row,int col );
void DispalyBoard(char board [ROW][COL],int row,int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
这个三子棋游戏还有待优化的地方:
这里电脑下棋并不智能,需要增加算法使电脑有判断能力而不是随机下
可以增加先后手选择和双人模式选择
输赢判断只有简单的行列对角线判断,任一项下满则赢。如果需要实现五子棋功能,则需要该进斜对角线判断。
如果存在问题,请大家指正!欢迎大家讨论!