嘿嘿!三子棋可以说是一个非常简单的游戏
我今天写的是一个无敌人机三子棋
哈哈,听起来巨jier霸气
想完成一个三子棋程序,需要打印棋盘,初始化棋盘,再完成玩家落子与电脑落子的函数
再就是调用上述函数,完成具体功能的一个游戏函数和主函数了。
其他的我就不讲了,我主要说说电脑落子的函数吧!其他等下看代码吧.
第一,我们的目的是电脑赢得游戏,那我们就
以电脑赢得游戏为主导思想;
第二,赢;怎么赢?三子连一线就算获胜,所以就要考虑八种情况电脑赢的方式
第三,在电脑赢不了的情况下,我们一个优先考虑,下一步对手是否能够三子连一线,是 的 话,我们就要堵住他的棋路
第四,在双方选手都无法在下一步赢的游戏胜利,我们就先占领有利位置,优先是中间位置,其次是四个角
第五,在上述都未能执行的情况下且游戏未结束,我只能说我们的目的快达到了,嘿嘿!
我们就抬对方一手,随机落子!哈哈,是不是很膨胀(其实我是不知道这么写了)
好了,接下来看代码吧
#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
void game();
void menu();
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayMove(char board[ROW][COL], int row, int col);
int ComputerMove(char board[ROW][COL], int row, int col);
int IsFull(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
#endif
这是头文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//打印棋盘
void DisplayBoard(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)
{
printf("|");
}
}
printf("\n");
for (j = 1; j < col; j++)
{
printf("------");
}
printf("\n");
}
}
game.c源文件
//game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//打印棋盘
void DisplayBoard(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)
{
printf("|");
}
}
printf("\n");
for (j = 1; j < col; j++)
{
printf("------");
}
printf("\n");
}
}
打印棋盘,我的棋盘有点挫。
//初始化棋盘
void InitBoard(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++)
{
board[i][j] = ' ';
}
}
}
初始化棋盘,将棋盘内所有格子都输入为空格
//玩家落子
void PlayMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("请输入坐标:");
while (1)
{
scanf("%d%d", &x, &y);
if (x > 0 && y > 0 && x <= row&&y <= col)
{
if (' ' == board[x-1][y-1])
{
board[x-1][y-1] = 'X';
break;
}
else
{
printf("坐标输入错误,请重新输入:");
}
}
printf("坐标输入错误,请重新输入:");
}
}
玩家落子,就几行,怎么赢我们人机,哼
//电脑落子
int ComputerMove(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//首先判断电脑下一步能否赢
//判断行
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == 'O'&& ' ' == board[i][2])
{
board[i][2] = 'O';
return 1;
}
if (board[i][1] == board[i][2] && board[i][1] == 'O'&& ' ' == board[i][0])
{
board[i][0] = 'O';
return 1;
}
if (board[i][0] == board[i][2] && board[i][0] == 'O'&& ' ' == board[i][1])
{
board[i][1] = 'O';
return 1;
}
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == 'O'&& ' ' == board[2][i])
{
board[2][i] = 'O';
return 1;
}
if (board[1][i] == board[2][i] && board[1][i] == 'O'&& ' ' == board[0][i])
{
board[0][i] = 'O';
return 0;
}
if (board[0][i] == board[2][i] && board[0][i] == 'O'&& ' ' == board[1][i])
{
board[1][i] = 'O';
return 1;
}
//判断对角线
}
if (board[0][0] == board[1][1] && board[1][1] == 'O'&&' ' == board[2][2])
{
board[2][2] = 'O';
return 1;
}
if (board[0][0] == board[2][2] && board[2][2] == 'O'&&' ' == board[1][1])
{
board[1][1] = 'O';
return 1;
}
if (board[2][2] == board[1][1] && board[1][1] == 'O'&&' ' == board[0][0])
{
board[0][0] = 'O';
return 1;
}
if (board[0][2] == board[2][0] && board[2][0] == 'O'&&' ' == board[1][1])
{
board[1][1] = 'O';
return 1;
}
if (board[0][2] == board[1][1] && board[1][1] == 'O'&&' ' == board[2][0])
{
board[2][0] = 'O';
return 1;
}
if (board[1][1] == board[2][0] && board[2][0] == 'O'&&' ' == board[0][2])
{
board[0][2] = 'O';
return 1;
}
//判断玩家下一步是否赢,是的话,则堵玩家下一步棋路
//判断行
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == 'X'&& ' ' == board[i][2])
{
board[i][2] = 'O';
return 1;
}
if (board[i][1] == board[i][2] && board[i][1] == 'X'&& ' ' == board[i][0])
{
board[i][0] = 'O';
return 1;
}
if (board[i][0] == board[i][2] && board[i][0] == 'X'&& ' ' == board[i][1])
{
board[i][1] = 'O';
return 1;
}
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == 'X'&& ' ' == board[2][i])
{
board[2][i] = 'O';
return 1;
}
if (board[1][i] == board[2][i] && board[1][i] == 'X'&& ' ' == board[0][i])
{
board[0][i] = 'O';
return 0;
}
if (board[0][i] == board[2][i] && board[0][i] == 'X'&& ' ' == board[1][i])
{
board[1][i] = 'O';
return 1;
}
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == 'X'&&' ' == board[2][2])
{
board[2][2] = 'O';
return 1;
}
if (board[0][0] == board[2][2] && board[2][2] == 'X'&&' ' == board[1][1])
{
board[1][1] = 'O';
return 1;
}
if (board[2][2] == board[1][1] && board[1][1] == 'X'&&' ' == board[0][0])
{
board[0][0] = 'O';
return 1;
}
if (board[0][2] == board[2][0] && board[2][0] == 'X'&&' ' == board[1][1])
{
board[1][1] = 'O';
return 1;
}
if (board[0][2] == board[1][1] && board[1][1] == 'X'&&' ' == board[2][0])
{
board[2][0] = 'O';
return 1;
}
if (board[1][1] == board[2][0] && board[2][0] == 'X'&&' ' == board[0][2])
{
board[0][2] = 'O';
return 1;
}
//若上述都未执行,则判断棋盘中间位置是否有落子,是的话,则落子四角之一,否的话,则落子中间位置
if (' ' == board[1][1])
{
board[1][1] = 'O';
return 1;
}
else
{
if (' ' == board[0][0])
{
board[0][0] = 'O';
return 1;
}
if (' ' == board[0][2])
{
board[0][2] = 'O';
return 0;
}
if (' ' == board[2][0])
{
board[2][0] = 'O';
return 1;
}
if (' ' == board[2][2])
{
board[2][2] = 'O';
return 1;
}
}
//若上述语句都未执行,则随机落子
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (' ' == board[x][y])
{
board[x][y] = 'O';
break;
}
}
}
这就是刚才解释的电脑落子函数
如果你实在见玩家可怜可以改为普通模式
//void CompuerMove(char board[ROW][COL], int row, int col)
//{
// while (1)
// {
// int x = rand() % 3;
// int y = rand() % 3;
// if (' ' == board[x][y])
// {
// board[x][y] = 'O';
// break;
// }
// }
//}
/判断棋盘是否满了
int IsFull(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++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//判断输,赢,平局
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
if (1 == IsFull(board, ROW, COL))
{
return 'd';
}
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
return board[i][1];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[1][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2])
{
return board[1][1];
}
return ' ';
}//游戏函数
void game()
{
char board[ROW][COL] = { 0 };
char ret = '0';
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
do
{
printf("玩家走:\n");
PlayMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
if (IsWin(board, ROW, COL) != ' ')
{
break;
}
printf("电脑走:\n");
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
} while (ret == ' ');
if ('d' == IsWin(board, ROW, COL))
{
printf("平局\n");
}
if ('O' == IsWin(board, ROW, COL))
{
printf("电脑赢了!");
}
if ('X' == IsWin(board, ROW, COL))
{
printf("恭喜你!你赢了!\n");
}
}
接下来就是主函数了
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//游戏进入选项
void menu()
{
printf("************************\n");
printf("**** 1.开始游戏 ****\n");
printf("**** 0.退出游戏 ****\n");
printf("************************\n");
}
//主函数
int main()
{
int input = 0;
do
{
srand((unsigned int)time(NULL));
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("游戏退出!\n");
break;
}
default:
{
printf("输入错误,请重新输入!\n");
break;
}
}
} while (input);
system("pause");
return 0;
}
好了,整体代码就是这样,代码有点挫,有待优化,请见谅!!!