目录
游戏目的:
设计一个游戏菜单选择开始游戏,玩家和电脑依次下棋,如果其中一方在行,列或者对角线上连续连成三个,则为赢,如果棋盘下满还没有分出胜负,则为平局。
编写思路:
首先,编写一个选择开始游戏的菜单menu,选择1开始游戏,选择0则退出游戏;且每次游戏结束后可以继续选择开始或者退出。
要实现游戏目的,我们主要需要考虑一下几个方面:
1、存储棋盘数据的数组;
利用数组可以访问棋盘的各个位置,所以我们用二维字符数组arr来存储棋盘数据,并均令其为空字符
2、打印一个棋盘;
提前进行设计,利用循环依次打印成行和成列的分割线
3、玩家、电脑如何实现交替下棋(电脑随机下棋);
玩家下棋很好实现,用*表示玩家下的棋,让玩家输入一个符合条件的坐标,只要棋盘上的这个坐标处是空字符时,就可以下*;电脑下棋是同样的逻辑,只不过要实现随机下棋,和之前的猜数字小游戏一样,利用rand()产生随机数的方法来实现
4、怎样判断输赢
在下棋过程中,一共有以下4种情况
1、玩家赢
2、电脑赢
3、平局
4、继续
每一种情况下分别输出一个不同的字符,最后利用if语句实现判断输赢
代码实现:
以下用game.h文件来实现游戏编写过程中函数的声明;用game.c文件来实现具体函数的定义;用sanziqi.c文件来测试游戏的逻辑
game.h文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void menu();
void Initarr(char arr[ROW][COL],int row,int col);
void print1(char arr[ROW][COL],int row,int col);
void player_move(char arr[ROW][COL],int row,int col);
void computer_move(char arr[ROW][COL],int row,int col);
char is_win(char arr[ROW][COL],int row,int col);
game.c文件
#include "game.h"
void menu()
{
printf("*********************\n");
printf("********1.play*******\n");
printf("********0.exit********\n");
printf("**********************\n");
}
void Initarr(char arr[ROW][COL],int row,int col)
{
int i=0;
int j=0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
arr[i][j]=' ';
}
printf("\n");
}
}
void print1(char arr[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 ",arr[i][j]);
if(j<col)
printf("|");
}
printf("\n");
for(j=0;j<col;j++)
{
if(j<col)
printf("---|");
}
printf("\n");
}
}
//printf(" |");
void player_move(char arr[ROW][COL],int row,int col)
{
int x=0;
int y=0;
printf("玩家:\n");
while(1)
{
printf("请输入坐标:>");
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");
}
}
void computer_move(char arr[ROW][COL],int row,int col)
{
int x=0;
int y=0;
printf("电脑:\n");
while(1)
{
x=rand()%row;//0-2
y=rand()%col;//0-2
if(arr[x][y] == ' ')
{
arr[x][y]='#';//
break;
}
}
}
static int if_full(char arr[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(arr[i][j]==' ')
{
return 0;
}
}
}
return 1;
}
char is_win(char arr[ROW][COL],int row,int col)
{
//行
int i=0;
for(i=0;i<row;i++)
{
if(arr[i][0]==arr[i][1] && arr[i][1]==arr[i][2] && arr[i][1] != ' ')
{
return arr[i][1];//返回哪方的标志,就是哪方赢
}
}
//列
for(i=0;i<row;i++)
{
if(arr[0][i]==arr[1][i] && arr[1][i]==arr[2][i] && arr[1][i] != ' ')
{
return arr[1][i];
}
}
//斜
if(arr[0][0]==arr[1][1] && arr[1][1]==arr[2][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
if(arr[2][0]==arr[1][1] && arr[1][1]==arr[0][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
//如果棋盘下满了,就是平局
if(if_full(arr,row,col) == 1)
{
return 'Q';
}
//如果以上条件都不满足,则继续
return 'C';
}
sanziqi.c
#include<stdio.h>
#include "game.h"
void game()
{
char ret=0;
//存放棋盘数据
char arr[ROW][COL]={0};
//初始化棋盘
Initarr(arr,ROW,COL);
//打印棋盘
print1(arr,ROW,COL);
//开始玩儿游戏
while(1)
{
//玩家下棋
player_move(arr,ROW,COL);
//打印棋盘
print1(arr,ROW,COL);
ret=is_win(arr,ROW,COL);
if(ret !='C')
{
break;
}
//电脑下棋
computer_move(arr,ROW,COL);
//打印棋盘
print1(arr,ROW,COL);
ret=is_win(arr,ROW,COL);
if(ret !='C')
{
break;
}
}
if(ret == '*')
{
printf("玩家赢\n");
}
else if(ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
void test()
{
//用到的变量
int input=0;
int row=0;
int col=0;
int sz=0;
//选择是否玩游戏,1开始,0退出;每次玩完之后都出现这个选择
do{
scanf("%d",&input);
switch(input)
{
case 1:
printf("开始游戏!\n");
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}while(input);
}
int main()
{
//开始游戏菜单
menu();
srand((unsigned int)time(NULL));
test();
return 0;
}