目录
前言
本文使用简单二维数组实现三子棋小游戏,包含三个文件:game.h,test.c,game.c。
game.c:函数主题的定义与实现。
test.c:调用game.中的函数实现游戏与界面。
game.h:声明函数,作为头文件,其他文件直接引用较为方便,提高编写效率。
后附完整代码。
一、三子棋小游戏。
三子棋是一种棋类游戏,是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。
棋盘呈横三行列,纵三列分布,为九宫格样式。因为棋盘结构简单,所以在没有制式棋盘时,我们甚至可以随手拿笔画一个简易棋盘来进行游戏,而这最大的好处就是随便找个地方就可以玩这个简单而有趣的游戏了。
二、游戏实现
1.简单界面实现
我们使用C语言来实现简单的三子棋小游戏
2.初始化棋盘
初始化棋盘为空格,如下图所示
将棋盘未落子区域设为空格,本次为3*3棋盘,二维数组定义最好使用宏定义数组大小,方便后期棋盘扩大及改动。
//初始化棋盘为空格 void InitBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { board[i][j] = ' '; } } }
3.玩家下棋和电脑落子
输入坐标(x,y),x,y使用空格隔开,思想很简单,当坐标为空时落子,不为空则重新输入。
电脑落子则采用随机数,生成棋盘范围内的随机坐标,落子规则与玩家落子相同。
3.1 玩家下棋
玩家通过选择合理坐标下棋
玩家落子为 *
//玩家下棋
void PlayerMove(char board[ROW][COL],int row,int col)
{
int x = 0, y = 0;
printf("玩家下棋\n");
while (1)
{
printf("请输入下棋坐标,用空格隔开:");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("此坐标已被占有,无法落子,请重新输入坐标:");
}
}
else
{
printf("输入坐标不合法,请重新输入:");
}
}
}
3.2 电脑落子
电脑落子通过生成合理的随机数坐标来实现
电脑落子为 #
//电脑落子
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("电脑下棋:\n");
while (1)
{
x = rand() % row; //0 到 row - 1
y = rand() % col; //0 到 col - 1
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
4.胜负判断
游戏的过程实现了,那么胜负也是大家所关注的,按照游戏规则,我们可以设计出各种情况下的胜负之分,当然还要考虑游戏中必不可少的平局情况
通过IsWin函数判断胜负,返回不同的字符来判断玩家胜出或电脑胜出,还调用了IsFull函数判断棋盘是否满,作为平局判断的条件。
返回 * 则为玩家胜利
其他结果参照规则。
//判断输赢 char IsWin(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++)//判断行 { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') return board[i][0]; } //判断列 for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i]&&board[1][i]!=' ') return board[0][i]; } //判断对角线 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') return board[1][1]; if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') return board[1][1]; //判断平局,棋子落满即为平局 if (IsFull(board, ROW, COL) == 1) { return 'P'; } return 'C';//继续 }
具体实现代码附在文后。
改进方案:
提供更友好的用户界面:可以使用图形化界面或者命令行界面等方式来提高用户体验。比如,在图形化界面中,可以使用鼠标点击来落子,同时也可以显示胜负结果等信息。
实现更智能的 AI 算法:可以使用 Minimax 算法或 Alpha-Beta 剪枝算法等来实现更智能的电脑玩家。这样可以提高游戏的趣味性和挑战性。
支持多种模式:可以支持单人模式和双人模式等多种游戏模式,让玩家可以在不同的场景下享受游戏乐趣。
添加音效和背景音乐:可以添加音效和背景音乐等元素,以提高游戏的娱乐性和互动性。
优化游戏性能:可以通过合理的数据结构和算法设计,以及代码优化等方式来提高游戏性能。比如,在判断胜负时,可以避免重复计算,以提高游戏运行效率。
实现代码:
game.h
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(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);
game.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
//初始化棋盘为空格
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
int j = 0;
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 = 0, y = 0;
printf("玩家下棋\n");
while (1)
{
printf("请输入下棋坐标,用空格隔开:");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("此坐标已被占有,无法落子,请重新输入坐标:");
}
}
else
{
printf("输入坐标不合法,请重新输入:");
}
}
}
//电脑落子
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("电脑下棋:\n");
while (1)
{
x = rand() % row; //0 到 row - 1
y = rand() % col; //0 到 col - 1
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断棋盘是否落满子
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)//判断行
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
return board[i][0];
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i]&&board[1][i]!=' ')
return board[0][i];
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
//判断平局,棋子落满即为平局
if (IsFull(board, ROW, COL) == 1)
{
return 'P';
}
return 'C';//继续
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{
printf("***********************\n");
printf("******* 1.play ********\n");
printf("******* 0.exit ********\n");
printf("***********************\n");
}
void game()
{
char board[ROW][COL] = { 0 };
//初始化棋盘
InitBoard(board, ROW,COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
char ret = 0;
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断输赢
ret=IsWin(board, ROW, COL);
if (ret != 'C')
break;
//电脑下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
{
printf("玩家获胜!\n");
}
else if (ret == '#')
{
printf("电脑获胜!\n");
}
else
printf("平局\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误,重新选择");
break;
}
} while (input);
return 0;
}