欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單井字棋游戲

 更新時(shí)間:2021年04月28日 09:30:23   作者:冰凌呀  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單井字棋游戲的具體代碼,供大家參考,具體內(nèi)容如下

游戲截圖

源代碼

person.h

//玩家對(duì)戰(zhàn) 
void person()
{
 int i,j;
 initMap(map);
 //打印棋局 
 displayMap(map);
 //未分出勝負(fù)且棋局未落滿子前無(wú)限循環(huán) 
 while(1)
 {
  //獲取玩家下子位置 
  getXY(&i,&j);
  //玩家落子
  setPiece(map,i,j);
  //清屏 
  system("cls");
  //打印棋局 
  displayMap(map);
  //玩家落子后判斷是否已經(jīng)分出勝負(fù)
  if(isWin(map)==1)
  {
   //輸出獲勝方 
   displayWinner();
   break;
  }
  //是否棋局已滿 
  else if(count==row*col)
  {
   printf("平局!\n");
   break; 
  } 
  //交替到對(duì)手回合
  exchangeTurn(); 
 }
}

computer.h

//局面價(jià)值 
int getSum(char map[][col])
{
 int sumO=0,sumX=0;
 int i,j;
 for(i=0;i<row;i++)
 {
  for(j=0;j<col;j++)
  {
   if(map[i][j]=='O')
   {
    sumO+=score[i][j];
   }
   else if(map[i][j]=='X')
   {
    sumX+=score[i][j];
   }
  }
 }
 return sumX-sumO;
}

//思考
void think(char map[][col])
{
 int canWin=0;
 int i,j;
 int x=-1,y=-1;
 int sum;
 int maxSum=-20;
 count++;
 for(i=0;i<row;i++)
 {
  for(j=0;j<col;j++)
  {
   if(map[i][j]==m)
   {
    map[i][j]='X';
    
    //能獲勝,直接落子此處 
    if(isWin(map))
    {
     return;
    }
    //不能獲勝,落子在分?jǐn)?shù)最多的地方 
    else
    {
     map[i][j]='O';
     if(isWin(map))
     {
      map[i][j]='X';
      return;
     }
     map[i][j]='X';
     sum=getSum(map);
     if(sum>maxSum)
     {
      maxSum=sum;
      x=i;
      y=j;
     }
    }
    
    map[i][j]=m; 
   } 
  }
 }
 map[x][y]='X'; 
}

void computer()
{
 int i,j;
 char computerType='X';
 initMap(map);
 //打印棋局 
 displayMap(map);
 //未分出勝負(fù)且棋局未落滿子前無(wú)限循環(huán) 
 while(1)
 {
  //電腦落子 
  if(nowType==computerType)
  {
   printf("電腦落子:");
   think(map);
  }
  //玩家落子 
  else
  {
   //獲取玩家下子位置 
   getXY(&i,&j);
   //玩家落子
   setPiece(map,i,j);
  }
 
  //清屏 
  system("cls");
  //打印棋局 
  displayMap(map);
  //玩家落子后判斷是否已經(jīng)分出勝負(fù)
  if(isWin(map)==1)
  {
   //輸出獲勝方 
   displayWinner();
   break;
  }
  //是否棋局已滿 
  else if(count==row*col)
  {
   printf("平局!\n");
   break; 
  } 
  //交替到對(duì)手回合
  exchangeTurn(); 
 }
}

main.c

#include<stdio.h>
#include<stdlib.h>

//棋局
char map[3][3];
//行列
int row=3,col=3;
//棋子類(lèi)型
char o='O',x='X',m=' ';
//當(dāng)前棋子類(lèi)型
char nowType='O'; 
//已落子數(shù)量
int count=0;

//初始化棋局 
void initMap(char map[][col])
{
 int i,j;
 for(i=0;i<row;i++)
 {
  for(j=0;j<col;j++)
  {
   map[i][j]=m;
  }
 }
}

//打印當(dāng)前棋局 
void displayMap(char map[][col])
{
 int i,j;
 printf("   ");
 for(i=0;i<col;i++)
 {
  printf("%d ",i);
 }
 printf("\n  ");
 for(i=0;i<2*col+1;i++)
 {
  printf("*");
 }
 printf("\n");
 for(i=0;i<row;i++)
 {
  printf("%d  ",i);
  for(j=0;j<col;j++)
  {
   printf("%c ",map[i][j]);
  }
  printf("\n  ");
  for(j=0;j<2*col+1;j++)
  {
   printf("*");
  }
  printf("\n");
 }
}

//獲取用戶(hù)輸入
void getXY(int *i,int *j)
{
 while(1)
 {
  printf("落子方:%c\n",nowType);
  printf("落子位置(x,y)=");
  scanf("%d %d",i,j);
  if(*i<0||*i>=row||*j<0||*j>=col||map[*i][*j]!=m)
  {
   printf("輸入不合法!\n"); 
  } 
  else 
  {
   return;
  } 
 }
}

//交替下子
void exchangeTurn()
{
 if(nowType==o)
 {
  nowType=x;
 }
 else
 {
  nowType=o;
 }
}

//下子
void setPiece(char map[][col],int i,int j)
{
 map[i][j]=nowType;
 count++;
}

//判斷是否分出勝負(fù),分別從橫豎斜三個(gè)方向數(shù)數(shù) 
int isWin(char map[][col])
{
 int i,j;
 int flagR,flagC;
 for(i=0;i<row;i++)
 {
  flagR=0,flagC=0;
  for(j=0;j<col;j++)
  {
   if(map[i][j]==o)
   {
    flagR++; 
   }  
   else if(map[i][j]==x)
   {
    flagR--;
   }
   if(map[j][i]==o)
   {
    flagC++;
   }
   else if(map[j][i]==x)
   {
    flagC--;
   }
  } 
  if(flagR==col||flagC==col||flagR==(-col)||flagC==(-col))
  {
   return 1;
  }
 } 
 flagR=0,flagC=0;
 for(i=0,j=0;i<row&&j<col;i++,j++)
 {
  if(map[i][j]==o)
  {
   flagR++;
  }
  else if(map[i][j]==x)
  {
   flagR--;
  }
  if(map[i][col-j-1]==o)
  {
   flagC++;
  }
  else if(map[i][col-j-1]==x)
  {
   flagC--;
  }
 }
 if(flagR==col||flagC==col||flagR==(-col)||flagC==(-col))
 {
  return 1;
 }
 else 
 {
  return 0;
 }
}

//輸出勝方
void displayWinner()
{
 printf("%c方獲得勝利!\n",nowType); 
}

//給局面打分的基礎(chǔ)表(站位分) 
int score[3][3]={
 {4,2,4},
 {2,8,2},
 {4,2,4}
};
//引入自定義頭文件 
#include"person.h"
#include"computer.h"
 
int main()
{
 int gameType;
 printf("1.人機(jī)對(duì)戰(zhàn)\n其他.玩家對(duì)戰(zhàn)\n");
 scanf("%d",&gameType);
 if(gameType==1)
 {
  computer();
 }
 else
 {
  person();
 } 
 return 0;
}

代碼解析

1、 其實(shí)棋類(lèi)游戲設(shè)計(jì)最重要的就是模擬下棋的過(guò)程。
2、 我們知道井字棋是雙方交替下子,一方執(zhí)O,一方執(zhí)X。
3、 比如O先下,玩家下完子后,我們判斷一下此時(shí)他是否已經(jīng)獲勝(即是否出現(xiàn)橫或豎或兩斜線出現(xiàn)三子連珠的情況),沒(méi)有獲勝則判斷是否已經(jīng)將棋局下滿子了,還是沒(méi)有的話,輪到X的回合。再次執(zhí)行此步驟。
4、 了解了過(guò)程就自然好設(shè)計(jì)了。因?yàn)槠寰直容^簡(jiǎn)單,我們用一個(gè)二維字符數(shù)組即可存儲(chǔ)。落子位置用坐標(biāo)(x,y),通過(guò)玩家輸入即可進(jìn)行模擬。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言之字符串模糊查詢(xún)方法的實(shí)現(xiàn)

    C語(yǔ)言之字符串模糊查詢(xún)方法的實(shí)現(xiàn)

    本篇文章主要為大家介紹字符串模糊查詢(xún)的C語(yǔ)言程序編寫(xiě)方法,有需要的朋友可以參考下
    2015-07-07
  • c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)

    c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享的是一篇關(guān)于c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2021-10-10
  • c語(yǔ)言中缺省參數(shù)的類(lèi)型總結(jié)

    c語(yǔ)言中缺省參數(shù)的類(lèi)型總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于c語(yǔ)言中缺省參數(shù)的類(lèi)型總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-09-09
  • C++ 智能指針代碼解析

    C++ 智能指針代碼解析

    這篇文章主要介紹了c++ 智能指針基礎(chǔ)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下,希望能給你帶來(lái)幫助
    2021-10-10
  • C/C++判斷素?cái)?shù)的三種方法

    C/C++判斷素?cái)?shù)的三種方法

    這篇文章主要給大家介紹了C/C++判斷素?cái)?shù)的三種方法,常規(guī)的函數(shù)判斷法,埃氏篩法和歐拉篩法這三種方法,并通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • C語(yǔ)言通過(guò)棧實(shí)現(xiàn)小人走迷宮

    C語(yǔ)言通過(guò)棧實(shí)現(xiàn)小人走迷宮

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言通過(guò)棧實(shí)現(xiàn)小人走迷宮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C指針原理教程之AT&T匯編

    C指針原理教程之AT&T匯編

    AT&T 匯編是一種和intel匯編在語(yǔ)法上完全不同的匯編語(yǔ)言,為避免混淆intel語(yǔ)法,本文只介紹AT&T匯編,AT&T的第一個(gè)特點(diǎn)就是每個(gè)寄存器名前必須加‘%’,立即數(shù)前必須加‘$’
    2019-02-02
  • Qt使用Json的項(xiàng)目實(shí)踐

    Qt使用Json的項(xiàng)目實(shí)踐

    JSON是一種對(duì)源自Javascript的對(duì)象數(shù)據(jù)進(jìn)行編碼的格式,但現(xiàn)在被廣泛用作互聯(lián)網(wǎng)上的數(shù)據(jù)交換格式,本文主要介紹了Qt使用Json的項(xiàng)目實(shí)踐,詳細(xì)的介紹了主要使用的類(lèi)以及Json實(shí)戰(zhàn),感興趣的可以了解一下
    2023-09-09
  • 篩選法的C++實(shí)現(xiàn)

    篩選法的C++實(shí)現(xiàn)

    篩選法又稱(chēng)篩法,是求不超過(guò)自然數(shù)N(N>1)的所有質(zhì)數(shù)的一種方法。據(jù)說(shuō)是古希臘的埃拉托斯特尼(Eratosthenes,約公元前274~194年)發(fā)明的,又稱(chēng)埃拉托斯特尼篩子
    2013-10-10
  • C++中宏的使用問(wèn)題詳解

    C++中宏的使用問(wèn)題詳解

    宏替換是C/C++系列語(yǔ)言的技術(shù)特色,C/C++語(yǔ)言提供了強(qiáng)大的宏替換功能,源代碼在進(jìn)入編譯器之前,要先經(jīng)過(guò)一個(gè)稱(chēng)為“預(yù)處理器”的模塊,這個(gè)模塊將宏根據(jù)編譯參數(shù)和實(shí)際編碼進(jìn)行展開(kāi),展開(kāi)后的代碼才正式進(jìn)入編譯器,進(jìn)行詞法分析、語(yǔ)法分析等等。
    2016-05-05

最新評(píng)論