三子棋就是我们所说的" 一条龙",如图:
只要横、纵、斜三个方向中的任意一个方向满足三个棋相同,则游戏结束。
实现思路:
1)打印菜单;
2)选择是玩家先走还是电脑先走;
3)开是游戏:
i)初始化键盘;
ii)打印键盘;
iii)玩家走,电脑走
iV)是否满盘;
Vi)判输赢;
4)测试
代码分析:
打印菜单:
void menu(){
printf("**********************************\n");
printf("****** 欢迎踏上三子棋之旅!******\n");
printf("*******1.play 0.exit *********\n");
printf("**********************************\n");
}
游戏:
void game()
{
char board[ROW][COL] = { 0 };
char ret = '0';
int input = 0;
printf("1.电脑先走 2.玩家先走\n");
printf("请选择谁先走:>");
scanf("%d", &input);
InitBoard(board, ROW, COL);
switch (input)
{
case 1:
while (1)
{
ComputerMove(board, ROW, COL);
ret = Is_Win(board, ROW, COL);
if (ret != ' ')
{
break;
}
DisplayBoard(board, ROW, COL);
PlayerMove(board, ROW, COL);
ret = Is_Win(board, ROW, COL);
if (ret != ' ')
{
break;
}
DisplayBoard(board, ROW, COL);
}
break;
case 2:
while (1)
{
PlayerMove(board, ROW, COL);
ret = Is_Win(board, ROW, COL);
if (ret != ' ')
{
break;
}
DisplayBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);
ret = Is_Win(board, ROW, COL);
if (ret != ' ')
{
break;
}
DisplayBoard(board, ROW, COL);
}
break;
default:
break;
}
if (ret == ' ')
{
printf("平局\n");
DisplayBoard(board, ROW, COL);
}
else if (ret == 'x')
{
printf("玩家赢!!!\n");
DisplayBoard(board, ROW, COL);
}
else if (ret == '*')
{
printf("电脑赢!!!\n");
DisplayBoard(board, ROW, COL);
}
}
3.游戏的具体代码:
(1)初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col){
int i = 0;
int j = 0;
memset(board, ' ', row*col*sizeof(board[0][0]));
}
(2)打印棋盘
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]);
}
printf("\n");
for (j = 0; j < col; j++){
printf("---|");
}
printf("\n");
}
}
(3)玩家走
void PlayerMove(char board[ROW][COL], int row, int col){
int x = 0;
int y = 0;
printf("玩家走,请输入坐标:> \n");
while (1){
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] = 'x';
break;
}
else{
printf("此处已走过,请重新走!\n");
}
}
else{
printf("输入错误,请重新输入:\n");
}
}
}
(4)电脑走
void ComputerMove(char board[ROW][COL], int row, int col){
int x = 0;
int y = 0;
printf("电脑走:>\n");
while (1){
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' '){
board[x][y] = '*';
break;
}
}
}
(5)看是否满盘
static int Is_Full(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; //表示满盘
}
(5)判断输赢,在横、纵、斜三个方向上都要讨论
char Is_Win(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] == board[i][j + 1] && //横向赢了
board[i][j + 1] == board[i][j + 2] &&
board[i][j] != ' ') ||
(board[i][j] == board[i][j - 1] &&
board[i][j - 1] == board[i][j + 1] &&
board[i][j] != ' ') ||
board[i][j] == board[i][j - 1] &&
board[i][j - 1] == board[i][j - 2] &&
board[i][j] != ' '){
return board[i][j];
}
if ((board[i][j] == board[i + 1][j] && //纵向赢了
board[i + 1][j] == board[i + 2][j] &&
board[i][j] != ' ') ||
(board[i][j] == board[i - 1][j] &&
board[i - 1][j] == board[i + 1][j] &&
board[i][j] != ' ') ||
board[i][j] == board[i - 1][j] &&
board[i - 1][j] == board[i - 2][j] &&
board[i][j] != ' '){
return board[i][j];
}
if ((board[i][j] == board[i - 1][j + 1] && //斜向赢了
board[i - 1][j + 1] == board[i + 1][j - 1] &&
board[i][j] != ' ') ||
(board[i][j] == board[i + 1][j - 1] &&
board[i + 1][j - 1] == board[i + 2][j - 2] &&
board[i][j] != ' ') ||
board[i][j] == board[i - 1][j + 1] &&
board[i - 1][j + 1] == board[i + 1][j - 1] &&
board[i][j] != ' '){
return board[i][j];
}
if ((board[i][j] == board[i + 1][j + 1] &&
board[i + 1][j + 1] == board[i + 2][j + 2] &&
board[i][j] != ' ') ||
(board[i][j] == board[i - 1][j - 1] &&
board[i - 1][j - 1] == board[i + 1][j + 1] &&
board[i][j] != ' ') ||
board[i][j] == board[i - 1][j - 1] &&
board[i - 1][j - 1] == board[i - 2][j - 2] &&
board[i][j] != ' '){
return board[i][j];
}
}
}
if (Is_Full(board, row, col)){
printf("平局!!!");
return 0;
}
return ' ';
}
以下为完整的源代码:
game.h 主要用来编写函数的声明:
#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <windows.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 Is_Win(char board[ROW][COL], int row, int col);
#endif //__GAME_H__
game.c 编写具体函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col){
int i = 0;
int j = 0;
memset(board, ' ', row*col*sizeof(board[0][0]));
}
//展示棋盘
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]);
}
printf("\n");
for (j = 0; j < col; j++){
printf("---|");
}
printf("\n");
}
}
//玩家走
void PlayerMove(char board[ROW][COL], int row, int col){
int x = 0;
int y = 0;
printf("玩家走,请输入坐标:> \n");
while (1){
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] = 'x';
break;
}
else{
printf("此处已走过,请重新走!\n");
}
}
else{
printf("输入错误,请重新输入:\n");
}
}
}
//电脑走
void ComputerMove(char board[ROW][COL], int row, int col){
int x = 0;
int y = 0;
printf("电脑走:>\n");
while (1){
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' '){
board[x][y] = '*';
break;
}
}
}
//判断是否满盘
static int Is_Full(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 Is_Win(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] == board[i][j + 1] && //横向赢了
board[i][j + 1] == board[i][j + 2] &&
board[i][j] != ' ') ||
(board[i][j] == board[i][j - 1] &&
board[i][j - 1] == board[i][j + 1] &&
board[i][j] != ' ') ||
board[i][j] == board[i][j - 1] &&
board[i][j - 1] == board[i][j - 2] &&
board[i][j] != ' '){
return board[i][j];
}
if ((board[i][j] == board[i + 1][j] && //纵向赢了
board[i + 1][j] == board[i + 2][j] &&
board[i][j] != ' ') ||
(board[i][j] == board[i - 1][j] &&
board[i - 1][j] == board[i + 1][j] &&
board[i][j] != ' ') ||
board[i][j] == board[i - 1][j] &&
board[i - 1][j] == board[i - 2][j] &&
board[i][j] != ' '){
return board[i][j];
}
if ((board[i][j] == board[i - 1][j + 1] && //斜向赢了
board[i - 1][j + 1] == board[i + 1][j - 1] &&
board[i][j] != ' ') ||
(board[i][j] == board[i + 1][j - 1] &&
board[i + 1][j - 1] == board[i + 2][j - 2] &&
board[i][j] != ' ') ||
board[i][j] == board[i - 1][j + 1] &&
board[i - 1][j + 1] == board[i + 1][j - 1] &&
board[i][j] != ' '){
return board[i][j];
}
if ((board[i][j] == board[i + 1][j + 1] &&
board[i + 1][j + 1] == board[i + 2][j + 2] &&
board[i][j] != ' ') ||
(board[i][j] == board[i - 1][j - 1] &&
board[i - 1][j - 1] == board[i + 1][j + 1] &&
board[i][j] != ' ') ||
board[i][j] == board[i - 1][j - 1] &&
board[i - 1][j - 1] == board[i - 2][j - 2] &&
board[i][j] != ' '){
return board[i][j];
}
}
}
if (Is_Full(board, row, col)){
printf("平局!!!");
return 0;
}
return ' ';
}
test.c 存放主函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//打印菜单
void menu(){
printf("**********************************\n");
printf("****** 欢迎踏上三子棋之旅!******\n");
printf("*******1.play 0.exit *********\n");
printf("**********************************\n");
}
void game()
{
char board[ROW][COL] = { 0 };
char ret = '0';
int input = 0;
printf("1.电脑先走 2.玩家先走\n");
printf("请选择谁先走:>");
scanf("%d", &input);
InitBoard(board, ROW, COL);
switch (input)
{
case 1:
while (1)
{
ComputerMove(board, ROW, COL);
ret = Is_Win(board, ROW, COL);
if (ret != ' ')
{
break;
}
DisplayBoard(board, ROW, COL);
PlayerMove(board, ROW, COL);
ret = Is_Win(board, ROW, COL);
if (ret != ' ')
{
break;
}
DisplayBoard(board, ROW, COL);
}
break;
case 2:
while (1)
{
PlayerMove(board, ROW, COL);
ret = Is_Win(board, ROW, COL);
if (ret != ' ')
{
break;
}
DisplayBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);
ret = Is_Win(board, ROW, COL);
if (ret != ' ')
{
break;
}
DisplayBoard(board, ROW, COL);
}
break;
default:
break;
}
if (ret == ' ')
{
printf("平局\n");
DisplayBoard(board, ROW, COL);
}
else if (ret == 'x')
{
printf("玩家赢!!!\n");
DisplayBoard(board, ROW, COL);
}
else if (ret == '*')
{
printf("电脑赢!!!\n");
DisplayBoard(board, ROW, COL);
}
}
void test(){
int input = 0;
srand((unsigned int)time(NULL));
do{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input){
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
} while (input);
}
int main()
{
test();
system("pause");
return 0;
}
截图: