思路:
1.建立三子棋(用数组实现)
2.初始化三子棋(将数组的值设置为空字符)
3.玩家下棋
4.显示当前三子棋盘
5.判断是否赢,棋盘是否满
6.电脑下棋
7.显示当前三子棋盘
8.判断是否赢,棋盘是否满
代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
#include"game.h"
一、主函数
int main()
{
srand((unsigned int)time(NULL));//电脑随机下子时使用
printf("******************\n");
printf("*****1.paly*******\n");
printf("*****0.exit*******\n");
printf("******************\n");
int input=0;//选择开始游戏或是退出
do{
printf("请选择:");
scanf("%d",&input);
switch(input){
case 1:
printf("开始游戏:\n");
game();
printf("-------------\n");//华丽的分割线
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
}while(input);
return 0;
}
二、游戏函数
void game()//游戏函数
{
char ret;
char arr[ROW][COL]={0};
Initborad(arr,ROW,COL);//初始化数组
displaygame(arr,ROW,COL);//展示三子棋面板
while(1){
playermove(arr,ROW,COL);//玩家下棋
displaygame(arr,ROW,COL);//展示三子棋面板
ret=Iswin(arr,ROW,COL);//判断是否输赢
if(ret=='*'){
printf("玩家赢!\n");
break;
}
printf("\n");
computermove(arr,ROW,COL);//电脑下棋
displaygame(arr,ROW,COL); //展示三子棋面板
ret=Iswin(arr,ROW,COL);//判断是否输赢
if(ret=='#'){
printf("电脑赢!\n");
break;
}
if(ret=='p'){
printf("平局!");
break;
}
}
}
三、初始化
void Initborad(char arr[ROW][COL],int row,int col)//初始化数组(三子棋)
{
int i=0,j=0;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
arr[i][j]=' ';
}
}
}
四、展示棋盘
void displaygame(char arr[ROW][COL],int row,int col)//展示三子棋面板
{
int i=0,j=0;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
printf(" %c ",arr[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
if(i<row-1)
printf("---|---|---\n");
}
}
五、玩家下棋
void playermove(char arr[ROW][COL],int row,int col)//玩家下棋
{
printf("玩家移动:\n");
int x=0,y=0;
while(1){
scanf("%d%d",&x,&y);
if(x>=1&&x<=ROW&&y>=1&&y<=COL){
if(arr[x-1][y-1]==' '){
arr[x-1][y-1]='*';
break;
}
else{
printf("坐标被占用!请重新输入:\n");
}
}
else{
printf("输入的坐标非法!请重新输入:\n");
}
if(isfull(arr,ROW,COL))break;
}
}
六、电脑下棋
void computermove(char arr[ROW][COL],int row,int col)//电脑下棋
{
int x=0,y=0;
printf("电脑移动:\n");
while(1){
x=rand()%row;
y=rand()%col;
if(arr[x][y]==' '){
arr[x][y]='#';
break;
}
七、判断输赢
char Iswin(char arr[ROW][COL],int row,int col)//判断是否输赢
{
//玩家赢*,电脑赢#,平局p,继续下棋x
char ret='0';
int i=0,j=0;
//行相等
for(i=0;i<row;i++){
if(arr[i][0]==arr[i][1]&&arr[i][1]==arr[i][2]&&arr[i][2]!=' '){
return arr[i][0];
}
}
//列相等
for(j=0;j<col;j++){
if(arr[0][j]==arr[1][j]&&arr[1][j]==arr[2][j]&&arr[2][j]!=' '){
return arr[0][j];
}
}
//对角线
if(arr[0][0]==arr[1][1]&&arr[1][1]==arr[2][2]&&arr[2][2]!=' '){
return arr[0][0];
}
if(arr[0][2]==arr[1][1]&&arr[1][1]==arr[2][0]&&arr[1][1]!=' '){
return arr[1][1];
}
//平局
if(isfull(arr,ROW,COL)){
return 'p';
}
//继续
return 'x';
}
八、判断棋盘是否满
int isfull(char arr[ROW][COL],int row,int col)//判断三子棋是否下满
{
int i=0,j=0;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
if(arr[i][j]==' '){
return 0;
}
}
}
return 1;
}