c语言简单三子棋

c语言采用多文件方式实现简单三子棋游戏 如下:
1.规则介绍:同行,同列,两个对角线实现三点连成一线。
这个代码可以实现简单的三子棋单机游戏,如有更好的idea,可以互相交流!
2.程序思路:打印菜单----->初始化并打印棋盘----->确定who first----->电脑或者人走棋------>判断是否三点连成一线,确定是否继续走棋------>如果不继续走棋则说明已有结果 即,谁赢谁输or平局
3.优化:采用硬币模型确定谁先走,实现清屏操作。
4.拓展:五子棋
5.函数接口设计时声明放在game.h
函数实现放在game.c
main.c实现游戏的主逻辑

main.c代码块如下:

#include "game.h"
void Menu()
{
 printf("###################################\n");
 printf("###     欢迎来到我的游戏厅      ###\n");
 printf("###################################\n");
 printf("###1.Play         2.Exit        ###\n");
 printf("###################################\n");
 printf("请选择:> ");
}

int main()
{
 int quit = 0;
 while (!quit){
  Menu();
  int select = 0;
  scanf("%d", &select);
  switch (select){
  case 1:
   Game();
   break;
  case 2:
   quit = 1;   //退出
   break;
  default:
   printf("你输错了,请重新输入!\n");
   break;
  }
 }
 printf("ByeBye!\n");   //case:2
 system("pause");
}

game.h代码块如下:

#ifndef _GAME_H_
#define _GAME_H_

#include <stdio.h>
#include <time.h>
#include <windows.h>

#pragma warning(disable:4996)

#define ROW 3
#define COL 3
#define P_COLOR 'X'
#define C_COLOR 'o'
#define INIT ' '
void Game();  //编写的第一个接口Game的声明
void InitBoard(char board[][COL], int row, int col);
void ShowBoard(char board[][COL], int row, int col);
void ComputerMove(char board[][COL], int row, int col);
char Judge(char board[][COL], int row, int col);

#endif

game.c代码块如下
1.

#include"game.h"

2.对棋盘进行初始化:


void InitBoard(char board[][COL], int row, int col)
{
 int i = 0;
 for (; i < row; i++) {
  int j = 0;
  for (; j < col; j++) {
   board[i][j] = INIT;
  }
 }
}

3.打印棋盘:当时我调试的时候展示的三子棋盘不规整,经过反复试,最后终于打印好啦。

void ShowBoard(char board[][COL], int row, int col)
{
 printf("   1  | 2 | 3 \n");
 printf("---------------\n");
 int i = 0;
 for (; i < row; i++){
  printf("%d |", i+1);
  int j = 0;
  for (; j < col; j++) {
   printf("%c  |", board[i][j]);
  }
  printf("\n");
  printf("---------------\n");
 }
}

4.电脑走棋:
用到了while死循环。
Sleep(1000)是为了给电脑思考时间
其中电脑走棋采用随机数生成:int x = rand() % row;
还可以写一个循环来让电脑更聪明,这里我没有敲。

void ComputerMove(char board[][COL], int row, int col)
{
 while (1) {
  Sleep(1000);
  int x = rand() % row;
  int y = rand() % col;
  if (board[x][y] == ' ') {
   board[x][y] = C_COLOR;
   break;
  }
 }
}

5.判断行,列,以及两个对角线

char Judge(char board[][COL], int row, int col)
{
 int i = 0;
 for (; i < row; i++) {
  if (board[i][0] == board[i][1] && \
   board[i][1] == board[i][2] && \
   board[i][0] != ' '){
   return board[i][0];
  }
 }
 for (i = 0; i < col; i++) {
  if (board[0][i] == board[1][i] && \
   board[1][i] == board[2][i] && \
   board[0][i] != ' ') {
   return board[i][0];
  }
 }
 if (board[0][0] == board[1][1] && \
  board[1][1] != ' ' && \
  board[1][1] == board[2][2]) {
  return board[1][1];
 }
 if (board[0][2] == board[1][1] && \
  board[1][1] != ' ' && \
  board[1][1] == board[2][0]) {
  return board[1][1];
 }
 for (i = 0; i < row; i++) {
  int j = 0;
  for (; j < col; j++) {
   if (board[i][j] == INIT) {
    return 'N';
   }
  }
 }
 return 'F';
}

6.Guess函数是为了判断第一次是电脑还是人先走,采用抛硬币模型。是代码中的亮点。
注意:如果return 1,则转向7.中的case 1
如果return 0,则转向7.中的case 0

int Guess()
{
 int result = 0;
 result = rand() % 2;
 int g = 0;
 printf("硬币已抛,猜正反面<0:正, 1:反面>: ");
 scanf("%d", &g);
 if (result == g){
  printf("你猜对了,你先走\n");
  return 1;
 }
 printf("你猜错了了,电脑先走\n");
 return 0;
}


7.游戏执行

void Game() 
{
 srand((unsigned long)time(NULL));      //在玩游戏之前就生成随机数种子
 char board[ROW][COL];
 InitBoard(board, ROW, COL);     //让棋盘内容变空
 char result = 0;
 int who = Guess();
 int x = 0;
 int y = 0;
 do{
  system("cls");  //清屏操作
  ShowBoard(board, ROW, COL);
  switch (who){
  case 1:
   printf("请落子:> ");
   scanf("%d %d", &x, &y);
   if (x <= 0 || x > 3 || y <= 0 || y > 3){
    printf("你输入的位置有误,请重新输入!\n");
    continue;
   }
   if (board[x - 1][y - 1] != ' '){
    printf("该位置已被占用,请重新输入!\n");
    continue;
   }
   board[x - 1][y - 1] = P_COLOR;        //走到这表明数据未越界,且未被占用,开始输入数据
   who = 0;
   printf("你已经走完了,电脑正在思考\n");
   break;
  case 0:
   ComputerMove(board, ROW, COL);   //电脑走棋
   ShowBoard(board, ROW, COL);
   who = 1;
   printf("电脑已经走完了,请你思考\n");
   break;
  default:
   break;
  }
  result = Judge(board, ROW, COL);
  if (result != 'N'){//'N'--->next  'F'--->FULL  'X'  'O'
   break;
  }
 } while (1);
 //判断谁赢谁输
 if (result == P_COLOR) {
  printf("恭喜你,你赢了!\n");
 }
 else if (result == C_COLOR) {
  printf("不好意思,你输了!\n");
 }
 else {
  printf("还不错,平手!\n");
 }
 printf("你玩的还不错,要不要再来一把!\n");
}

调试结果:
如图为平局的情况(电脑赢和人赢同理)在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值