程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一個簡單的三子棋游戲(c語言實現)

一個簡單的三子棋游戲(c語言實現)

編輯:關於C語言

一個簡單的三子棋游戲(c語言實現)


題目是:在一個3*3大小的矩陣中下棋一方有連續三個子便獲勝 代碼如下:  
#include<stdio.h>
#include<stdlib.h>
#include<time.h> 
  
         
char arr[3][3] = { 0 };            //直接定義外部變量所有的函數可以直接使用    因為考慮到棋盤大小是固定的
int size = 9;                   //棋盤大小固定  每下一個子都會使可以下子的容量-1
void chessboard()                                    //打印棋盤
{
 int i = 0, j = 0;
 printf("   |   |   \n");
 for (i = 0; i < 3; i++)
 {
  printf("_%c_|_%c_|_%c_\n", arr[i][0], arr[i][1], arr[i][2]);   //棋盤對應位置下棋
  if (i < 2)
   printf("   |   |   \n");
 }
}
void player()                                       //玩家下棋
{
 int m = 0, n = 0;
 printf("player(@):");              //輸入的是對應的坐標    
 scanf_s("%d%d", &m, &n);          //玩家輸入的坐標必須在范圍內並且不能是被下過的地方
 if (m<1 || m>3 || n<1 || n>3 || arr[m - 1][n - 1] != ' ')
 {
  printf("this place can not play!\n");    //如果不符合要求則繼續調用這個函數
  player();
 }
 else
 {
  arr[m - 1][n - 1] = '@';   //將棋子放入相應的內容 棋盤容量-1
  size--;
 }
}

void computer()                                     //電腦下棋
{
 printf("computer(#):\n");      
  int m = 0, n = 0;
  srand(time(NULL));          //電腦的坐標是隨機產生的   以時間為種子
  m = rand() % 3;            //對3取余產生0-2的隨機數賦給數組下標
  n = rand() % 3;
  while (arr[m][n] != ' ')     //如果產生的坐標不符合要求則循環產生      (效率比較低)
  {
   m = rand() % 3;
   n = rand() % 3;
  }
  arr[m][n] = '#';               //操作後容量-1
  size--;            
}

int winner()                                        //判斷獲勝者
{                            //雖然代碼多但是效率高  本來想采用函數比較考慮到效率太低就放棄了
 if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '@') ||
  (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '@') ||
  (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '@') ||
  (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '@') ||
  (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '@') ||
  (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '@') ||
  (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '@') ||
  (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '@'))
  return 1;                        //玩家獲勝
 else if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '#') ||
  (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '#') ||
  (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '#') ||
  (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '#') ||
  (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '#') ||
  (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '#') ||
  (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '#') ||
  (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '#'))
  return 0;                     //電腦獲勝
 else if (size == 0)
  return -1;                     //平局
 else
  return 2;           //只是為了消除編譯的警告並無實際意義
}

int main()
{
 int i = 0, j = 0;    //將數組初始化為空格
 for (i = 0; i < 3; i++)
 {
  for (j = 0; j < 3; j++)
  {
   arr[i][j] = ' ';
  }
 }
 while (1)        //循環對弈直到一方獲勝或者平局
 {
  chessboard();          //循環每次開始都打印棋盤
  if (winner() == -1 || winner() == 0 || winner() == 1)   
  {
   break;
  }
  player();        //每下一個子後都打印棋盤 然後就判斷又沒有人獲勝
  chessboard();
  if (winner() == -1 || winner() == 0 || winner() == 1)
  {
   break;
  }
  computer(); 
 }
 if (winner() == 1)
 {
  printf("player win!\n");
 }
 else if (winner() == 0)
 {
  printf("computer win!\n");
 }
 else
 {
  printf("no one win!\n");
 }
 system("pause");
 return 0;
}

 

   當然這個程序還有很多改進的地方,這個只是一個簡單的雛形。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved