三字棋 是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。
思路:
- 1.初始化棋盘
- 2.打印棋盘
- 3.电脑走
- 4.判断输赢
- 5.玩家走
- 6.判断输赢(若棋盘未满且输赢未果,循环3、4、5、6步骤;直到判断出输赢:电脑赢/玩家赢/平局)
代码:
头文件件程序(函数声明):
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __SANZIQI_H__
#define __SANZIQI_H__
#define ROW 3
#define COL 3
//初始化
void InitBorad(char arr[ROW][COL], int row, int col);
//显示棋盘
void Display(char arr[ROW][COL], int row, int col);
//电脑走
void Computer(char arr[ROW][COL], int row, int col);
//人走
void Player(char arr[ROW][COL], int row, int col);
//判断是否还有空格
int Check_full(char arr[ROW][COL], int row, int col);
//判断输赢
char Is_Win(char arr[ROW][COL], int row, int col);
#endif
子程序执行(函数定义):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "三字棋.h"
//初始化
void InitBorad(char arr[ROW][COL], int row, int col)
{
int i;
int j;
for (i = 0; i < row;i++)
for (j = 0; j < col; j++)
arr[i][j] = ' ';
}
//显示棋盘
void Display(char arr[ROW][COL], int row, int col)
{
int i;
int j;
printf("----------\n");
for (i = 0; i < row; i++)
{
printf("|");
for (j = 0; j < col; j++)
{
printf("%2c|", arr[i][j]);
}
printf("\n----------\n");
}
}
//电脑走
void Computer(char arr[ROW][COL], int row, int col)
{
srand((unsigned int)time(NULL)); //产生随机数
while (1)
{
int x = rand() % 3; //产生一个小于3的数
int y = rand() % 3;
if (arr[x][y] == ' ') //判断这个元素是否为空
{
arr[x][y] = 'X';
break;
}
}
}
//人走
void Player(char arr[ROW][COL], int row, int col)
{
int x;
int y;
while (1)
{
printf("请输入坐标:");
assert(2 == scanf("%d%d", &x, &y));
x--;
y--;
if ((0 <= x && x <= row - 1) && (0 <= y && y <= col - 1)) //玩家输入的坐标要在棋盘范围内
{
if (arr[x][y] == ' ')
{
arr[x][y] = 'O';
break;
}
else
{
printf("你输入的下标被占,请重新输入!\n");
}
}
else
{
printf("越界了,请重新输入!\n");
}
}
}
//判断是否还有空格
int Check_full(char arr[ROW][COL], int row, int col)
{
int i;
int j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ') //判断数组中有没有空格,如果出现一次空格,就已经可以证明数组没满
return 0;
}
}
return 1;
}
//判断输赢
char Is_Win(char arr[ROW][COL], int row, int col)
{
int i;
if (Check_full(arr, ROW, COL) == 1) //棋盘满了没有空格,平局
return 'Q';
for (i = 0; i < row; i++)//某一行连3
{
if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2])
return arr[i][1];
}
for (i = 0; i < col; i++) //某一列连3
{
if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i])
return arr[1][i];
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]) //右对角线\连3
return arr[1][1];
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0]) //左对角线/连3
return arr[1][1];
return ' '; //如果没有判断出谁赢并且棋盘还没满,则继续进行游戏
}
主函数(main):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include "三字棋.h"
void menu()
{
printf("**************************************\n");
printf("*************** 1.play ***************\n");
printf("*************** 0.exit ***************\n");
printf("**************************************\n");
}
void game()
{
char arr[ROW][COL];
InitBorad(arr,ROW,COL);//初始化棋盘
//Display(arr, ROW, COL);
do{
Computer(arr, ROW, COL); //电脑先走
Display(arr, ROW, COL); //打印棋盘
if (Is_Win(arr, ROW, COL) != ' ') //如果棋盘不为空的话,即判断出谁赢或平局,就跳出循环
{
break;
}
Player(arr, ROW, COL); //玩家走
Display(arr, ROW, COL); //打印棋盘
if (Is_Win(arr, ROW, COL) != ' ') //如果棋盘不为空的话,即判断出谁赢或平局,就跳出循环
{
break;
}
} while (Is_Win(arr, ROW, COL) == ' '); //如果棋盘没有满,同时也没有判断出输赢的话,继续执行循环,否则跳出循环
if (Is_Win(arr, ROW, COL) == 'O')
printf("玩家赢\n");
else if (Is_Win(arr, ROW, COL) == 'X')
printf("电脑赢\n");
else if (Is_Win(arr, ROW, COL) == 'Q')
printf("平局\n");
}
int main()
{
int choose = 0;
do{
menu();
printf("请选择>");
assert(1 == scanf("%d", &choose)); //断言防止误操作。
switch (choose)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,重新输入!\n");
}
} while (choose);
system("pause");
return 0;
}
拓展:五子棋
思路与三字棋程序差不多。只不过在写输赢判断时,不能简单的认为直接另0-5几个元素相等判断。
头文件(函数定义):
#ifndef __WUZIQI_H__
#define __WUZIQI_H__
#define ROW 10
#define COL 10
//初始化
void Initboard(char arr[ROW][COL], int row, int col);
//打印棋盘
void Display(char arr[ROW][COL], int row, int col);
//电脑下
void Computer(char arr[ROW][COL]);
//玩家下
void Player(char arr[ROW][COL], int row, int col);
//判断输赢
char Is_Win(char arr[ROW][COL], int row, int col);
#endif
子程序(函数定义):
#define _CRT_SECURE_NO_WARNINGS 1
#include "五子棋.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
//初始化
void Initboard(char arr[ROW][COL],int row,int col)
{
int i;
int j;
for (i = 0; i < row;i++)
for (j = 0; j < col; j++)
arr[i][j] = ' ';
}
//打印棋盘
void Display(char arr[ROW][COL],int row,int col)
{
int i;
int j;
printf(" ");
for (i = 1; i <= row; i++)
printf(" %2d", i);
printf("\n");
for (i = 0; i < 3 * (row+1);i++)
printf("-");
printf("\n");
for (i = 0; i < row; i++)
{
printf("%2d | ",i+1);
for (j = 0; j < col ; j++)
{
printf("%c| ", arr[i][j]);
}
printf("\n");
for (j = 0; j < 3 * (row+1); j++)
printf("-");
printf("\n");
}
}
//电脑下
void Computer(char arr[ROW][COL])
{
srand((unsigned int)time(NULL));
while (1)
{
int x = rand() % 10;
int y = rand() % 10;
if (arr[x][y] == ' ')
{
arr[x][y] = 'X';
break;
}
}
}
//玩家下
void Player(char arr[ROW][COL], int row, int col)
{
int x;
int y;
while (1)
{
printf("请输入坐标(x,y):");
assert(2==scanf("%d%d", &x, &y)); //对输入值参数检验,如果误操作,输入的不是数字,而是字符或其他符号,不会导致程序出现问题
x--;
y--;
if ((0 <= x && x <= row - 1) && (0 <= y && y <= col - 1))
{
if (arr[x][y] == ' ')
{
arr[x][y] = 'O';
break;
}
else
printf("你输入的下标被占,请重新输入!\n");
}
else
printf("越界了,请重新输入!\n");
}
}
//检查是否满
int Check_full(char arr[ROW][COL], int row, int col)
{
int i;
int j;
for (i = 0; i < row;i++)
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 0;
}
return 1;
}
//判断输赢
char Is_Win(char arr[ROW][COL], int row, int col)
{
int i;
int j;
if (Check_full(arr, ROW, COL) == 1)
return 'Q';
for (i = 0; i < row; i++)//一行连5
{
for (j = 0; j < col - 4; j++)
{
if (arr[i][j] == arr[i][j + 1] && arr[i][j + 1] == arr[i][j + 2] && arr[i][j + 2] == arr[i][j + 3]
&& arr[i][j + 3] == arr[i][j + 4] && arr[i][j] == 'O')
return 'O';
else if (arr[i][j] == arr[i][j + 1] && arr[i][j + 1] == arr[i][j + 2] && arr[i][j + 2] == arr[i][j + 3]
&& arr[i][j + 3] == arr[i][j + 4] && arr[i][j] == 'X')
return 'X';
}
}
for (j = 0; j < col; j++)//一列连5
{
for (i = 0; i < row - 4; i++)
{
if (arr[i][j] == arr[i + 1][j] && arr[i + 1][j] == arr[i + 2][j] && arr[i + 2][j] == arr[i + 3][j]
&& arr[i + 3][j] == arr[i + 4][j] && arr[i][j] == 'O')
return 'O';
else if (arr[i][j] == arr[i + 1][j] && arr[i + 1][j] == arr[i + 2][j] && arr[i + 2][j] == arr[i + 3][j]
&& arr[i + 3][j] == arr[i + 4][j] && arr[i][j] == 'X')
return 'X';
}
}
for (i = 0; i < row - 4; i++)//右对角线\连5
{
for (j = 0; j < col - 4; j++)
{
if (arr[i][j] == arr[i + 1][j + 1] && arr[i + 1][j + 1] == arr[i + 2][j + 2] && arr[i + 2][j + 2] == arr[i + 3][j + 3] &&
arr[i + 3][j + 3] == arr[i + 4][j + 4] && arr[i][j]=='O')
return 'O';
else if (arr[i][j] == arr[i + 1][j + 1] && arr[i + 1][j + 1] == arr[i + 2][j + 2] && arr[i + 2][j + 2] == arr[i + 3][j + 3] &&
arr[i + 3][j + 3] == arr[i + 4][j + 4] && arr[i][j] == 'X')
return 'X';
}
}
for (i = row; i > 4; i--)//左对角线/连5
{
for (j = 0; j < col - 4; j++)
{
if (arr[i][j] == arr[i - 1][j + 1] && arr[i - 1][j + 1] == arr[i - 2][j + 2] && arr[i - 2][j + 2] == arr[i - 3][j + 3] &&
arr[i - 3][j + 3] == arr[i - 4][j + 4] && arr[i][j]=='O')
return 'O';
else if (arr[i][j] == arr[i - 1][j + 1] && arr[i - 1][j + 1] == arr[i - 2][j + 2] && arr[i - 2][j + 2] == arr[i - 3][j + 3] &&
arr[i - 3][j + 3] == arr[i - 4][j + 4] && arr[i][j]=='X')
return 'X';
}
}
return ' ';
}
主函数(main):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "五子棋.h"
void menu()
{
printf("*******************************\n");
printf("************ 1.play ***********\n");
printf("************ 2.exit ***********\n");
printf("*******************************\n");
}
void game()
{
char arr[ROW][COL];
Initboard(arr, ROW, COL);
do{
Computer(arr);
Display(arr, ROW, COL);
if (Is_Win(arr, ROW, COL) != ' ')
break;
Player(arr, ROW, COL);
Display(arr, ROW, COL);
if (Is_Win(arr, ROW, COL) != ' ')
break;
} while (Is_Win(arr, ROW, COL) == ' ');
if (Is_Win(arr, ROW, COL) == 'O')
printf("玩家赢\n");
else if (Is_Win(arr, ROW, COL) == 'X')
printf("电脑赢\n");
else if (Is_Win(arr, ROW, COL) == 'Q')
printf("平局\n");
}
int main()
{
int choose;
do{
menu();
printf("请选择> ");
while (scanf("%d", &choose) != 1)//对输入值参数检验,如果误操作,输入的不是数字,而是字符或其他符号,不会导致程序出现问题
getchar();
//l另一种:assert(1 == scanf("%d", &choose));
switch (choose)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}while (choose);
system("pause");
return 0;
}